‘’’
爬取天气案例
需求:爬取近7天的天气(日期, 天气, 温度, 风向风力, 空气质量)
url: https://tianqi.2345.com/today-51463.htm(乌鲁木齐近7天的天气预报)
(查看网页源码:查找:今天,在源码上找到了,所以上面的url就是今天的目标url)
步骤:
1)获取整个网页源码
2)获取url数据
3)在ul数据里面找li数据
4)在li数据提取 :日期, 天气, 温度, 风向风力, 空气质量
5)保存到CSV文件里
‘’’
import requestsimport reimport csvurl = '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级,优
