天秀!Pandas還能用來寫爬蟲?

談及Pandas的read.xxx系列的函數,大家的第一反應會想到比較常用的pd.read_csv()和pd.read_excel(),大多數人估計沒用過pd.read_html()這個函數。

雖然它低調,但功能非常強大,用於抓取Table表格型數據時,簡直是個神器。下面來詳細介紹一下。

大家逛網頁時,經常會看到這樣一些數據表格,比如:

電影票房數據

天秀!Pandas還能用來寫爬蟲?

世界大學排行榜數據

天秀!Pandas還能用來寫爬蟲?

財經數據

天秀!Pandas還能用來寫爬蟲?

如果查看一下網頁的HTML結構(Chrome瀏覽器F12),會發現它們有個共同的特點,不僅是表格,還是以Table結構展示的表格數據,大致的網頁結構如下

<code><table>
<thead>

...


/<thead>
<tbody>

...

...
...
...
...
...
/<tbody>
/<table>

/<code>

針對網頁結構類似的表格類型數據,pd.read_html()就派上了大用場了,它可以將網頁上的表格都抓取下來,並以DataFrame的形式裝在一個列表中返回。具體是這麼個流程:

天秀!Pandas還能用來寫爬蟲?

先介紹一下read_html的一些主要的參數

read_html

  • io :str or file-like 接收網址、文件、字符串。網址不接受https,嘗試去掉s後爬去
  • header:int or list-like or None 指定列標題所在的行
  • attrs : dict or None, optional 傳遞一個字典,用其中的屬性篩選出特定的表格
  • parse_dates:bool 解析日期

接下來以爬取新浪財經的基金重倉股為例演示一下,URL為:http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p=1

這部分有6頁,點擊不同的頁數可以發現,請求URL主要是p參數在變動,p=n代表了第n頁,所以一個for循環就可以遍歷所有網址啦。URL的變動規律瞭解之後,就可以愉快的爬數據了,上代碼

<code>import pandas as pd
df = pd.DataFrame()
for i in range(6):
url = 'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p={page}'.format(page=i+1)
df = pd.concat([df,pd.read_html(url)[0]])
print("第{page}頁完成~".format(page=i+1))
df.to_csv('./data.csv', encoding='utf-8', index=0)

/<code>
天秀!Pandas還能用來寫爬蟲?

整個過程不需要用到正則表達式或者xpath等工具,短短的幾行代碼就可以將數據嗖嗖地爬下來了,是不是超級無敵方便?趕緊動手操作一波吧!

日後在爬一些小型數據時,只要遇到這種Table類型的表格,就可以直接祭出read_html這個神器啦,別人還在琢磨正則、xpath怎麼寫的時候,你已經把數據爬完了,想想就很舒服!



分享到:


相關文章: