|
如果大家對(duì) Python 爬蟲有所了解的話,想必你應(yīng)該聽說(shuō)過 Selenium 這個(gè)庫(kù),這實(shí)際上是一個(gè)自動(dòng)化測(cè)試工具,現(xiàn)在已經(jīng)被廣泛用于網(wǎng)絡(luò)爬蟲中來(lái)應(yīng)對(duì) JavaScript 渲染的頁(yè)面的抓取。 但 Selenium 用的時(shí)候有個(gè)麻煩事,就是環(huán)境的相關(guān)配置,得安裝好相關(guān)瀏覽器,比如 Chrome、Firefox 等等,然后還要到官方網(wǎng)站去下載對(duì)應(yīng)的驅(qū)動(dòng),最重要的還需要安裝對(duì)應(yīng)的 Python Selenium 庫(kù),確實(shí)是不是很方便,另外如果要做大規(guī)模部署的話,環(huán)境配置的一些問題也是個(gè)頭疼的事情。 那么本節(jié)就介紹另一個(gè)類似的替代品,叫做 Pyppeteer。注意,是叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 開發(fā)的一個(gè)工具,有了它我們可以通過 JavaScript 來(lái)控制 Chrome 瀏覽器的一些操作,當(dāng)然也可以用作網(wǎng)絡(luò)爬蟲上,其 API 極其完善,功能非常強(qiáng)大。而 Pyppeteer 又是什么呢?它實(shí)際上是 Puppeteer 的 Python 版本的實(shí)現(xiàn),但他不是 Google 開發(fā)的,是一位來(lái)自于日本的工程師依據(jù) Puppeteer 的一些功能開發(fā)出來(lái)的非官方版本。 在 Pyppetter 中,實(shí)際上它背后也是有一個(gè)類似 Chrome 瀏覽器的 Chromium 瀏覽器在執(zhí)行一些動(dòng)作進(jìn)行網(wǎng)頁(yè)渲染,首先說(shuō)下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。
總的來(lái)說(shuō),兩款瀏覽器的內(nèi)核是一樣的,實(shí)現(xiàn)方式也是一樣的,可以認(rèn)為是開發(fā)版和正式版的區(qū)別,功能上基本是沒有太大區(qū)別的。 從入門到全棧,學(xué)習(xí)過程中有不懂的可以加入我的python零基礎(chǔ)系統(tǒng)學(xué)習(xí)交流秋秋qun:784758,214,與你分享Python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)Python,和學(xué)習(xí)什么內(nèi)容。相關(guān)學(xué)習(xí)視頻資料、開發(fā)工具都有分享 Pyppeteer 就是依賴于 Chromium 這個(gè)瀏覽器來(lái)運(yùn)行的。那么有了 Pyppeteer 之后,我們就可以免去那些繁瑣的環(huán)境配置等問題。如果第一次運(yùn)行的時(shí)候,Chromium 瀏覽器沒有安全,那么程序會(huì)幫我們自動(dòng)安裝和配置,就免去了繁瑣的環(huán)境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 實(shí)現(xiàn)的,所以它的一些執(zhí)行也支持異步操作,效率相對(duì)于 Selenium 來(lái)說(shuō)也提高了。 那么下面就讓我們來(lái)一起了解下 Pyppeteer 的相關(guān)用法吧。 安裝首先就是安裝問題了,由于 Pyppeteer 采用了 Python 的 async 機(jī)制,所以其運(yùn)行要求的 Python 版本為 3.5 及以上。 安裝方式非常簡(jiǎn)單: pip3 install pyppeteer好了,安裝完成之后我們命令行下測(cè)試下: 如果沒有報(bào)錯(cuò),那么就證明安裝成功了。 快速上手接下來(lái)我們測(cè)試下基本的頁(yè)面渲染操作,這里我們選用的網(wǎng)址為:http://quotes./js/,這個(gè)頁(yè)面是 JavaScript 渲染而成的,用基本的 requests 庫(kù)請(qǐng)求得到的 HTML 結(jié)果里面是不包含頁(yè)面中所見的條目?jī)?nèi)容的。 為了證明 requests 無(wú)法完成正常的抓取,我們可以先用如下代碼來(lái)測(cè)試一下: import requests這里首先使用 requests 來(lái)請(qǐng)求網(wǎng)頁(yè)內(nèi)容,然后使用 pyquery 來(lái)解析頁(yè)面中的每一個(gè)條目。觀察源碼之后我們發(fā)現(xiàn)每個(gè)條目的 class 名為 quote,所以這里選用了 .quote 這個(gè) CSS 選擇器來(lái)選擇,最后輸出條目數(shù)量。 運(yùn)行結(jié)果: 結(jié)果是 0,這就證明使用 requests 是無(wú)法正常抓取到相關(guān)數(shù)據(jù)的。因?yàn)槭裁??因?yàn)檫@個(gè)頁(yè)面是 JavaScript 渲染而成的,我們所看到的內(nèi)容都是網(wǎng)頁(yè)加載后又執(zhí)行了 JavaScript 之后才呈現(xiàn)出來(lái)的,因此這些條目數(shù)據(jù)并不存在于原始 HTML 代碼中,而 requests 僅僅抓取的是原始 HTML 代碼。 好的,所以遇到這種類型的網(wǎng)站我們應(yīng)該怎么辦呢? 其實(shí)答案有很多:
而 Pyppeteer 和 Selenium 就是用的第三種方法,下面我們?cè)儆?Pyppeteer 來(lái)試試,如果用 Pyppeteer 實(shí)現(xiàn)如上頁(yè)面的抓取的話,代碼就可以寫為如下形式: import asyncio運(yùn)行結(jié)果: 看運(yùn)行結(jié)果,這說(shuō)明我們就成功匹配出來(lái)了 class 為 quote 的條目,總數(shù)為 10 條 |
|
|
來(lái)自: 求知_時(shí)光 > 《黑客》