Fork me on GitHub

python天气爬取

python天气爬取 [原创]

获取天气信息

首先,我们需要寻找一个爬取目标,这里选用的是中国天气网
进入网站任意地区页面,就能查看这个地区天气信息

利用浏览器的开发者工具,我们可以抓取到一个Get请求,如下图:

通过分析我们可以很容易看出来,这个请求就是获取天气信息的请求
我们只需要分析这个101280801就行了,我们暂且把这个叫做城市id编号

获取城市id

那么如何根据城市名获取这个城市的id呢?
我们发现,上方有城市搜索框

随便输入一些文本,就可以抓取到另一个get请求,比如说这里搜索1,得到请求如下:

第一个搜索结果一定是最准确的一个,那么我们就可以根据这个来获取id了

最终代码

根据以上分析,我们就可以开始写代码了,这里我写了一个示例,完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests,re,json

def getCityId(cname):
c_url='http://toy1.weather.com.cn/search?cityname='+cname+'&callback=success_jsonpCallback'
req=requests.get(c_url)
req.encoding='utf-8'
html=req.text.replace('success_jsonpCallback(','')
html=html[:-1]
jsonw=json.loads(html)
return jsonw[0]['ref'][:9]

try:
city=getCityId(input('输入一个城市:'))
url='http://d1.weather.com.cn/weather_index/'+city+'.html'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4096.0 Safari/537.36',
'Referer':'http://www.weather.com.cn/weather/101280801.shtml',
}
req=requests.get(url,headers=headers)
req.encoding='utf-8'
html=req.text
rule = r'var cityDZ =(.*?);var alarmDZ ='
html = re.findall(rule, html)[0]
jsonw=json.loads(html)['weatherinfo']
res=jsonw['cityname']+jsonw['temp']+' - '+jsonw['tempn']+jsonw['weather']+jsonw['wd']+jsonw['ws']
print(res)
#上面获取城市天气状况
rule = r'var dataZS=(.*?);var fc='
html = re.findall(rule, req.text)[0]
jsonw=json.loads(html)['zs']
#下面获取天气各方面一些建议
print(jsonw['ac_des_s']+jsonw['cl_des_s']+jsonw['ct_des_s']+jsonw['gj_des_s']+jsonw['pl_des_s']+jsonw['ys_des_s']+jsonw['lk_des_s'])
except:
print('找不到这个城市')

这样,我们就可以获取到完整的天气信息了,当然这些并不是完整的信息,还有其他的Get请求,
比如说:根据ip获取城市,多日天气等等,这些可以自行进行扩展