‘’’
爬取天气案例
需求:爬取近7天的天气(日期, 天气, 温度, 风向风力, 空气质量)
url: https://tianqi.2345.com/today-51463.htm(乌鲁木齐近7天的天气预报)
(查看网页源码:查找:今天,在源码上找到了,所以上面的url就是今天的目标url)
步骤:
1)获取整个网页源码
2)获取url数据
3)在ul数据里面找li数据
4)在li数据提取 :日期, 天气, 温度, 风向风力, 空气质量
5)保存到CSV文件里
‘’’
import requests
import re
import csv
url = 'https://tianqi.2345.com/today-51463.htm'
# headers = {
# 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
# }
#发请求,获取响应
res = requests.get(url)
# 给定编码,以解析成功
res.encoding = 'utf-8'
html = res.text
# print(html),打印一下,看看是不是我想要的网页内容
#用re.match方法,把内容这一块缩小
result = re.match(r'.*(<div class="seven-day">.*?</div>).*', html, re.S)
# print(result)
ul = result.group(1)
# print(ul)
lis = re.findall(r'<a.*?>.*?</a>', ul, re.S)
# print(lis[0]),打印一下,看看成功了没有
obj = re.compile(r'.*?<em>(.*?)</em>.*?<i>(.*?)</i>.*?"tem-show">(.*?)</span>.*?<span.*?>(.*?)</span>.*?<span.*?>(.*?)</span>.*?', re.S)
# 创建空列表来存储数据
data = []
#用循环来遍历列表元素,再通过re.compile来提取想要的数据
for i in lis:
r = obj.search(i)
data.append((r.group(1), r.group(2), r.group(3), r.group(4), r.group(5)))
#写入csv文件
with open('weather_2345.csv', 'w', encoding='utf-8', newline='') as f:
# 创建写入对象
writer = csv.writer(f)
# 写入表头
writer.writerow(["日期", "天气", "温度", "风向风力", "空气质量"])
writer.writerows(data)
总结一下用正则爬的步骤:
1)先用 re.match方法,把数据缩小到一小块(其中用到括号()这分组,所以要带上group(1)取值.
2)再用 re.findall方法,求出一连串的数据,保存在列表中
3)最后用 re.compile方法,用循环从列表中取出数据通过 re.compile方法 取出所要的数据
最后附上(weather_2345.csv文件内容)
日期,天气,温度,风向风力,空气质量
03/27,多云转小雨,3~10°,东南风4级,优
03/28,多云转晴,1~8°,北风2级,优
03/29,晴转小雨,0~11°,北风2级,优
03/30,大雪转晴,-3~4°,西北风2级,优
03/31,晴,-4~8°,北风2级,优
04/01,晴,-4~12°,东南风3级,优
04/02,阴,2~17°,东风3级,优
04/03,阴转晴,2~15°,西北风2级,优