最簡單的爬蟲:用Pandas爬取表格數據
有一說一,咱得先承認,用Pandas爬取表格數據有一定的局限性。
它只適合抓取Table表格型數據,那咱們先看看什么樣的網頁滿足條件?
什么樣的網頁結構?
用瀏覽器打開網頁,F12查看其HTML的結構,會發現符合條件的網頁結構都有個共同的特點。
如果你發現HTML結構是下面這個Table格式的,那直接可以用Pandas上手。
<table class="..." id="...">
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>
<td>...</td>
</tr>
<tr>...</tr>
<tr>...</tr>
...
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
這個看着不直觀,打開一個北京地區空氣質量網站。
F12,左側是網頁中的質量指數表格,它的網頁結構完美符合了Table表格型數據網頁結構。
它就非常適合使用pandas來爬取。
pd.read_html()
Pandas提供read_html()
,to_html()
兩個函數用於讀寫html格式的文件。這兩個函數非常有用,一個輕松將DataFrame等復雜的數據結構轉換成HTML表格;另一個不用復雜爬蟲,簡單幾行代碼即可抓取Table表格型數據,簡直是個神器![1]
具體的pd.read_html()
參數,可以查看其官方文檔:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_html.html
下面直接拿剛才的網頁直接上手開大!
import pandas as pd
df = pd.read_html("http://www.air-level.com/air/beijing/", encoding='utf-8',header=0)[0]
這里只加了幾個參數,header
是指定列標題所在的行。加上導包,只需兩行代碼。
df.head()
對比結果,可以看到成功獲取了表格數據。
多個表格
上一個案例中,不知道有小伙伴注意到沒有
pd.read_html()[0]
對於pd.read_html()
獲取網頁結果后,還加了一個[0]。這是因為網頁上可能存在多個表格,這時候就需要靠列表的切片tables[x]
來指定獲取哪個表格。
比如還是剛才的網站,空氣質量排行榜網頁就明顯由兩個表格構成的。
這時候如果用pd.read_html()
來獲取右邊的表格,只需要稍微修改即可。
import pandas as pd
df = pd.read_html("http://www.air-level.com/rank", encoding='utf-8',header=0)[1]
對比之下,可以看到成功獲取到了網頁右側的表格。
以上就是用pd.read_html()
來簡單爬取靜態網頁。但是我們之所以使用Python,其實是為了提高效率。可是若僅僅一個網頁,鼠標選擇復制豈不是更簡單。所以Python操作最大的優點會體現在批量操作上。
批量爬取
下面給大家展示一下,如何用Pandas批量爬取網頁表格數據👇
以新浪財經機構持股匯總數據為例:
一共47頁,通過for循環構建47個網頁url,再用pd.read_html()
循環爬取。
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頁1738條數據都獲取到了。
通過以上的小案例,相信大家可以輕松掌握用Pandas批量爬取表格數據啦🚀