最簡(jiǎn)單的爬蟲:用Pandas爬取表格數(shù)據(jù)

有一說(shuō)一,咱得先承認(rèn),用Pandas爬取表格數(shù)據(jù)有一定的局限性。
它只適合抓取Table表格型數(shù)據(jù),那咱們先看看什么樣的網(wǎng)頁(yè)滿足條件?
什么樣的網(wǎng)頁(yè)結(jié)構(gòu)?
用瀏覽器打開(kāi)網(wǎng)頁(yè),F(xiàn)12查看其HTML的結(jié)構(gòu),會(huì)發(fā)現(xiàn)符合條件的網(wǎng)頁(yè)結(jié)構(gòu)都有個(gè)共同的特點(diǎn)。
如果你發(fā)現(xiàn)HTML結(jié)構(gòu)是下面這個(gè)Table格式的,那直接可以用Pandas上手。
"..."?id="...">
?????
?????
?????...
?????
?????
?????
????????
????????????...
????????
????????...
????????...
????????...
????????...
????????...
????
這個(gè)看著不直觀,打開(kāi)一個(gè)北京地區(qū)空氣質(zhì)量網(wǎng)站。
F12,左側(cè)是網(wǎng)頁(yè)中的質(zhì)量指數(shù)表格,它的網(wǎng)頁(yè)結(jié)構(gòu)完美符合了Table表格型數(shù)據(jù)網(wǎng)頁(yè)結(jié)構(gòu)。

它就非常適合使用pandas來(lái)爬取。
pd.read_html()
Pandas提供read_html(),to_html()兩個(gè)函數(shù)用于讀寫html格式的文件。這兩個(gè)函數(shù)非常有用,一個(gè)輕松將DataFrame等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成HTML表格;另一個(gè)不用復(fù)雜爬蟲,簡(jiǎn)單幾行代碼即可抓取Table表格型數(shù)據(jù),簡(jiǎn)直是個(gè)神器![1]
具體的pd.read_html()參數(shù),可以查看其官方文檔:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_html.html
下面直接拿剛才的網(wǎng)頁(yè)直接上手開(kāi)大!
import?pandas?as?pd
df?=?pd.read_html("http://www.air-level.com/air/beijing/",?encoding='utf-8',header=0)[0]
這里只加了幾個(gè)參數(shù),header是指定列標(biāo)題所在的行。加上導(dǎo)包,只需兩行代碼。
df.head()

對(duì)比結(jié)果,可以看到成功獲取了表格數(shù)據(jù)。

多個(gè)表格
上一個(gè)案例中,不知道有小伙伴注意到?jīng)]有
pd.read_html()[0]
對(duì)于pd.read_html()獲取網(wǎng)頁(yè)結(jié)果后,還加了一個(gè)[0]。這是因?yàn)榫W(wǎng)頁(yè)上可能存在多個(gè)表格,這時(shí)候就需要靠列表的切片tables[x]來(lái)指定獲取哪個(gè)表格。
比如還是剛才的網(wǎng)站,空氣質(zhì)量排行榜網(wǎng)頁(yè)就明顯由兩個(gè)表格構(gòu)成的。

這時(shí)候如果用pd.read_html()來(lái)獲取右邊的表格,只需要稍微修改即可。
import?pandas?as?pd
df?=?pd.read_html("http://www.air-level.com/rank",?encoding='utf-8',header=0)[1]
對(duì)比之下,可以看到成功獲取到了網(wǎng)頁(yè)右側(cè)的表格。

以上就是用pd.read_html()來(lái)簡(jiǎn)單爬取靜態(tài)網(wǎng)頁(yè)。但是我們之所以使用Python,其實(shí)是為了提高效率??墒侨魞H僅一個(gè)網(wǎng)頁(yè),鼠標(biāo)選擇復(fù)制豈不是更簡(jiǎn)單。所以Python操作最大的優(yōu)點(diǎn)會(huì)體現(xiàn)在批量操作上。
批量爬取
下面給大家展示一下,如何用Pandas批量爬取網(wǎng)頁(yè)表格數(shù)據(jù)??
以新浪財(cái)經(jīng)機(jī)構(gòu)持股匯總數(shù)據(jù)為例:

一共47頁(yè),通過(guò)for循環(huán)構(gòu)建47個(gè)網(wǎng)頁(yè)url,再用pd.read_html()循環(huán)爬取。
df?=?pd.DataFrame()
for?i?in?range(1,?48):
????url?=?f'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p={i}'
????df?=?pd.concat([df,?pd.read_html(url)[0]])?#?爬取+合并DataFrame
還是幾行代碼,輕松解決。

一共47頁(yè)1738條數(shù)據(jù)都獲取到了。

通過(guò)以上的小案例,相信大家可以輕松掌握用Pandas批量爬取表格數(shù)據(jù)啦??
參考資料
Python讀財(cái): 天秀!Pandas還能用來(lái)寫爬蟲?
點(diǎn)擊“閱讀原文”了解知識(shí)星球