爬蟲三步走:
- 發(fā)送請求獲取網(wǎng)頁HTML
- 解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
- 下載或保存數(shù)據(jù)
現(xiàn)有的資料基本上都是每一步用一個庫惫周。
大白學(xué)習(xí)爬蟲第一步時钥勋,用得最多的庫還是requests,第二步時會用BeautifulSoup庫科阎。
現(xiàn)在requests作者出一個新的庫:requests-html述吸,它可以幫你用一個庫,完成爬蟲的第一步與第二步锣笨,使得寫代碼與運行也簡便與快捷多了蝌矛。
requests-html只支持Python 3.6及更新的版本,所以使用老版本的Python的同學(xué)需要更新一下Python版本了错英。
安裝:
pip install requests-html
使用
requests-html庫核心是學(xué)習(xí)其HTML類
第一步:獲取網(wǎng)頁HTML:
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.reibang.com")
#第一步:獲取網(wǎng)頁HTML:
print(r.html.html)
#打印出簡書的HTML網(wǎng)頁代碼
第二步:解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
links和 absolute_links兩個屬性分別返回HTML對象所包含的所有鏈接和絕對鏈接(均不包含錨點)入撒。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.reibang.com")
#第一步:獲取網(wǎng)頁HTML:
#print(r.html.html)
#打印出簡書的HTML網(wǎng)頁代碼
#第二步:解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
#返回的數(shù)據(jù)是一個set集合
print("links返回的數(shù)據(jù)類型:"+ str(type(r.html.links)))
for html in r.html.links:
print(html)
print("-" * 30)
print("absolute_links返回的數(shù)據(jù)類型:"+ str(type(r.html.absolute_links)))
for html in r.html.links:
print(html)
以下是打印結(jié)果:
links返回的數(shù)據(jù)類型:<class 'set'>
http://www.reibang.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
/p/e3e0734f2d52
/p/c22ed25a7094#comments
/u/c0b66cf61400
http://www.reibang.com/p/a37929ad1994?utm_medium=index-banner&utm_source=desktop
http://218.242.124.22:8081/businessCheck/verifKey.do?showType=extShow&serial=9031000020171107081457000002158769-SAIC_SHOW_310000-20171115131223587837&signData=MEQCIADWZ5aTcBeER5SOVp0ly+ElvKnwtjczum6Gi6wZ7/wWAiB9MAPM22hp947ZaBobux5PDkd0lfqoCOkVV7zjCYME6g==
/p/c22ed25a7094
/u/530f5d6d4108
/sign_up
/mobile/club
absolute_links返回的數(shù)據(jù)類型:<class 'set'>
http://www.reibang.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
http://www.reibang.com/p/5d6f22ebacd2#comments
http://www.reibang.com/mobile/club
獲取元素
request-html支持CSS選擇器語法來選取HTML元素。
CSS選擇器語法椭岩,它需要使用HTML的find函數(shù)茅逮,該函數(shù)有5個參數(shù),作用如下:
- selector判哥,要用的CSS選擇器献雅;
- clean,布爾值塌计,如果為真會忽略HTML中style和script標(biāo)簽造成的影響(原文是sanitize惩琉,大概這么理解);
- containing,如果設(shè)置該屬性夺荒,會返回包含該屬性文本的標(biāo)簽瞒渠;
- first,布爾值技扼,如果為真會返回第一個元素伍玖,否則會返回滿足條件的元素列表;
- _encoding剿吻,編碼格式窍箍。
以下一行代碼就可以獲取元素,取其text屬性就可以得到元素的內(nèi)容丽旅,過程中少了加載BeautifulSoup庫椰棘,寫代碼也更方便了。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.reibang.com")
#獲取首頁span元素的內(nèi)容:首頁
print(r.html.find("span.menu-text",first=True).text)
#打娱稀:首頁
處理JavaScript
有些網(wǎng)站是使用JavaScript渲染的邪狞,這樣的網(wǎng)站爬取到的結(jié)果只有一堆JS代碼,這樣的網(wǎng)站requests-html也可以處理茅撞,關(guān)鍵一步就是在HTML結(jié)果上調(diào)用一下render函數(shù)帆卓,它會在用戶目錄(默認(rèn)是 ~/.pyppeteer/)中下載一個chromium巨朦,然后用它來執(zhí)行JS代碼。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('http://python-requests.org/')
r.html.render()
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
[W:pyppeteer.chromium_downloader] chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\xxxx\.pyppeteer\local-chromium\571375
r.html.search('Python 2 will retire in only {months} months!')['months']
'<time>25</time>'
render函數(shù)還有一些參數(shù)剑令,順便介紹一下(這些參數(shù)有的還有默認(rèn)值糊啡,直接看源代碼方法參數(shù)列表即可):
retries: 加載頁面失敗的次數(shù)
- script: 頁面上需要執(zhí)行的JS腳本(可選)
- wait: 加載頁面錢的等待時間(秒),防止超時(可選)
- scrolldown: 頁面向下滾動的次數(shù)
- sleep: 在頁面初次渲染之后的等待時間
- reload: 如果為假吁津,那么頁面不會從瀏覽器中加載棚蓄,而是從內(nèi)存中加載
- keep_page: 如果為真,允許你用 r.html.page訪問頁面
PS: 這個庫更似是將2個庫合為一個庫來使用碍脏,不管怎樣梭依,它給我們節(jié)省了時間,加快了代碼運行速度潮酒,甚是好用。