首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python爬虫】写一个爬取中国天气网的终端版天气预报爬虫

【Python爬虫】写一个爬取中国天气网的终端版天气预报爬虫

作者头像
树枝990
发布2020-08-19 09:37:33
2.4K0
发布2020-08-19 09:37:33
举报
文章被收录于专栏:拇指笔记拇指笔记

导语

前几篇文章介绍了爬取静态网站的主要方法。今天写一个小项目实践一下。本项目可以在终端窗口查询全国3400多个区县的当天天气信息和近七天天气信息。

实现效果

相关模块

  • pandas:读取城市ID文件
  • prettytable:输出ASCII风格的表格
  • bs4:解析网页
  • selenium:渲染网页以便爬取动态网页
  • 和其他几个内置库

实现原理

获取每个城市网页的url

中国天气网将不同城市的天气信息存储在了不同的网页中,这些网页的url遵循如下规律。

"http://www.weather.com.cn/weather/"+city_id+".shtml"

因此我们只需要获取各个城市的id就可以实现得到各个城市的url了。感谢万能的百度,我查到了全国3400多个区县的id。

为了方便查询,我将各个城市与其对应的id保存到了一个.xlsx文件中,需要的朋友可以后台回复"天气预报"获取。

只需要将这个xlsx文件转换为字典,就可以实现根据输入城市名获取城市id的功能。代码如下

city_id = pd.read_excel('city_id.xlsx')
dict_c = city_id.set_index('City_CN').T.to_dict('list')
city = input('输入查询地:')
test_id = dict_c[city]
test_id.append("".join(filter(str.isdigit, test_id[0])))
print('城市ID:',test_id[1],sep='')

爬取静态网站上的天气信息

近七日天气信息在一个静态网站上。通过观察,可以确定所有需要的信息都在标签<li class = "sky skyid lv">下。

通过find_all()方法获取所有这个标签下的信息。

html_dizhi = "http://www.weather.com.cn/weather/"+test_id[1]+".shtml"
html = urlopen(html_dizhi)
obj = bf(html.read(),'html.parser')
mes_links = obj.find_all("li", {"class": re.compile('sky skyid lv\d')})

进一步观察该标签下的信息,发现需要的信息分别存储在h1,p,i等标签下。

找到对应标签,获取近七天每天的信息。

for mes in mes_links:
    date.append(mes.h1.get_text())
    wter.append(mes.p.get_text())
    wd_g.append(mes.span.get_text())    
for i in range(7):
    wd_d.append(obj.select('.tem i')[i].get_text())
    wind.append(obj.select('.win i')[i].get_text())

爬取动态网站上的天气信息

在获取当日天气网站时我发现返回的当日天气信息是空标签。找了点资料后发现原来这个网站是一个动态网站,需要等待JS脚本加载。

爬取动态网页的方法有三种:

  1. 逆向回溯法
  2. 渲染动态网页法
  3. 模拟浏览器行为法

本文使用的是第三种方法,实现模拟浏览器行为的工具是Selenium。Selenium 简介:

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持市面上几乎所有的主流浏览器。

选择它的理由当然是因为简单, Selenium可以非常容易的爬取动态网页,并且搜索节点的方法与之前在静态网页中使用的方法一样。运用到爬虫中的思路是:

使用Selenium 渲染网页,解析渲染后的网页源码,或者直接通过Selenium 接口获取页面中的元素。

通过以下代码,我们就获得了某一城市的当日网站的HTML文件。

HTML1='http://www.weather.com.cn/weather1d/101050901.shtml'
driver=webdriver.Firefox()
driver.get(HTML1)
page=BeautifulSoup(driver.page_source,'html5lib')

获取到网页信息后,简单查看就可以找到包含今日天气信息的标签(<div class ='sk'>)

仍然通过爬取静态网页的方法获得其中的信息。

最后

文件获取:相关程序和城市id文件可以在公众号 拇指笔记 后台回复"天气预报"获取。

使用方法:在终端窗口运行程序,输入查询的区县名称(如:丰台、静安等)。

如果觉得本文还可以,还请各位点个在看。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 实现效果
  • 相关模块
  • 实现原理
    • 获取每个城市网页的url
      • 爬取静态网站上的天气信息
        • 爬取动态网站上的天气信息
        • 最后
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档