python爬蟲新庫:requests-html,一個(gè)庫頂2個(gè)用

爬蟲三步走:

  1. 發(fā)送請(qǐng)求獲取網(wǎng)頁HTML
  2. 解釋網(wǎng)頁HTML,得到數(shù)據(jù)或連接
  3. 下載或保存數(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)行速度,甚是好用。

大白python.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容