最簡單的爬蟲:用 Pandas 爬取表格數據
大家好,我是小五🚀
最簡單的爬蟲:用 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 批量爬取表格數據啦🚀
參考資料
[1]
Python 讀財: 天秀!Pandas 還能用來寫爬蟲?
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ViCwtCdtUe5FgqrOK7X7VQ