爬虫爬取全国所有城市最低气温"/>
html5lib解析器使用案例——python爬虫爬取全国所有城市最低气温
需求:爬取中国天气网全国所有城市的温度(最低气温)形如[{‘city’:‘北京’, ‘temp’:’-3’}]
,并保存到csv文件中
首先进行页面分析
目标网站示例(华北地区部分):.shtml
经分析,
- 每个页面的整个表格部分的数据在一个class="conMidtab"的<div>标签中,
- 每个省或直辖市的数据在该<div>标签的一个<table>标签中,
- 每个<\table>标签中存在多个tr标签,前两个tr标签表示表头,不是我们需要的数据,从第三个tr标签开始,每个* tr标签表示一个城市的数据。
- 将tr标签中的文本数据全部取出,形成一个列表,经分析发现,城市名称总是在第一个位置,最低温总是在倒数第二个位置。用索引的方式将其取出并储存。
- 港澳台页面的数据比较特殊。输出后发现该部分数据出现混乱。经过查看该页面的源码,发现该页面的源码中标签不完整,只有一半标签。于是选择使用"html5lib"解析器。该解析器速度慢些,但是容错能力更强,可以将缺失的标签自动补全。可以有效解决该问题。
查看网页源码:
港澳台页面的数据的源码中,<table>标签只有开始,没有结束的</table>
虽然在下方的Element中看是有的:
但是这里的源码是网页渲染出来的,并不是真实的源码。
import requests
import csv
from bs4 import BeautifulSoup# 华北地区页面的url
url = '.shtml'# 定义获取网页源码函数
def get_Source(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'}response = requests.get(url, headers=headers)return response.content.decode('utf-8')# 获取东北、华中、华南、华东其他地区的url
def get_Urls(source):soup = BeautifulSoup(source, 'lxml')tags = soup.select('.lq_contentboxTab2')[0].select('a')url_list = []for a in tags:url_list.append('/' + a['href'])return url_list# 解析数据
def get_data(source):data_List = []# 使用html5lib解析器,该解析器容错能力更强soup = BeautifulSoup(source, 'html5lib')tags = soup.find('div', class_='conMidtab').find_all('table')for tag in tags:trs = tag.select('tr')for tr in trs[2:]:# print(tr)city = list(tr.stripped_strings)[0]temp = list(tr.stripped_strings)[-2]weather_dict = {}weather_dict['city'] = cityweather_dict['temp'] = tempdata_List.append(weather_dict)return data_List# 存储数据
def writeData(data_List):with open('weatherdata.csv', 'w', encoding='utf-8', newline='') as f:writer = csv.DictWriter(f, fieldnames=['city', 'temp'])writer.writeheader()for each in data_List:writer.writerow(each)def main():html = get_Source(url)urls = get_Urls(html)# print(urls)result = []for u in urls:Html = get_Source(u)result += get_data(Html)writeData(result)if __name__ == '__main__':main()
程序运行结果文件:
更多推荐
html5lib解析器使用案例——python爬虫爬取全国所有城市最低气温
发布评论