|
談及Pandas的read.xxx系列的函數(shù),大家的第一反應(yīng)會想到比較常用的pd.read_csv()和pd.read_excel(),大多數(shù)人估計沒用過pd.read_html()這個函數(shù)。 雖然它低調(diào),但功能非常強大,用于抓取Table表格型數(shù)據(jù)時,簡直是個神器。下面來詳細介紹一下。 大家逛網(wǎng)頁時,經(jīng)常會看到這樣一些數(shù)據(jù)表格,比如: 電影票房數(shù)據(jù)  世界大學(xué)排行榜數(shù)據(jù)  財經(jīng)數(shù)據(jù)  如果查看一下網(wǎng)頁的HTML結(jié)構(gòu)(Chrome瀏覽器F12),會發(fā)現(xiàn)它們有個共同的特點,不僅是表格,還是以Table結(jié)構(gòu)展示的表格數(shù)據(jù),大致的網(wǎng)頁結(jié)構(gòu)如下 <table class='...' id='...'> <thead> <tr> <th>...</th> </tr> </thead> <tbody> <tr> <td>...</td> </tr> <tr>...</tr> <tr>...</tr> ... <tr>...</tr> <tr>...</tr> </tbody> </table>
針對網(wǎng)頁結(jié)構(gòu)類似的表格類型數(shù)據(jù),pd.read_html()就派上了大用場了,它可以將網(wǎng)頁上的表格都抓取下來,并以DataFrame的形式裝在一個列表中返回。具體是這么個流程:  先介紹一下read_html的一些主要的參數(shù) read_htmlio :str or file-like
接收網(wǎng)址、文件、字符串。網(wǎng)址不接受https,嘗試去掉s后爬去 header:int or list-like or None
指定列標題所在的行 attrs : dict or None, optional
傳遞一個字典,用其中的屬性篩選出特定的表格
接下來以爬取新浪財經(jīng)的基金重倉股為例演示一下,URL為:http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p=1 這部分有6頁,點擊不同的頁數(shù)可以發(fā)現(xiàn),請求URL主要是p參數(shù)在變動,p=n代表了第n頁,所以一個for循環(huán)就可以遍歷所有網(wǎng)址啦。URL的變動規(guī)律了解之后,就可以愉快的爬數(shù)據(jù)了,上代碼 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)
 整個過程不需要用到正則表達式或者xpath等工具,短短的幾行代碼就可以將數(shù)據(jù)嗖嗖地爬下來了,是不是超級無敵方便?趕緊動手操作一波吧! 日后在爬一些小型數(shù)據(jù)時,只要遇到這種Table類型的表格,就可以直接祭出read_html這個神器啦,別人還在琢磨正則、xpath怎么寫的時候,你已經(jīng)把數(shù)據(jù)爬完了,想想就很舒服! Python中文社區(qū)作為一個去中心化的全球技術(shù)社區(qū),以成為全球20萬Python中文開發(fā)者的精神部落為愿景,目前覆蓋各大主流媒體和協(xié)作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業(yè)界知名公司和技術(shù)社區(qū)建立了廣泛的聯(lián)系,擁有來自十多個國家和地區(qū)數(shù)萬名登記會員,會員來自以工信部、清華大學(xué)、北京大學(xué)、北京郵電大學(xué)、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關(guān)、科研單位、金融機構(gòu)以及海內(nèi)外知名公司,全平臺近20萬開發(fā)者關(guān)注。
|