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