本帖最后由 ilikehassbian 于 2019-3-1 23:06 编辑
最近在论坛上看到了这个帖子【油价】萌新探索之四:第一个自制脚本爬取简单的HTML信息https://bbs.hassbian.com/thread-3360-1-1.html,寻思着也用这位大神的套路来套一下中国气象台,所以便开始自己琢磨,刚开始想直接抓网页数据,发现好像是引用了外部来的数据,所以没成功,只返回了空格,接下来我用浏览器开发者工具的network来抓了一下包,发现果然数据走了另外一条通道,网页只是引用数据,所以第一次没成功,但是我在network里发现了天气数据的地址,所以便改变了思路,改为从数据里用正则抓包,果然成功,所以便把我的第一个爬虫来给大家看看,后续有时间,我会再完善爬虫功能,毕竟我发现的这个api无限次数,还是气象台官方的,我会争取直接对接HASS,(此贴不断更新中)
下面爬虫
import requests
import re
self_city_code = '54511'
def get_html(url):
heads = {}
heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
req = requests.get(url, headers=heads)
req.encoding='utf-8'
html = req.text
return html
def get_weather(html):
temp = r'"temperature":(.+),"airpressure'
temperature = re.findall(temp, html)
sumray = r'"info":"(.+)","img'
sumraylist = re.findall(sumray, html)
hum = r'"humidity":(.+),"rain'
humidity = re.findall(hum, html)
ra = r'"rain":(.+),"rcomfort'
rain = re.findall(ra, html)
feel = r'"feelst":(.+)},"wind"'
feeltemp = re.findall(feel, html)
presure = r'"airpressure":(.+),"humidity"'
airpressure = re.findall(presure, html)
print(sumraylist, temperature, humidity, airpressure, rain, feeltemp,)
if __name__ == '__main__':
url = 'http://www.nmc.cn/f/rest/real/'+self_city_code+''
get_weather(get_html(url))
具体爬虫配置请参考:https://bbs.hassbian.com/thread-3360-1-1.html
self_city_code 是气象台站,需要自己查询,这里默认北京,举几个例子:北京:54511 上海:58367 其他的需要自己去查,
http://www.doc88.com/p-6631998333691.html 或者百度:气象台站号
顺便说一下,这个爬虫还处于原型期,self_city_code ,只可以输出:温度、湿度、降雨量、概况、体感温度、气压。只可以用command_line sensor,并且需要自己制作template sensor,但是等我后期完善后,就直接可以接入hass了,不需要command_line了,自己目前还在研究HASS的开发者文档,应该会于近期发布完整版本,到时候,这个爬虫就应该会具有空气质量,七天预报等功能了,可以作为彩云替代品,而且不用担心api次数,还免费
研究网站不易,这也是我的第一个爬虫,求大神指教如何不用command_line 对接hass,请大神轻拍哦。 |