python爬虫之爬取天气预报

在这篇博文,我们练习了利用beautifulsoup爬取了中国天气预报(http://www.weather.com.cn/textFC/gat.shtml),让我们一起学习一下吧~

python爬虫之爬取中国天气预报

  • 1.爬取步骤
  • 2.获取网页源代码
    1. 分析天气爬取规律
  • 4 保存文件
  • 5 完整爬取中国天气预报

1.爬取步骤

1.确认需求和目标url
2.获取网页源代码 (第一页为尝试)
3.分析网页爬取规律 (第一页为尝试,关键)
4.保存到csv文件

1''' 2需求: 31.爬取全国所有的城市名称以及对应的气温 42.保存所有的城市名称以及对应的气温到为csv文件 5 6目标url: 71.华北地区: http://www.weather.com.cn/textFC/hb.shtml 82.东北地区:http://www.weather.com.cn/textFC/db.shtml 93.华东地区:http://www.weather.com.cn/textFC/hd.shtml 104.华中地区:http://www.weather.com.cn/textFC/hz.shtml 115.华南地区:http://www.weather.com.cn/textFC/hn.shtml 126.西北地区:http://www.weather.com.cn/textFC/xb.shtml 137.西南地区:http://www.weather.com.cn/textFC/xn.shtml 148.港澳台地区:http://www.weather.com.cn/textFC/gat.shtml 15规律: 'http://www.weather.com.cn/textFC/' + dq_name + '.shtml' 其中,dq_name = [hb,db,hd,hz,hn,xb,xn,gat] 16''' 17 18

2.获取网页源代码

1# 2.获取网页源代码 (第一页为尝试) 2import requests 3def get_source(url): 4 response = requests.get(url) 5 response.encoding = 'utf-8' 6 return response.text 7## 测试 8if __name__ == '__main__': 9 url = 'http://www.weather.com.cn/textFC/hb.shtml' 10 source = get_source(url) 11 print(source) 12 13

3. 分析天气爬取规律

(1)确认分析的顺序
在这里插入图片描述
(2)确认整体表格存放位置,即北京、天津、河北、山西、内蒙古所有信息存放的表格
在这里插入图片描述

(3)确认小表格存放的元素,即北京、天津、河北、山西、内蒙古各自存放的位置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由此,我们知道,每个地区的天气信息是分别存储在 table内容
下面,我们继续分析每个地区的具体天气信息存放地址:
在这里插入图片描述
在这里插入图片描述
由此,我们就可以确认代码该如何写了

1# 3.分析天气爬取规律 (第一页为尝试,关键) 2from bs4 import BeautifulSoup 3def get_info(source): 4 # 解决网页乱码,添加'html5lib',而不是lxml 5 soup = BeautifulSoup(source, 'html5lib') # pip install html5lib 6 # 1.进入整体表格 7 conMidtab = soup.find('div', class_='conMidtab') 8 # 2.进入子表格 9 tables = conMidtab.find_all('table') 10 # 3.进入每个子表格收集天气信息 11 info = [] 12 for table in tables: 13 # (1)过滤前两个(城市和时间) 14 trs = table.find_all('tr')[2:] # tr存储了每个城市的天气信息 15 # enumerate 返回2个值第一个是下标 第二个下标所对应的元素 16 # (2)进入每个城市(每一行),判断是否是省会 17 for index,tr in enumerate(trs): 18 tds = tr.find_all('td') # td存储每个城市天气信息的每个具体项目 19 # 城市名字判断:因为对于每个省份的第一行的第一列为省名,对应不了省会。爬取会出错,因而要判断修改 20 city_td = tds[0] # 城市 21 if index == 0: # index==0,代表的是第一个tr,第一个城市 22 city_td = tds[1] # 省会 23 # (3)获取每个城市的具体天气项目 24 city = list(city_td.stripped_strings)[0] # 城市名字 25 # 该城市最高气温 26 temp_high_td = tds[-5] 27 temp_high = list(temp_high_td.stripped_strings)[0] 28 # 该城市最低气温 29 temp_low_td = tds[-2] 30 temp_low = list(temp_low_td.stripped_strings)[0] 31 # print('城市:', city, '最高气温:', temp_high,'最低气温:',temp_low) 32 item = city,temp_high,temp_low 33 info.append(item) 34 return info # 存储在info内部 35 36## 测试 37if __name__ == '__main__': 38 url = 'http://www.weather.com.cn/textFC/hb.shtml' 39 source = get_source(url) 40 info = get_info(source) 41 print(info) 42 43

得到结果如下:
在这里插入图片描述

4 保存文件

1# 4.保存到csv文件 2import csv 3def save_weather(info): 4 with open('weatherinfo.csv','w',encoding='UTF-8',newline='') as f: 5 filenames = ['city','temp_high','temp_low'] 6 writer = csv.DictWriter(f,fieldnames=filenames) 7 writer.writeheader() # 写入表头 8 for each_city in info: 9 each_city = list(each_city) 10 dict_info = dict(zip(filenames,each_city)) 11 writer.writerow(dict_info) 12 13 14## 测试 15if __name__ == '__main__': 16 url = 'http://www.weather.com.cn/textFC/hb.shtml' 17 source = get_source(url) 18 info = get_info(source) 19 save_weather(info) 20 21

5 完整爬取中国天气预报

1# 5.整个函数 2def main(): 3 info_list = [] 4 dq_names = ['hb', 'db', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat'] 5 for dq_name in dq_names: 6 url = 'http://www.weather.com.cn/textFC/' + dq_name + '.shtml' 7 source = get_source(url) 8 info = get_info(source) 9 info_list += info 10 save_weather(info_list) 11 12if __name__ == '__main__': 13 main() 14 15

代码交流 2021