Python高級應用程序設計任務

1、主題式網絡爬蟲設計方案(15分)
1.主題式網絡爬蟲名稱html

  中國天氣網的數據爬取與分析網絡


2.主題式網絡爬蟲爬取的內容與數據特徵分析app

  爬取全國全部的城市白每天氣, 晚上天氣, 白天溫度, 晚上溫度, 日出時間, 日落時間, 平均溫度, 風力等級, 降水量, 平均溼度的信息並加以分析ide

 

3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)學習

  經過對整個網頁的爬取得到的數據進行費雷和分析,而後總結出全國各地各個地方的天氣狀況字體

 

2、主題頁面的結構特徵分析(15分)
1.主題頁面的結構特徵編碼

對中國全部地區共2919個數據進行爬取分析url


2.Htmls頁面解析spa


3.節點(標籤)查找方法與遍歷方法
(必要時畫出節點樹結構)設計

  根據F12中的數據查找到相應位置並requests.get(),再利用正則找到正確的數據並保存起來

 

3、網絡爬蟲程序設計(60分)
爬蟲程序主體要包括如下各部分,要附源代碼及較詳細註釋,並在每部分程序後面提供輸出結果的截圖。
1.數據爬取與採集

import requests
import re
import pandas as pd


def mainpage():
    """
    http://www.weather.com.cn/weather1d/101140210.shtml
    打開城市列表及對應的id以便進行url獲取
    "http://www.weather.com.cn/weather1d/" + 城市id + ".shtml"
    """
    with open('城市列表.txt', 'r', encoding='UTF-8') as f:
        sss = f.readlines()
    sss = sss[0]
    # 經過正則拿出城市的id以及城市名稱
    req = r'name’: ‘(.*?)’, ‘id’: ‘(.*?)’'
    re1 = re.findall(req, sss)
    # print(re1[0][1])
    # 逐個打開城市的天氣頁面獲取數據
    for n in range(len(sss)):
        url = "http://www.weather.com.cn/weather1d/" + re1[n][1] + ".shtml"
        # 獲取頁面
        url_html = requests.get(url)
        # 配置頁面編碼
        url_html.encoding = "utf-8"
        # print(url_html.text)
        # 獲取天氣信息
        re_weather = re.compile(r'<p\sclass="wea"\stitle=".*?">(.*?)</p>')
        re_weather_search = re_weather.findall(url_html.text)
        try:
            # 白每天氣
            daytime_weather = re_weather_search[0]
            # 黑夜天氣
            daynight_weather = re_weather_search[1]
        except:
            pass

        # <p class="tem"><span>3</span><em>°C</em></p>
        # 獲取溫度信息
        re_temperature = re.compile(r'<p\sclass="tem">\n<span>(.*?)</span><em>(.*?)</em>\n</p>')
        re_temperature_search = re_temperature.findall(url_html.text)
        try:
        # 白天溫度
            daytime_temperature = re_temperature_search[0][0] + re_temperature_search[0][1]
            # 黑夜溫度
            daynight_temperature = re_temperature_search[1][0] + re_temperature_search[1][1]
        except:
            pass

        # <p class ="sun sunUp"><i></i><span>日出 07:27</span></p>
        # 獲取太陽信息
        re_sun = re.compile(r'<p\sclass="sun\ssun.*?"><i></i>\n<span>.{3}(.*?)</span>\n</p>')
        re_sun_search = re_sun.findall(url_html.text)
        # 日出時間
        try:
            daytime_sunup = re_sun_search[0]
            # 日落時間
            daynight_sundown = re_sun_search[1]
        except:
            pass
        # 溫度,風力等級,降水量,溼度
        re_mul = re.compile(
            r'{"od21":".*?","od22":"(.*?)","od23":".*?","od24":".*?","od25":"(.*?)","od26":"(.*?)","od27":"(.*?)",'
            r'"od28":".*?"}')
        re_mul_search0 = re_mul.findall(url_html.text)

        # 把空值或者null替換成0
        re_mul_search = []
        for each in re_mul_search0:
            each = list(each)
            for z in each:
                if z == '' or z == "null":
                    q = each.index(z)
                    each.pop(q)
                    each.insert(q, 0)
            re_mul_search.append(each)

        sum0 = 0
        # 獲取當日的平均溫度
        for i in range(len(re_mul_search) - 1):
            sum0 = sum0 + int(re_mul_search[i][0])
        eval_temperature = sum0 / (len(re_mul_search) - 1)

        sum1 = 0
        # 獲取當日的平均風力等級
        for i in range(len(re_mul_search) - 1):
            sum1 = sum1 + int(re_mul_search[i][1])
        eval_wind = sum1 / (len(re_mul_search) - 1)

        sum2 = 0.0
        # 獲取當日的平均降水量
        for i in range(len(re_mul_search) - 1):
            sum2 = sum2 + float(re_mul_search[i][2])
        eval_water = sum2 / (len(re_mul_search) - 1)

        sum3 = 0.0
        # 獲取當日的平均溼度
        for i in range(len(re_mul_search) - 1):
            sum3 = sum3 + float(re_mul_search[i][3])
        eval_humidity = sum3 / (len(re_mul_search) - 1)

        city_list.append(re1[n][0])
        ever_city_list = []
        ever_city_list.append(daytime_weather)
        ever_city_list.append(daynight_weather)
        ever_city_list.append(daytime_temperature)
        ever_city_list.append(daynight_temperature)
        ever_city_list.append(daytime_sunup)
        ever_city_list.append(daynight_sundown)
        ever_city_list.append(round(eval_temperature, 1))
        ever_city_list.append(round(eval_wind, 1))
        ever_city_list.append(round(eval_water, 1))
        ever_city_list.append(round(eval_humidity, 1))
        totle_city_list.append(ever_city_list)

        # 設置表格
        pd.set_option('display.unicode.ambiguous_as_wide', True)
        pd.set_option('display.unicode.east_asian_width', True)
        columns_list = ["白每天氣", "晚上天氣", "白天溫度", "晚上溫度", "日出時間", "日落時間", "平均溫度", "風力等級", "降水量", "平均溼度"]
        df = pd.DataFrame(totle_city_list, index=city_list, columns=columns_list)
        df.name = "城市氣候總結"
        # 把表格打印出來
        df.to_excel('城市氣候總結.xlsx')

