目录



1.网页分析

庚子年初,各种大事件不期而至,又赶上最近气温突变,所以写个爬虫来爬取下中国天气网,并通过图表反映气温最低的前20个城市。

中国天气网:​​http://www.weather.com.cn/textFC/hb.shtml​

打开后如下图:

【Python3 爬虫】U14_爬取中国天气网_柱状图

从图中可以看到所有城市按照地区划分了,并且每个城市都有最低气温和最高气温,通过chrome查看​​Elements​​,如下:

【Python3 爬虫】U14_爬取中国天气网_数据_02

从上图可以看到展示当天的数据,那么​​<div class='conMidtab'>..​​这个标签则没有​​style="display:none;"​​属性。

那么,具体的每一行数据又存在哪里呢?

【Python3 爬虫】U14_爬取中国天气网_柱状图_03

从上图可以看出,数据存储在​​<table>​​标签下的​​<tr>​​标签中,通过下图可以看到,​​tr​​标签下的​​td​​标签就可以找到每个城市的最低气温了`。

【Python3 爬虫】U14_爬取中国天气网_html_04

2.代码实现

实现以下代码需要安装的库:

pip install requests
pip install bs4
pip install html5lib
pip install pyecharts


 ​


具体代码如下:

# Author:Logan
# Date:2020/3/31 16:28
# IDE:PyCharm

import requests
from bs4 import BeautifulSoup
from pyecharts.charts import Line,Bar
import pyecharts.options as opts


DATA_TEMP = []

HEADERS = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
def parse_page(url):
response = requests.get(url, headers=HEADERS)
html_str = response.content.decode('utf-8')
# html5lib容错性比较高
soup = BeautifulSoup(html_str,'html5lib')
divs = soup.find('div',class_='conMidtab')
tables = divs.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for index,tr in enumerate(trs):
tds = tr.find_all('td')
# 城市获取
city_td = tds[0]
if index == 0:
city_td = tds[1]
city = list(city_td.stripped_strings)[0]

# 最低气温获取
temp_td = tds[-2]
min_temp = list(temp_td.stripped_strings)[0]
DATA_TEMP.append({"city":city,"min_temp":min_temp})
print({"city":city,"min_temp":min_temp})

def show_line_chart(data):
DATA_TEMP=data
DATA_TEMP.sort(key=lambda data: data['min_temp'])
show_data = DATA_TEMP[0:10] # 气温最低的前10个城市
cities = list(map(lambda x: x['city'], show_data))
min_temp = list(map(lambda x: x['min_temp'], show_data))


# 展示为折线图与柱状图
(
Bar(init_opts=opts.InitOpts(width="1000px", height="350px"))
.add_xaxis(cities)
.add_yaxis("最低气温", min_temp)
.set_global_opts(
title_opts=opts.TitleOpts(title="今日全国气温最低的前10个城市", subtitle="柱状图"),
yaxis_opts=opts.AxisOpts(name="城市"),
xaxis_opts=opts.AxisOpts(name="最低气温"),
)
.render("temperature_line_chart.html")
)


def main():
base_url = 'http://www.weather.com.cn/textFC/{}.shtml'
# 构造url
name_list = ['hb','db','hd','hz','hn','xb','xn','gat']
for name in name_list:
url = base_url.format(name)
parse_page(url)

# 分析数据
show_line_chart(DATA_TEMP)

if __name__ == '__main__':
main()


代码运行后,则生成了temperature_line_chart.html,在浏览器打开可以看到生成的柱状图如下。


【Python3 爬虫】U14_爬取中国天气网_chrome_05


作者:奔跑的金鱼