天氣后報網——資料爬取
一、爬取資料
1.確定爬蟲要獲取的資料
2016年-2020年全國363個城市每天的天氣情況(城市名、日期、天氣狀況、氣溫、風力風向)
2.爬取的網站
天氣后報網(http://www.tianqihoubao.com/lishi)
3.要使用的技術
(網路庫lrequests)、(分析庫lxml、BeautifulSoup)、(存盤csv)、(多執行緒queue)
4.分析待抓取資料的網站
1)打開天氣后報網(http://www.tianqihoubao.com/lishi),獲取每個城市的超鏈接,在網頁中右擊->檢查->Ctrl+Shift+C+點擊北京

發現<div >標簽下的<dd>標簽下的a標簽href屬性中包含了相關城市的鏈接,點擊該鏈接

分析url:http://www.tianqihoubao.com+a標簽的href屬性,故可使用map()方法和lamdba函式構造每個城市的url
1 city_urls = html.xpath("//div[@class='citychk']//dd//a/@href") 2 city_urls = list(map(lambda url: "http://www.tianqihoubao.com"+url, city_urls))
點擊2016年1月北京天氣,觀察并分析url


可以在城市url的基礎上使用雙重for回圈構造詳情頁面的url:http://www.tianqihoubao.com/listhi/beijing/month/+年份+月份+.html
1 for url_city in url_citys: 2 url = url_city.replace('.html', '/month/{}{:0>2d}.html') 3 for year in range(2016,2021): 4 for month in range(1, 13): 5 details_url=url.format(year,month)
2)分析詳情頁面以(http://www.tianqihoubao.com/lishi/beijing/month/201601.html)為例
在網頁中右擊->檢查->Ctrl+Shift+C+點擊2016年01月01日

從第二個<tr>標簽開始,<tr>標簽下4個<td>標簽中的資訊分別為日期、天氣狀況、氣溫、風力風向
由于獲取的字串中前、后、中間都有空白字符,故使用join()方法拼接字串
1 trs = soup.find_all("tr")[1:] 2 for tr in trs: 3 tds = tr.find_all("td") 4 data = https://www.cnblogs.com/chyhoo/p/''.join(list(tds[0].stripped_strings)[0].split()) 5 state = ''.join(list(tds[1].stripped_strings)[0].split()) 6 temp = ''.join(list(tds[2].stripped_strings)[0].split()) 7 wind = ''.join(list(tds[3].stripped_strings)[0].split())
使用<h2>中的文本作為csv表名和城市名

1 # 城市名 2 city = list(soup.find('div',attrs={"id":"s-calder","class":"box"}).stripped_strings)[0] 3 city_name = ''.join(re.findall(r'[^0-9]',city))[:-9] # 使用正則運算式除去數字的目的是防止月份的干擾
1 # csv表的路徑 2 path = "D:\\2016-2020全國地級市天氣(月)\\"+city[:-4]+'.csv'
5.爬蟲程式:
1)爬取資料.py 普通的爬蟲程式(以城市位單位,最侄訓得363張csv表) 雖然設定了隨機請求頭和延時,但是由于需要發送21780次url請求,還是很容易造成([WinError 10054] 遠程主機強迫關閉了一個現有的連接)錯誤,導致程式退出,因此提供了改進的版本(多執行緒爬蟲)
2)爬取資料多執行緒.py 多執行緒爬蟲程式(以月份為單位,最侄訓得21780張csv表)
優點: 雖然無法避免[WinError 10054]錯誤,但是即使發生了,也只是會退出那一個執行緒,而不會導致整個程式的退出,而且在效率上是上面的六倍左右
缺點: 發生錯誤的執行緒將無法獲取該執行緒內url的資料,造成資料缺失,因此提供了(查找缺失資料并重構url.py),查找出有缺失資料的城市,并且重構城市url,可以將print(lack_data_url)出的串列回傳(爬取資料多執行緒.py),最侄訓得完整的資料,
二、資料整合
1、資料整合(城市).py 將以月份為單位的21780張csv表整合成以城市為單位的363張csv表
2、資料整合(大匯總).py 將以城市為單位的363張csv表匯總到1張csv表中(2016-2020全國地級市天氣大匯總.zip,由于檔案超過25Mb,故只能將其壓縮)
以上所有代碼皆可在本人github賬號上下載: https://github.com/chyhoo/2016-2020Chinese-Weather-Analysis
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270623.html
標籤:Python
上一篇:odoo中欄位列舉
