爬蟲三步走:
- 發(fā)送請(qǐng)求獲取網(wǎng)頁HTML
- 解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
- 下載或保存數(shù)據(jù)
現(xiàn)有的資料基本上都是每一步用一個(gè)庫。
大白學(xué)習(xí)爬蟲第一步時(shí),用得最多的庫還是requests,第二步時(shí)會(huì)用BeautifulSoup庫。
現(xiàn)在requests作者出一個(gè)新的庫:requests-html,它可以幫你用一個(gè)庫,完成爬蟲的第一步與第二步,使得寫代碼與運(yùn)行也簡(jiǎn)便與快捷多了。
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.itdecent.cn")
#第一步:獲取網(wǎng)頁HTML:
print(r.html.html)
#打印出簡(jiǎn)書的HTML網(wǎng)頁代碼
第二步:解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
links和 absolute_links兩個(gè)屬性分別返回HTML對(duì)象所包含的所有鏈接和絕對(duì)鏈接(均不包含錨點(diǎn))。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.itdecent.cn")
#第一步:獲取網(wǎng)頁HTML:
#print(r.html.html)
#打印出簡(jiǎn)書的HTML網(wǎng)頁代碼
#第二步:解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
#返回的數(shù)據(jù)是一個(gè)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.itdecent.cn/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
/p/e3e0734f2d52
/p/c22ed25a7094#comments
/u/c0b66cf61400
http://www.itdecent.cn/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.itdecent.cn/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
http://www.itdecent.cn/p/5d6f22ebacd2#comments
http://www.itdecent.cn/mobile/club
獲取元素
request-html支持CSS選擇器語法來選取HTML元素。
CSS選擇器語法,它需要使用HTML的find函數(shù),該函數(shù)有5個(gè)參數(shù),作用如下:
- selector,要用的CSS選擇器;
- clean,布爾值,如果為真會(huì)忽略HTML中style和script標(biāo)簽造成的影響(原文是sanitize,大概這么理解);
- containing,如果設(shè)置該屬性,會(huì)返回包含該屬性文本的標(biāo)簽;
- first,布爾值,如果為真會(huì)返回第一個(gè)元素,否則會(huì)返回滿足條件的元素列表;
- _encoding,編碼格式。
以下一行代碼就可以獲取元素,取其text屬性就可以得到元素的內(nèi)容,過程中少了加載BeautifulSoup庫,寫代碼也更方便了。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.itdecent.cn")
#獲取首頁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ù),它會(huì)在用戶目錄(默認(rèn)是 ~/.pyppeteer/)中下載一個(gè)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: 加載頁面錢的等待時(shí)間(秒),防止超時(shí)(可選)
- scrolldown: 頁面向下滾動(dòng)的次數(shù)
- sleep: 在頁面初次渲染之后的等待時(shí)間
- reload: 如果為假,那么頁面不會(huì)從瀏覽器中加載,而是從內(nèi)存中加載
- keep_page: 如果為真,允許你用 r.html.page訪問頁面
PS: 這個(gè)庫更似是將2個(gè)庫合為一個(gè)庫來使用,不管怎樣,它給我們節(jié)省了時(shí)間,加快了代碼運(yùn)行速度,甚是好用。
