Pandas也能爬蟲(chóng)弦叶,還如此簡(jiǎn)單例获!

歡迎關(guān)注J哥公眾號(hào)「菜J學(xué)Python」

眾所周知匾鸥,一般的爬蟲(chóng)套路無(wú)非是構(gòu)造請(qǐng)求京腥、解析網(wǎng)頁(yè)、提取要素敲街、存儲(chǔ)數(shù)據(jù)等步驟团搞。構(gòu)造請(qǐng)求主要用到requests庫(kù),提取要素用的比較多的有xpath多艇、bs4、css和re像吻。一個(gè)完整的爬蟲(chóng)峻黍,代碼量少則幾十行,多則幾百行拨匆,對(duì)于新手來(lái)說(shuō)學(xué)習(xí)成本還是比較高的姆涩。

那么,有沒(méi)有什么方法只用幾行代碼就能爬下所需數(shù)據(jù)呢惭每?答案是pandas骨饿。J哥自從知道了這個(gè)神器亏栈,嘗試了多個(gè)網(wǎng)頁(yè)數(shù)據(jù)爬取,屢戰(zhàn)屢勝宏赘,簡(jiǎn)直不能再舒服绒北!這家伙也太適合初學(xué)爬蟲(chóng)的小伙伴玩耍了吧!

本文目錄如下:


本文目錄

一察署、定義

pandas中的pd.read_html()這個(gè)函數(shù)闷游,功能非常強(qiáng)大,可以輕松實(shí)現(xiàn)抓取Table表格型數(shù)據(jù)贴汪。無(wú)需掌握正則表達(dá)式或者xpath等工具脐往,短短的幾行代碼就可以將網(wǎng)頁(yè)數(shù)據(jù)抓取下來(lái)。

二扳埂、原理

1.Table表格型數(shù)據(jù)網(wǎng)頁(yè)結(jié)構(gòu)

pandas適合抓取Table表格型數(shù)據(jù)业簿,那么咱們首先得知道什么樣的網(wǎng)頁(yè)具有Table表格型數(shù)據(jù)結(jié)構(gòu)(有html基礎(chǔ)的大佬可自行跳過(guò)這一part)。

我們先來(lái)看個(gè)簡(jiǎn)單的例子阳懂。(快捷鍵F12可快速查看網(wǎng)頁(yè)的HTML結(jié)構(gòu))


留學(xué)者指南網(wǎng)

從以上網(wǎng)站可以看出辖源,數(shù)據(jù)存儲(chǔ)在一個(gè)table表格中,thread為表頭希太,tbody為表格數(shù)據(jù)克饶,tbody中的一個(gè)tr對(duì)應(yīng)表中的一行,一個(gè)td對(duì)應(yīng)一個(gè)表中元素誊辉。

我們?cè)賮?lái)看一個(gè)例子:


新浪財(cái)經(jīng)網(wǎng)

也許你已經(jīng)發(fā)現(xiàn)了規(guī)律矾湃,以Table結(jié)構(gòu)展示的表格數(shù)據(jù),大致的網(wǎng)頁(yè)結(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)頁(yè)具有以上結(jié)構(gòu)堕澄,你就可以嘗試用pandas抓取數(shù)據(jù)邀跃。

2.pandas請(qǐng)求表格數(shù)據(jù)流程

流程圖

針對(duì)網(wǎng)頁(yè)結(jié)構(gòu)類(lèi)似的表格類(lèi)型數(shù)據(jù),pd.read_html可以將網(wǎng)頁(yè)上的表格數(shù)據(jù)都抓取下來(lái)蛙紫,并以DataFrame的形式裝在一個(gè)list中返回拍屑。

3.pd.read_html語(yǔ)法及參數(shù)

(1)基本語(yǔ)法

pandas.read_html(io,match='.+',flavor=None,header=None,index_col=None,skiprows=None, attrs=None,
parse_dates=False, thousands=', ', encoding=None, decimal='.', converters=None, na_values=None, 
keep_default_na=True, displayed_only=True)

(2)主要參數(shù)

參數(shù) 釋義
io 接收網(wǎng)址、文件坑傅、字符串
parse_dates 解析日期
flavor 解析器
header 標(biāo)題行
skiprows 跳過(guò)的行屬性僵驰,比如 attrs = {'id': 'table'}


三、實(shí)戰(zhàn)

案例1:抓取世界大學(xué)排名(1頁(yè)數(shù)據(jù))

import pandas as pd 
import csv
url1 = 'http://www.compassedu.hk/qs'
df1 = pd.read_html(url1)[0]  #0表示網(wǎng)頁(yè)中的第一個(gè)Table
df1.to_csv('世界大學(xué)綜合排名.csv',index=0)

沒(méi)錯(cuò)唁毒,5行代碼蒜茴,幾秒鐘就搞定,我們來(lái)預(yù)覽下爬取到的數(shù)據(jù):


案例2:抓取新浪財(cái)經(jīng)基金重倉(cāng)股數(shù)據(jù)(6頁(yè)數(shù)據(jù))

