python爬蟲 Pyppeteer使用方法解析
引言
Selenium 在被使用的時候有個麻煩事,就是環(huán)境的相關(guān)配置,得安裝好相關(guān)瀏覽器,比如 Chrome、Firefox 等等,然后還要到官方網(wǎng)站去下載對應(yīng)的驅(qū)動,最重要的還需要安裝對應(yīng)的 Python Selenium 庫,確實是不是很方便,另外如果要做大規(guī)模部署的話,環(huán)境配置的一些問題也是個頭疼的事情。那么本節(jié)就介紹另一個類似的替代品,叫做 Pyppeteer。
Pyppeteer簡介
注意,本節(jié)講解的模塊叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 開發(fā)的一個工具,有了它我們可以通過 JavaScript 來控制 Chrome 瀏覽器的一些操作,當(dāng)然也可以用作網(wǎng)絡(luò)爬蟲上,其 API 極其完善,功能非常強大。 而 Pyppeteer 又是什么呢?它實際上是 Puppeteer 的 Python 版本的實現(xiàn),但他不是 Google 開發(fā)的,是一位來自于日本的工程師依據(jù) Puppeteer 的一些功能開發(fā)出來的非官方版本。
在 Pyppetter 中,實際上它背后也是有一個類似 Chrome 瀏覽器的 Chromium 瀏覽器在執(zhí)行一些動作進(jìn)行網(wǎng)頁渲染,首先說下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。
Chromium 是谷歌為了研發(fā) Chrome 而啟動的項目,是完全開源的。二者基于相同的源代碼構(gòu)建,Chrome 所有的新功能都會先在 Chromium 上實現(xiàn),待驗證穩(wěn)定后才會移植,因此 Chromium 的版本更新頻率更高,也會包含很多新的功能,但作為一款獨立的瀏覽器,Chromium 的用戶群體要小眾得多。兩款瀏覽器“同根同源”,它們有著同樣的 Logo,但配色不同,Chrome 由藍(lán)紅綠黃四種顏色組成,而 Chromium 由不同深度的藍(lán)色構(gòu)成。
Pyppeteer 就是依賴于 Chromium 這個瀏覽器來運行的。那么有了 Pyppeteer 之后,我們就可以免去那些繁瑣的環(huán)境配置等問題。如果第一次運行的時候,Chromium 瀏覽器沒有安裝,那么程序會幫我們自動安裝和配置,就免去了繁瑣的環(huán)境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 實現(xiàn)的,所以它的一些執(zhí)行也支持異步操作,效率相對于 Selenium 來說也提高了。
環(huán)境安裝
由于 Pyppeteer 采用了 Python 的 async 機制,所以其運行要求的 Python 版本為 3.5 及以上
pip install pyppeteer
快速上手
- 爬取http://quotes.toscrape.com/js/ 全部頁面數(shù)據(jù)
import asyncio
from pyppeteer import launch
from lxml import etree
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://quotes.toscrape.com/js/')
page_text = await page.content()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="quote"]')
print(len(div_list))
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
結(jié)合協(xié)程
from pyppeteer import launch
import asyncio
from lxml import etree
# 實例化瀏覽器對象(谷歌測試版)
async def main():
bro = await launch()
# 新建一個空白頁
page = bro.newPage()
page.goto('http://quotes.toscrape.com/js/')
# 獲取page當(dāng)前顯示頁面的源碼數(shù)據(jù)
page_text = await page.content()
return page_text
def parse(task):
page_text = task.result()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="quote"]')
for div in div_list:
content = div.xpath('./span[1]/text()')
print(content)
c = main()
task = asyncio.ensure_future(c)
task.add_done_callback(parse)
loop = asyncio.get_event_loop()
loop.run_until_complete(c)
解釋:
launch 方法會新建一個 Browser 對象,然后賦值給 browser,然后調(diào)用 newPage 方法相當(dāng)于瀏覽器中新建了一個選項卡,同時新建了一個 Page 對象。然后 Page 對象調(diào)用了 goto 方法就相當(dāng)于在瀏覽器中輸入了這個 URL,瀏覽器跳轉(zhuǎn)到了對應(yīng)的頁面進(jìn)行加載,加載完成之后再調(diào)用 content 方法,返回當(dāng)前瀏覽器頁面的源代碼。
然后進(jìn)一步地,我們用 pyquery 進(jìn)行同樣地解析,就可以得到 JavaScript 渲染的結(jié)果了。在這個過程中,我們沒有配置 Chrome 瀏覽器,沒有配置瀏覽器驅(qū)動,免去了一些繁瑣的步驟,同樣達(dá)到了 Selenium 的效果,還實現(xiàn)了異步抓取。
詳細(xì)用法
- 開啟瀏覽器
- 調(diào)用 launch 方法即可,相關(guān)參數(shù)介紹:
- ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的錯誤,默認(rèn)是 False。
- headless (bool): 是否啟用 Headless 模式,即無界面模式,如果 devtools 這個參數(shù)是 True 的話,那么該參數(shù)就會被設(shè)置為 False,否則為 True,即默認(rèn)是開啟無界面模式的。
- executablePath (str): 可執(zhí)行文件的路徑,如果指定之后就不需要使用默認(rèn)的 Chromium 了,可以指定為已有的 Chrome 或 Chromium。
- args (List[str]): 在執(zhí)行過程中可以傳入的額外參數(shù)。
- devtools (bool): 是否為每一個頁面自動開啟調(diào)試工具,默認(rèn)是 False。如果這個參數(shù)設(shè)置為 True,那么 headless 參數(shù)就會無效,會被強制設(shè)置為 False。
- 關(guān)閉提示條:”Chrome 正受到自動測試軟件的控制”,這個提示條有點煩,那咋關(guān)閉呢?這時候就需要用到 args 參數(shù)了,禁用操作如下:
- browser = await launch(headless=False, args=['--disable-infobars'])
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python基于celery實現(xiàn)異步任務(wù)周期任務(wù)定時任務(wù)
這篇文章主要介紹了python基于celery實現(xiàn)異步任務(wù)周期任務(wù)定時任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
tensorboard實現(xiàn)同時顯示訓(xùn)練曲線和測試曲線
今天小編就為大家分享一篇tensorboard實現(xiàn)同時顯示訓(xùn)練曲線和測試曲線,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題
這篇文章主要給大家介紹了關(guān)于利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12

