目錄
摘 要 1
一、 設(shè)計目的 2
二、 設(shè)計任務(wù)內(nèi)容 3
三、 常用爬蟲框架比較 3
四、網(wǎng)絡(luò)爬蟲程序總體設(shè)計 3
四、 網(wǎng)絡(luò)爬蟲程序詳細設(shè)計 4
4.1設(shè)計環(huán)境和目標分析 4
4.2爬蟲運行流程分析 5
爬蟲基本流程 5
發(fā)起請求 5
獲取響應(yīng)內(nèi)容 5
解析數(shù)據(jù) 5
保存數(shù)據(jù) 5
Request和Response 5
Request 5
Response 5
請求方式 5
GET 5
POST 5
URL 6
請求體 6
4.3控制模塊詳細設(shè)計 6
v = [] 8
v = [] 9
六、調(diào)試與測試 11
七、心得體會 12
參考文獻 13
在本爬蟲程序中共有三個模塊:
1.爬蟲調(diào)度端:啟動爬蟲,停止爬蟲,監(jiān)視爬蟲的運行情況
2.爬蟲模塊:包含三個小模塊,URL管理器,網(wǎng)頁下載器,網(wǎng)頁解析器。
(1)URL管理器:對需要爬取的URL和已經(jīng)爬取過的URL進行管理,可以從URL管理器中取出一個帶爬取的URL,傳遞給網(wǎng)頁下載器。
(2)網(wǎng)頁下載器:網(wǎng)頁下載器將URL指定的網(wǎng)頁下載下來,存儲成一個字符串,傳遞給網(wǎng)頁解析器。
(3)網(wǎng)頁解析器:網(wǎng)頁解析器解析傳遞的字符串,解析器不僅可以解析出需要爬取的數(shù)據(jù),而且還可以解析出每一個網(wǎng)頁只想其他網(wǎng)頁的URL,這些URL被解析出來會補充進URL管理器
3、數(shù)據(jù)輸出模塊:存儲爬取的數(shù)據(jù)
四、網(wǎng)絡(luò)爬蟲程序詳細設(shè)計
4.1設(shè)計環(huán)境和目標分析
設(shè)計環(huán)境
IDE:pycharm
Python版本:python3
目標分析
1、初始URL:www.tianqihoubao.com/aqi 先通過url獲取到網(wǎng)頁。
2、數(shù)據(jù)格式
3、頁面編碼:UTF—8
4.2爬蟲運行流程分析
爬蟲基本流程
發(fā)起請求
通過HTTP庫向目標服務(wù)器發(fā)送Request,Request內(nèi)可以包含額外的headers信息。
獲取響應(yīng)內(nèi)容
如果服務(wù)器正常響應(yīng),會返回Response, 里面包含的就是該頁面的內(nèi)容。
解析數(shù)據(jù)
內(nèi)容或許是HTML,可以用正則表達式、網(wǎng)頁解析庫進行解析。
或許是Json,可以直接轉(zhuǎn)換為Json對象解析。
保存數(shù)據(jù)
可以存儲為文本,也可以保存至數(shù)據(jù)庫,或其他特定類型文件。
Request和Response
Request
主機向服務(wù)器發(fā)送數(shù)據(jù)請求時的過程叫做HTTP Request
Response
服務(wù)器向主機返回數(shù)據(jù)的過程叫做HTTP Response
Request中包含的內(nèi)容
請求方式
常用的有GET,POST兩種類型。
GET
這種請求方式的參數(shù)都包含在網(wǎng)址里面。
POST
這種請求方式的參數(shù)包含在請求體中的form data中。相對安全。
URL
請求的網(wǎng)絡(luò)鏈接。
請求頭
包含請求時的頭部信息。如:User-Agent、Host、Cookies等。
User-Agent
指定瀏覽器。
請求體
GET請求下一般情況請求體中不會包含重要信息。
POST請求中包含重要信息。
Response中包含的內(nèi)容
響應(yīng)狀態(tài)
Status Code:200
即狀態(tài)碼,一般200表示響應(yīng)成功。
響應(yīng)頭
Response Headers
內(nèi)容類型,內(nèi)容長度,服務(wù)器信息,設(shè)置Cookie等。
響應(yīng)體
請求資源的內(nèi)容,如網(wǎng)頁源代碼,二進制數(shù)據(jù)等。
4.3控制模塊詳細設(shè)計
爬取代碼文章來源:http://www.zghlxwxcb.cn/news/detail-476550.html
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
for i in range(len(citys)):
time.sleep(5)
for j in range(1, 13):
time.sleep(5)
# 請求2018年各月份的數(shù)據(jù)頁面
url = 'http://www.tianqihoubao.com/aqi/' + citys[i] + '-2018' + str("%02d" % j) + '.html'
# 有請求頭(鍵值對形式表示請求頭)
response = requests.get(url=url, headers=headers)
# html字符串創(chuàng)建BeautifulSoup對象
soup = BeautifulSoup(response.text, 'html.parser')
tr = soup.find_all('tr')
for k in tr[1:]:
td = k.find_all('td')
# 日期
Date = td[0].get_text().strip()
# 質(zhì)量等級
Quality_grade = td[1].get_text().strip()
# AQI指數(shù)
AQI = td[2].get_text().strip()
# 當天AQI排名
AQI_rank = td[3].get_text().strip()
# PM2.5
PM = td[4].get_text()
# 數(shù)據(jù)存儲
filename = 'air_' + citys[i] + '_2018.csv'
with open(filename, 'a+', encoding='utf-8-sig') as f:
f.write(Date + ',' + Quality_grade + ',' + AQI + ',' + AQI_rank + ',' + PM + '\n')
分析代碼
import numpy as np
import pandas as pd
from pyecharts import Line
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
for i in range(4):
filename = 'air_' + citys[i] + '_2018.csv'
df = pd.read_csv(filename, header=None, names=["Date", "Quality_grade", "AQI", "AQI_rank", "PM"])
dom = df[['Date', 'AQI']]
list1 = []
for j in dom['Date']:
time = j.split('-')[1]
list1.append(time)
df['month'] = list1
month_message = df.groupby(['month'])
month_com = month_message['AQI'].agg(['mean'])
month_com.reset_index(inplace=True)
month_com_last = month_com.sort_index()
v1 = np.array(month_com_last['mean'])
v1 = ["{}".format(int(i)) for i in v1]
v.append(v1)
attr = ["{}".format(str(i) + '月') for i in range(1, 12)]
line = Line("2018年北上廣深A(yù)QI全年走勢圖", title_pos='center', title_top='0', width=800, height=400)
line.add("北京", attr, v[0], line_color='red', legend_top='8%')
line.add("上海", attr, v[1], line_color='purple', legend_top='8%')
line.add("廣州", attr, v[2], line_color='blue', legend_top='8%')
line.add("深圳", attr, v[3], line_color='orange', legend_top='8%')
line.render("2018年北上廣深A(yù)QI全年走勢圖.html")
import numpy as np
import pandas as pd
from pyecharts import Pie, Grid
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
attrs = []
for i in range(4):
filename = 'air_' + citys[i] + '_2018.csv'
df = pd.read_csv(filename, header=None, names=["Date", "Quality_grade", "AQI", "AQI_rank", "PM"])
rank_message = df.groupby(['Quality_grade'])
rank_com = rank_message['Quality_grade'].agg(['count'])
rank_com.reset_index(inplace=True)
rank_com_last = rank_com.sort_values('count', ascending=False)
attr = rank_com_last['Quality_grade']
attr = np.array(rank_com_last['Quality_grade'])
attrs.append(attr)
v1 = rank_com_last['count']
v1 = np.array(rank_com_last['count'])
v.append(v1)
pie1 = Pie("北京", title_pos="28%", title_top="24%")
pie1.add("", attrs[0], v[0], radius=[25, 40], center=[30, 27], legend_pos="27%", legend_top="51%", legend_orient="horizontal",)
pie2 = Pie("上海", title_pos="58%", title_top="24%")
pie2.add("", attrs[1], v[1], radius=[25, 40], center=[60, 27], is_label_show=False, is_legend_show=False)
pie3 = Pie("廣州", title_pos='28%', title_top='77%')
pie3.add("", attrs[2], v[2], radius=[25, 40], center=[30, 80], is_label_show=False, is_legend_show=False)
pie4 = Pie("深圳", title_pos='58%', title_top='77%')
pie4.add("", attrs[3], v[3], radius=[25, 40], center=[60, 80], is_label_show=False, is_legend_show=False)
grid = Grid("2018年北上廣深全年空氣質(zhì)量情況", width=1200)
grid.add(pie1)
grid.add(pie2)
grid.add(pie3)
grid.add(pie4)
grid.render('2018年北上廣深全年空氣質(zhì)量情況.html')
文章來源地址http://www.zghlxwxcb.cn/news/detail-476550.html
到了這里,關(guān)于基于Python的網(wǎng)絡(luò)爬蟲爬取天氣數(shù)據(jù)可視化分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!