最簡單的爬蟲:用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批量爬取表格數據啦🚀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM