基本思路
- 查看和分析天气网网页规律
- 获取城市名称(包括中文名和拼音)
- 按城市/年/月,获取历史天气数据
- 将数据保存至csv
分析网页规律
点进某城市、某年某月,以北京2019年12月为例,链接为:
http://lishi.tianqi.com/beijing/201912.html
可以发现网页规律为:
http://lishi.tianqi.com/城市名拼音/年月.html
对应的url拼接的代码为:
for c in city:
for y in year:
for m in month:
url = 'http://lishi.tianqi.com/' + c + '/20' + y + m + '.html'
年和月可以自己定义列表,但是城市名拼音需要从网站获取,所以,进入下一步。
获取城市名称
打开天气网历史天气首页,摁F12进行html分析,发现:
为此,准备两个政策表达式,用于后续分析:
find_city = re.compile(r'<a href="(.*?)/index.html"')
find_name = re.compile(r'历史天气">(.*?)</a>')
然后,根据上述式子,来分析html的内容,代码片段如下:
for item in soup.find_all('ul', class_="table_list"):
data = []
for each_city in item.find_all('li'):
city_info = str(each_city)
one_city = re.findall(find_city, city_info)
one_name = re.findall(find_name, city_info)
if len(one_city) > 0:
data.extend(one_city)
data.extend(one_name)
获取天气数据
以北京市2019年12月为例,打开网页摁F12,发现有用的信息都整齐排列着呢:
同样,准备正则表达式:
find_date = re.compile(r'<div>(.*?)</div>')
find_high = re.compile(r'<div style="width: 100px">(\d*)</div>')
find_wind = re.compile(r'<div style="width:200px;">(.*?)</div>')
爬取数据的代码,请看【完整代码】。
保存csv数据
一开始,尝试保存xls,但是数据太多,超出了xls的范围,所以临时学了下怎么保存csv。代码请看下文。
完整代码
from bs4 import BeautifulSoup
import re
import urllib.request, urllib.error
import time
import pandas as pd
year = ['11', '12', '13', '14', '15', '16', '17', '18', '19']
month = ['01', '02', &