Python3 爬虫U11_爬取中国天气网

Posted 奔跑的金鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 爬虫U11_爬取中国天气网相关的知识,希望对你有一定的参考价值。

1.网页分析

庚子年初,各种大事件不期而至,又赶上最近气温突变,所以写个爬虫来爬取下中国天气网,并通过图表反映气温最低的前20个城市。
中国天气网:http://www.weather.com.cn/textFC/hb.shtml
打开后如下图:

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

从上图可以看到展示当天的数据,那么<div class=\'conMidtab\'>..这个标签则没有style="display:none;"属性。
那么,具体的每一行数据又存在哪里呢?

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

2.代码实现

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

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

官方文档(pyecharts1.7.x)https://gallery.pyecharts.org/#/README

具体代码如下:

# 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 爬虫U11_爬取中国天气网的主要内容,如果未能解决你的问题,请参考以下文章

Python3爬虫用Python实现发送天气预报邮件

python爬虫爬取天气数据并图形化显示

爬取中国天气网的天气预报,可视化展示看着就是爽python爬虫入门进阶(06)

爬取中国天气网的天气预报,可视化展示看着就是爽python爬虫入门进阶(06)

python爬虫-15-使用python爬取中国天气,然后将最低温排序进行绘图展示

21天打造分布式爬虫-中国天气网实战