最簡單的爬蟲:用 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