天天看點

一個爬蟲小技巧

爬蟲小技巧

首先問一下大家都使用過哪些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)           
https://pandas.pydata.org/

**

安裝

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隻能解析靜态頁面。

怎麼樣,簡單不,趕緊動手試一試吧。

同步來源:微信公衆号python學習開發

部落格園:

http://www.cnblogs.com/c-x-a