午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Google推出的爬蟲新神器:Pyppeteer,神擋殺神,佛擋殺佛!

 求知_時光 2019-05-26

如果大家對 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 瀏覽器的淵源。

Chromium 是谷歌為了研發(fā) Chrome 而啟動的項(xiàng)目,是完全開源的。二者基于相同的源代碼構(gòu)建,Chrome 所有的新功能都會先在 Chromium 上實(shí)現(xiàn),待驗(yàn)證穩(wěn)定后才會移植,因此 Chromium 的版本更新頻率更高,也會包含很多新的功能,但作為一款獨(dú)立的瀏覽器,Chromium 的用戶群體要小眾得多。兩款瀏覽器“同根同源”,它們有著同樣的 Logo,但配色不同,Chrome 由藍(lán)紅綠黃四種顏色組成,而 Chromium 由不同深度的藍(lán)色構(gòu)成。

總的來說,兩款瀏覽器的內(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

好了,安裝完成之后我們命令行下測試下:

>>> import pyppeteer

如果沒有報錯,那么就證明安裝成功了。

快速上手

接下來我們測試下基本的頁面渲染操作,這里我們選用的網(wǎng)址為:http://quotes./js/,這個頁面是 JavaScript 渲染而成的,用基本的 requests 庫請求得到的 HTML 結(jié)果里面是不包含頁面中所見的條目內(nèi)容的。

為了證明 requests 無法完成正常的抓取,我們可以先用如下代碼來測試一下:

import requests
from pyquery import PyQuery as pq

url = 'http://quotes./js/'
response = requests.get(url)
doc = pq(response.text)
print('Quotes:', doc('.quote').length)

這里首先使用 requests 來請求網(wǎng)頁內(nèi)容,然后使用 pyquery 來解析頁面中的每一個條目。觀察源碼之后我們發(fā)現(xiàn)每個條目的 class 名為 quote,所以這里選用了 .quote 這個 CSS 選擇器來選擇,最后輸出條目數(shù)量。

運(yùn)行結(jié)果:

Quotes: 0

結(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í)答案有很多:

  • 分析網(wǎng)頁源代碼數(shù)據(jù),如果數(shù)據(jù)是隱藏在 HTML 中的其他地方,以 JavaScript 變量的形式存在,直接提取就好了。

  • 分析 Ajax,很多數(shù)據(jù)可能是經(jīng)過 Ajax 請求時候獲取的,所以可以分析其接口。

  • 模擬 JavaScript 渲染過程,直接抓取渲染后的結(jié)果。

而 Pyppeteer 和 Selenium 就是用的第三種方法,下面我們再用 Pyppeteer 來試試,如果用 Pyppeteer 實(shí)現(xiàn)如上頁面的抓取的話,代碼就可以寫為如下形式:

import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://quotes./js/')
doc = pq(await page.content())
print('Quotes:', doc('.quote').length)
await browser.close()

asyncio.get_event_loop().run_until_complete(main())

運(yùn)行結(jié)果:

Quotes: 10

看運(yùn)行結(jié)果,這說明我們就成功匹配出來了 class 為 quote 的條目,總數(shù)為 10 條

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多