眾所周知匾鸥,一般的爬蟲(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))
從以上網(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è)例子:
也許你已經(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í),方便查看爬取速度痊项。
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」睦刃。