import pandas as pd
import csv
df2 = pd.DataFrame()
for i in range(6):
    url2 = 'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p={page}'.format(page=i+1)
    df2 = pd.concat([df2,pd.read_html(url2)[0]])
    print('第{page}頁(yè)抓取完成'.format(page = i + 1))
df2.to_csv('./新浪財(cái)經(jīng)數(shù)據(jù).csv',encoding='utf-8',index=0)

沒(méi)錯(cuò)浆西,8行代碼搞定粉私,還是那么簡(jiǎn)單。如果對(duì)翻頁(yè)爬蟲(chóng)不理解近零,可查看公眾號(hào)「菜J學(xué)Python」歷史原創(chuàng)文章「實(shí)戰(zhàn)|手把手教你用Python爬蟲(chóng)(附詳細(xì)源碼)」诺核,如果對(duì)DataFrame合并不理解抄肖,可查看公眾號(hào)歷史原創(chuàng)文章「基礎(chǔ)|Pandas常用知識(shí)點(diǎn)匯總(四)」。

我們來(lái)預(yù)覽下爬取到的數(shù)據(jù):


案例3:抓取證監(jiān)會(huì)披露的IPO數(shù)據(jù)(217頁(yè)數(shù)據(jù))

 import pandas as pd
 from pandas import DataFrame
 import csv
 import time
 start = time.time() #程序計(jì)時(shí)
 df3 = DataFrame(data=None,columns=['公司名稱(chēng)','披露日期','上市地和板塊','披露類(lèi)型','查看PDF資料']) #添加列名
 for i in range(1,218):  
     url3 ='http://eid.csrc.gov.cn/ipo/infoDisplay.action?pageNo=%s&temp=&temp1=&blockType=byTime'%str(i)
     df3_1 = pd.read_html(url3,encoding='utf-8')[2]  #必須加utf-8窖杀,否則亂碼
     df3_2 = df3_1.iloc[1:len(df3_1)-1,0:-1]  #過(guò)濾掉最后一行和最后一列(NaN列)
     df3_2.columns=['公司名稱(chēng)','披露日期','上市地和板塊','披露類(lèi)型','查看PDF資料'] #新的df添加列名
     df3 = pd.concat([df3,df3_2])  #數(shù)據(jù)合并
     print('第{page}頁(yè)抓取完成'.format(page=i))
df3.to_csv('./上市公司IPO信息.csv', encoding='utf-8',index=0) #保存數(shù)據(jù)到csv文件
end = time.time()
print ('共抓取',len(df3),'家公司,' + '用時(shí)',round((end-start)/60,2),'分鐘')

這里注意要對(duì)抓下來(lái)的Table數(shù)據(jù)進(jìn)行過(guò)濾漓摩,主要用到iloc方法,詳情可查看公眾號(hào)往期原創(chuàng)文章「基礎(chǔ)|Pandas常用知識(shí)點(diǎn)匯總(三)」陈瘦。另外幌甘,我還加了個(gè)程序計(jì)時(shí),方便查看爬取速度痊项。

爬蟲(chóng)進(jìn)度

2分14秒爬下217頁(yè)4334條數(shù)據(jù)锅风,相當(dāng)nice了。我們來(lái)預(yù)覽下爬取到的數(shù)據(jù):


需要注意的是鞍泉,并不是所有表格都可以用pd.read_html爬取皱埠,有的網(wǎng)站表面上看起來(lái)是表格,但在網(wǎng)頁(yè)源代碼中不是table格式咖驮,而是list列表格式边器。這種表格則不適用read_html爬取,得用其他的方法托修,比如selenium忘巧。

更多精彩內(nèi)容,歡迎關(guān)注J哥微信公眾號(hào)「菜J學(xué)Python」睦刃。

歡迎掃碼關(guān)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砚嘴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涩拙,更是在濱河造成了極大的恐慌际长,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴泥,死亡現(xiàn)場(chǎng)離奇詭異工育,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搓彻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)如绸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人好唯,你說(shuō)我怎么就攤上這事竭沫。” “怎么了骑篙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)森书。 經(jīng)常有香客問(wèn)我靶端,道長(zhǎng)谎势,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任杨名,我火速辦了婚禮脏榆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台谍。我一直安慰自己须喂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布趁蕊。 她就那樣靜靜地躺著坞生,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掷伙。 梳的紋絲不亂的頭發(fā)上是己,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音任柜,去河邊找鬼卒废。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宙地,可吹牛的內(nèi)容都是我干的摔认。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宅粥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼参袱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粹胯,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蓖柔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后风纠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體况鸣,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年竹观,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镐捧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臭增,死狀恐怖懂酱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情誊抛,我是刑警寧澤列牺,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拗窃,受9級(jí)特大地震影響瞎领,放射性物質(zhì)發(fā)生泄漏泌辫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一九默、第九天 我趴在偏房一處隱蔽的房頂上張望震放。 院中可真熱鬧,春花似錦驼修、人聲如沸殿遂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墨礁。三九已至,卻和暖如春觅丰,著一層夾襖步出監(jiān)牢的瞬間饵溅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工妇萄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜕企,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓冠句,卻偏偏與公主長(zhǎng)得像轻掩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懦底,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348