Pythonはどこ今日で最も寒い場所を教えてくれ

クロール対象

この時間は、私たちの目標は、国の最も寒い上昇10都市を取ることです。

中国気象ネットワーク - まず、ターゲットのウェブサイトを開きます。

http://www.weather.com.cn/textFC/hb.shtml

 
画像

我々は、すべての都市で最低温度をクロールした後、10都市の最低温度を取得し、ヒストグラムを描きたいです。

準備

クロールにアプローチ - 少ないデータをクロールするので、「美しいスープおいしいスープ」を使用することを検討してください。

また、最終的なデータに基づいてヒストグラムを生成する必要が、あなたはリクエストをインストールする必要があり、BS4、html5lib、パンダ、matplotlibの、そうでない場合は、コンソールが文句を言うだろう、このようなライブラリーとしてseaborn。

注:一般的な爬虫類を解決するにはlxmlのを使用しますが、データを解析するので、使用html5libの方法は、多くのラベル「香港、マカオ、台湾」ページのソース中国の気象ネットワークが適切に閉じられていないがあるため。

 
 

クロールのアイデア

まず、私たちは国が北に分かれていることを確認することができ、北東、東、中央、南、北西、南西、香港、マカオ、台湾、表示気象データへの8つの領域。

# 一共8个区域,包含:华北、东北、华东、华中、华南、西北、西南、港澳台
# 华北
url_hb = 'http://www.weather.com.cn/textFC/hb.shtml'
# 东北
url_db = 'http://www.weather.com.cn/textFC/db.shtml'
# 华东
url_hd = 'http://www.weather.com.cn/textFC/hd.shtml'
# 华中
url_hz = 'http://www.weather.com.cn/textFC/hz.shtml'
# 华南
url_hn = 'http://www.weather.com.cn/textFC/hn.shtml'
# 西北
url_xb = 'http://www.weather.com.cn/textFC/xb.shtml'
# 西南
url_xn = 'http://www.weather.com.cn/textFC/xn.shtml'
# 港澳台【比较特殊】
url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'

グラフィックファイルに書き込まれた私たち最初の各領域の下に、すべての都市の気象データを取得する必要があり、その後、ソートデータが並べ替え、。

コードの実装

まず、すべての気象データの「中国北部で。」都市をクロール

 
 

それは、以下の規則に取得することができます。

すべての「クラス=」conMidtab「」シックスdiv要素は、北朝鮮、中国のすべての都市を保持して、今日の気象データは、今後数週間内に含まれます。

それぞれが「クラス=」conMidtab2「」divが気象情報の州を表しています。

以下の省市の気象データは、テーブルタグの下に含まれています。最初の3のtrタグから、それはすべての都市の気象データです。

 
接下来,循环全国 8 个区域的列表,获取所有城市的名称和温度数据。

その後、すべての都市や温度データの一覧を取得し、データは温度を配置し、「昇順」することができます。

最後に、データをヒストグラムに書かれている、あなたは、今日の最低気温10都市への非常に直感的見ることができます。

 

 

#!/usr/bin/env python
#encoding: utf-8

import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc("font",family="SimHei",size="10")  #用于解决不能显示中文的问题
plt.rcParams['axes.unicode_minus']=False #用于解决不能显示负号的问题

sns.set(style='whitegrid')
plt.rc("font",family="SimHei",size="10")

# 一共8个区域,包含:华北、东北、华东、华中、华南、西北、西南、港澳台
# 华北
url_hb = 'http://www.weather.com.cn/textFC/hb.shtml'
# 东北
url_db = 'http://www.weather.com.cn/textFC/db.shtml'
# 华东
url_hd = 'http://www.weather.com.cn/textFC/hd.shtml'
# 华中
url_hz = 'http://www.weather.com.cn/textFC/hz.shtml'
# 华南
url_hn = 'http://www.weather.com.cn/textFC/hn.shtml'
# 西北
url_xb = 'http://www.weather.com.cn/textFC/xb.shtml'
# 西南
url_xn = 'http://www.weather.com.cn/textFC/xn.shtml'
# 港澳台【比较特殊】
url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'

url_areas = [url_hb, url_db, url_hd, url_hz, url_hn, url_xb, url_xn, url_gat]

#打开chrome输入【chrome://version/】获取用户代理
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Referer': 'http://www.weather.com.cn/textFC/hb.shtml'
}

# 数据【城市+最低温度】列表
ALL_DATA = []

def parse_page(url):
    """
        解析一个区域:华北、东北、华东等
        :param url:
        :return:
    """
    response = requests.get(url, headers=HEADERS)
    # 1.获取页面的原始html数据
    text = response.content.decode('utf-8')
    # 注意:港澳台中香港的table标签没有正确的关闭,使用lxml解析器不能正确解析。需要使用html5lib【容错性强】去自动补全代码,然后进行解析
    soup = BeautifulSoup(text, 'html5lib')
    # 2.查找class='conMidtab'的div,获取所有一个地区下的所有城市天气数据
    #find只返回第一个匹配到的对象
    div_conMidtab = soup.find('div', class_='conMidtab')
    # 3.获取所有的table子Tag【天气信息都保存在table标签下面】
    #find_all返回所有匹配到的结果
    tables = div_conMidtab.find_all('table')
    # 4.遍历片区下面的省份
    for table in tables:
        # 4.1过滤掉表头的两个tr数据
        trs = table.find_all('tr')[2:]

        # 5.遍历省份下面的市区
        #enumerate用于将一个可遍历的数据对象(如列表、元组或字符串等)组合为一个索引序列,同时列出数据和数据下标
        for index, tr in enumerate(trs):
            tds = tr.find_all('td')
            # 5.1 城市名称【第 1 个td标签】
            # 注意:一个省份第一个城市取第 2 个td标签;其余城市取第 1 个td标签
            city_td = tds[1] if index == 0 else tds[0]
            #stripped_strings用来获取目标路径下所有的子孙非标签字符串,会自动去掉空白字符串,返回的是一个生成器
            city = list(city_td.stripped_strings)[0]
            # 5.2 最低气温【倒数第 2 个td标签】
            temp_low_td = tds[-2]
            temp_low = list(temp_low_td.stripped_strings)[0]
            ALL_DATA.append({"城市": city, "温度": int(temp_low)})

def spider():
    for index, url in enumerate(url_areas):
        print('开始爬取第{}个区域'.format(index + 1))
        parse_page(url)
        time.sleep(1)

def analysis_data():
    """
        分析爬下来的数据
        :return:
        """
    # 1.默认的排序方式是升序【通过最低气温进行排序】
    ALL_DATA.sort(key=lambda data: data['温度'])
    # 2.获取前面10条数据
    top_10 = ALL_DATA[:10]
    return top_10

def show_with_chart(top_10):
    """
        把最低的十个城市和温度生成柱状图
        :param top_10:
        :return:
        """
    # 1.获取城市列表
    # map接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上
    citys = list(map(lambda item: item['城市'], top_10))
    # 2.最低温度列表
    temp_lows = list(map(lambda item: item['温度'], top_10))
    print(citys,temp_lows)

    data=pd.DataFrame(top_10)
    sns.barplot(x='城市', y='温度', data=data)

    #3.生成图片并写入到文件中
    plt.savefig(r'd:\1.jpg')
    #在pycharm中显示图片
    plt.show()

if __name__ == '__main__':
    # 1.爬取数据
    spider()
    # 2.分析数据
    top_10 = analysis_data()
    print(top_10)
    # 3.使用seaborn生成柱状图
    show_with_chart(top_10)

 

おすすめ

転載: www.cnblogs.com/xiaohuhu/p/12119156.html