# 全部城市列表
city_list = []
# 每一個城市數據
totle_city_list = []

mainpage()

 


2.對數據進行清洗和處理

import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series
from pylab import mpl

# 指定默認字體:解決plot不能顯示中文問題
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決保存圖像是負號'-'顯示爲方塊的問題
mpl.rcParams['axes.unicode_minus'] = False
# 數據對齊
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 讀取爬到的數據
df = pd.read_excel(r'D:\pycharm\workspace\城市氣候總結.xlsx')
df.shape
print(df.head())
# 查看是否有重複值
print(df.duplicated())
# 數據去重
df.drop_duplicates(['title', 'username']).shape
# 查看數據的總體分佈
print(df.describe())

 

4.數據分析與可視化
(例如:數據柱形圖、直方圖、散點圖、盒圖、分佈圖、數據迴歸分析等)

 

# 能夠觀察此數據來選擇適合本身居住的城市
#
平均溼度前十的城市 print(df.sort_values('平均溼度',ascending=False).head(10)) # 降水量前十的城市 print(df.sort_values('降水量',ascending=False).head(10)) # 風力等級前十的城市 print(df.sort_values('風力等級',ascending=False).head(10))

 

 

# 瞭解這一天全國的白每天氣和晚上天氣的狀況
daytime_list = []
for val in df['白每天氣'].dropna():
    daytime_list.append(val)
daytime_series = Series(daytime_list).drop_duplicates()
print(daytime_series)
daynight_list = []
for val in df['晚上天氣'].dropna():
    daynight_list.append(val)
daynight_series = Series(daynight_list).drop_duplicates()
print(daynight_series)

# 觀察風力等級和溼度之間的聯繫
plt.scatter(df['風力等級'], df['平均溼度'])
plt.show()

 

 


5.數據持久化

# 把表格打印出來
df.to_excel('城市氣候總結.xlsx')

 

4、結論(10分)

1.通過對主題數據的分析與可視化,能夠獲得哪些結論?

  根據以上的信息能夠發現溼度高的城市基本位於河南地區,降水量大的地方大多數是山東地區,而風力大的地方都在臺灣。根據散點圖能夠觀察出大部分地區:風力等級1-2級,平均溼度40-100


2.對本次程序設計任務完成的狀況作一個簡單的小結。

  經過本次的做業我學到了不少的知識,發現這門課學的是真的有趣,也但願從此可以多多學習本課程。

相關文章
相關標籤/搜索