爬蟲小技巧
爬蟲小技巧
首先問一下大家都使用過哪些python爬蟲模組呢?相信大多數人會回覆requests或者scrapy吧,嗯我是說大多人。但是針對簡單的爬蟲我們還是習慣性的使用requests吧,或者升級版的requests_html,此時再使用scrapy,就有種殺雞焉用宰牛刀的意味了。
現在我們有個簡單的要求,去獲取該網頁http://www.air-level.com/air/beijing/的一個表格資料,然後儲存起來。
相信此時很多人應該拿起requests敲起來了吧。這裡由於程式碼比較簡單就說下思路。
首先,我們要成功訪問該網頁,然後解析網頁表格裡面的內容,然後儲存資料,這裡簡單我們就存csv好了。好了思路好了我們就可以寫自己程式碼了,如果對xpath解析資料不很熟悉,應該會稍微耗點時,人生苦短,對於這麼簡單的任務怎麼能浪費過多的時間呢?
經過調查我找到了應對這種靜態單頁面的更好的方法。。。
pandas模組
簡介
提到pandas更多聯想到也許是它的資料分析功能,但是在查它的api的時候我發現了這個方法
read_html:
下面是這個函式及其引數
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=', ', encoding=None, decimal='.', converters=None, na_values=None, keep_default_na=True, displayed_only=True)
安裝
pip3 install pandas
爬蟲程式碼
import pandas as pd df = pd.read_html("http://www.air-level.com/air/beijing/", encoding='utf-8',header=0)[0] results = df.T.to_dict().values() print(results)
然後我們看到輸出一個mapping對映型別的資料
dict_values([{'監測站': '北京天壇', 'AQI': 177, '空氣質量等級': '中度汙染', 'PM2.5': '134 μg/m3', 'PM10': '176 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京順義新城', 'AQI': 167, '空氣質量等級': '中度汙染', 'PM2.5': '127 μg/m3', 'PM10': '163 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京農展館', 'AQI': 155, '空氣質量等級': '中度汙染', 'PM2.5': '118 μg/m3', 'PM10': '170 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京奧體中心', 'AQI': 152, '空氣質量等級': '中度汙染', 'PM2.5': '116 μg/m3', 'PM10': '132 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京東四', 'AQI': 150, '空氣質量等級': '輕度汙染', 'PM2.5': '115 μg/m3', 'PM10': '145 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京海淀區萬柳', 'AQI': 142, '空氣質量等級': '輕度汙染', 'PM2.5': '109 μg/m3', 'PM10': '143 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京萬壽西宮', 'AQI': 142, '空氣質量等級': '輕度汙染', 'PM2.5': '109 μg/m3', 'PM10': '143 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京古城', 'AQI': 137, '空氣質量等級': '輕度汙染', 'PM2.5': '105 μg/m3', 'PM10': '120 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京官園', 'AQI': 137, '空氣質量等級': '輕度汙染', 'PM2.5': '105 μg/m3', 'PM10': '144 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京懷柔鎮', 'AQI': 121, '空氣質量等級': '輕度汙染', 'PM2.5': '92 μg/m3', 'PM10': '143 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京定陵', 'AQI': 114, '空氣質量等級': '輕度汙染', 'PM2.5': '86 μg/m3', 'PM10': '92 μg/m3', '首要汙染物': 'PM2.5'}, {'監測站': '北京昌平鎮', 'AQI': 104, '空氣質量等級': '輕度汙染', 'PM2.5': '78 μg/m3', 'PM10': '109 μg/m3', '首要汙染物': 'PM2.5'}])
程式碼很簡單但是實現的內容可不簡單,第一行匯入pandas包,
第二行的read_html核心功能實現是呼叫requests然後解析table標籤裡的每個td的資料
最後生成一個list物件裡面是dataframe物件。所以通過小標0獲取它的第一個dataframe資料,既然是dateframe我們就可以使用dataframe的方法了,
第三行首先做了個轉秩操作,然後轉為對映型別打印出來了。上面的程式碼為了演示其效果,下面我們對結果做一個儲存操作
存入csv
df = pd.read_html("http://www.air-level.com/air/beijing/", encoding='utf-8',header=0)[0] df.to_csv("tq.csv",index=False)
執行程式碼之後就生成了tq.csv了,開啟時候看正是我們要的資料。
讓我們對比一下這是網頁的資料:

這是我們儲存的csv資料

可以發現我們成功的獲取了網頁表格的資料。
需要注意的是,read_html只能解析靜態頁面。
怎麼樣,簡單不,趕緊動手試一試吧。