【0基礎學爬蟲】爬蟲基礎之自動化工具 Pyppeteer 的使用

来源:https://www.cnblogs.com/ikdl/archive/2023/05/09/17385159.html
-Advertisement-
Play Games

大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為自動化工具 Pyppeteer 的使用。 概述 前兩期文章中已 ...


0

大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為自動化工具 Pyppeteer 的使用。

概述

前兩期文章中已經介紹到了 Selenium 與 Playwright 的使用方法,它們的功能都非常強大。而本期要講的 Pyppeteer 與 Playwright 一致,都可以作為 Selenium 的替代者來使用。且與 Playwright 相比,Pyppeteer 的使用更加簡單。

Pyppeteer 的使用

介紹

在上上期文章中,我們介紹了 Selenium 隱藏特征的方法,其中使用到了 stealth.min.js 文件。在介紹文件的來源時我們提到了 Puppeteer,Puppeteer是一個基於 Node.js 的自動化工具。而這期要將的 Pyppeteer 就是 Puppeteer 的 Python 版。

Pyppeteer 是一個使用 Python 語言封裝的 Google Chrome 瀏覽器的非官方 API。它可以用來進行自動化測試、網站爬蟲和數據抓取等工作。

Pyppeteer 的底層是通過調用 Chrome 瀏覽器的 DevTools Protocol 介面來實現的。DevTools Protocol 是一個基於 WebSocket 協議的遠程調試介面,可以讓開發者控制和檢查 Chrome 瀏覽器的行為。Pyppeteer 利用這個介面實現了對 Chrome 瀏覽器的完全控制,包括載入頁面、模擬用戶操作、獲取頁面內容等等。

Pyppeteer 支持 Python 3.6 及以上版本,並且可以在 Windows、macOS 和 Linux 等操作系統上運行。它提供了簡單易用的 API,可以方便地模擬用戶在瀏覽器上的操作,例如點擊鏈接、填寫表單、觸發事件等等。同時,它也支持對瀏覽器的調試、截屏、PDF 導出等高級功能。

Pyppeteer 的使用方式與其他 Python 庫類似,可以通過 pip 包管理器進行安裝。除了 Pyppeteer 本身外,還需要安裝 asyncio 庫和一個相容的 Chrome 瀏覽器版本。在安裝完成後,可以通過 Python 代碼來控制瀏覽器的行為,實現各種自動化測試或數據抓取的任務。

安裝

Pyppeteer 的安裝與 Playwright 相似。

Pyppeteer 採用了async機制,所以必須使用Python 3.5及以上版本。

首先使用 pip 安裝 Pyppeteer 包:

pip install pyppeteer

安裝完成後可以選擇執行 pyppeteer-install 下載用於 pyppeteer 的 chromium,這一步可以省略,因為第一次運行 Pyppeteer 時會自動檢測是否安裝了 chromium 瀏覽器,如果沒有安裝程式會自動進行安裝配置。

使用

前兩期文章中介紹到了 Selenium 與 Playwright 庫的使用方法,因為自動化庫的使用大同小異,所以這裡只介紹 Pyppeteer 中比較特殊的方法

Pyppeteer 基於非同步實現,所以它支持非同步操作。

啟動

以百度熱搜榜為例:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    await browser.close()

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

示例代碼中使用 launch 方法創建了一個瀏覽器對象 browser ,設置了 headless=False 來關閉無頭模式,這一行代碼的作用相當於啟動一個瀏覽器,await的作用就是等待瀏覽器啟動完畢。

創建完瀏覽器後,使用到了 newPage 方法,創建了一個 Page 對象,這一步相當於打開了一個新的標簽頁,通過 await 等待標簽頁創建完畢,然後調用 goto 方法打開目標網址,最後使用 close 方法關閉瀏覽器。

launch詳解

launch 方法用於啟動瀏覽器進程並返回瀏覽器實例,它包含了多個參數:

參數 描述
ignoreHTTPSErrors(bool) 是否忽略HTTPS錯誤。預設為 False
headless(bool) 是否開啟無頭模式。預設為True
executablePath (str) 可執行文件的路徑,設置該參數可以指定已有的 Chrome 或 Chromium 瀏覽器。
slowMo (int | float) 傳入指定時間(毫秒),用於延緩 Pyppeteer 的一些模擬操作。
args (List [str]) 傳遞給瀏覽器的額外參數。
dumpio(bool) 是否將 Pyppeteer 的輸出信息傳給 process.stdoutprocess.stderr。預設為False
userDataDir (str) 用戶數據文件夾。
env(dict) 瀏覽器環境。預設與 Python 進程相同。
devtools(bool) 是否為每個標簽頁打開 DevTools 面板,預設為False,如果該參數為 True,則 headless 會被強制設置為 False
logLevel(int | str) 日誌級別。預設值與根記錄器相同。
autoClose(bool) 腳本完成時自動關閉瀏覽器進程。預設為True
loop(asyncio.AbstractEventLoop) 事件迴圈。

禁用提示條

與 Selenium 一樣,Pyppeteer 控制瀏覽器時會提示 Chrome 正受到自動測試軟體的控制。可以通過 設置 launch 方法中的 args 參數來關閉提示。

browser = await launch(headless=False, args=['--disable-infobars'])

用戶數據持久化

自動化工具如 Selenium 、Playwright 都有一個特征,就是每一次運行的時候創建的都是一個全新的瀏覽器,它不會記錄用戶之前的行為。如第一次運行時我登錄了某個網站,而第二次運行時再次進入該網站時依舊需要登錄。這是因為自動化工具沒有記錄用戶行為信息。Pyppeteer 中,如果需要記錄用戶的行為信息,可以通過設置 launch 方法中的 userDataDir 方法來實現。

browser = await launch(headless=False, args=['--disable-infobars'], userDataDir='./userdata')

設置了用戶數據文件夾後運行代碼,會生成一個 userdata 文件夾,其中就存儲著用戶上次控制瀏覽器時記錄的一些行為數據。

1

執行 JS 語句

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    dimensions = await page.evaluate('''() => {
           return {
               width: document.documentElement.clientWidth,
               height: document.documentElement.clientHeight,
               deviceScaleFactor: window.devicePixelRatio,
           }
       }''')
    print(dimensions)
    await browser.close()
# {'width': 783, 'height': 583, 'deviceScaleFactor': 1}

通過調用 Page 對象下的 evaluate 方法可以執行一段 JS 語句。

反檢測

Pyppeteer 的反檢測方式與 Selenium 和 Playwright 有些區別,但是思想是一樣的。

首先需要安裝 pyppeteer_stealth 庫,它的作用就是用來隱藏特征。

pip install pyppeteer_stealth

以無頭模式為例:

import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth


async def main():
    browser = await launch()
    page = await browser.newPage()
    # 隱藏特征
    await stealth(page)
    
    await page.goto('https://bot.sannysoft.com/')
    await page.screenshot(path='page.png')
    await browser.close()

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

隱藏特征前:

2

隱藏特征後:

3

等待

waitForSelector :等待符合條件的節點載入完成

waitForFunction :等待某個 JavaScript 方法執行完畢或返回結果

waitForRequest :等待某個特定的請求發出

waitForResponse :等待某個特定請求對應的響應

waitForNavigation :等待頁面跳轉,如果頁面載入失敗則拋出異常

waitFor :通用等待

waitForXpath :等待符合 Xpath 的節點載入出來

選擇器

Pyppeteer 提供了一些比較有意思的選擇器方法。

J() :返回匹配到的第一個節點,等同於 querySelector 方法。

JJ() :返回匹配到的所有節點,等同於 querySelectorAll 方法。

JJeval() :執行 JS 腳本並返回一個 JSON 對象,等同於 querySelectorAllEval 方法。

Jeval() :執行 JS 腳本並返回執行結果,等同於 querySelectorEval 方法。

Jx() :通過 Xpath 匹配符合條件的內容,等同於 xpath 方法。

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    # 等待元素載入
    await page.waitForXPath('//div[@class="c-single-text-ellipsis"]')
    element_j = await page.J('.c-single-text-ellipsis')
    element_jj = await page.JJ('.c-single-text-ellipsis')
    # 列印元素的文本信息
    print(await (await element_j.getProperty('textContent')).jsonValue())
    for element in element_jj:
        # 列印元素的文本信息
        print(await (await element.getProperty('textContent')).jsonValue())

    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
"""
運行結果:
青年強則國家強 
青年強則國家強 
烏代表舉自家國旗挑釁暴揍俄代表 
英王加冕禮彩排:黃金鑽石馬車亮眼 
平凡崗位上的奮鬥故事 
俞敏洪建議24節氣都放假 
7人吃自助4小時炫300多個螃蟹 
  .
  .
  .
"""

總結

Pyppeteer 類似於輕量級的 Playwright ,它使用起來更加簡單,且 Pyppeteer 與 Playwright 一樣都支持非同步,性能方面也比較強。缺點就是它基於 Chromium 內核,資源消耗比較大,不支持其它瀏覽器,而且 Pyppeteer 的作者近年來都沒對該庫進行維護,導致存在一些 bug。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十九之settings配置介紹 這一篇筆記介紹 Django 里 settings.py 里一些常用的配置項,這些配置有一些是在之前的筆記中有過介紹的,比如 logging 的日誌配置,session 的會話配置等,這裡就只做一下簡單的 ...
  • redis-主從模式弊端: 一、master節點異常shutdown後,從機原地待命,從機數據可以查詢(不可以寫入),等待主機重啟歸來 二、複製延時,信號衰減 redis-哨兵監控: 是什麼? 哨兵即為吹哨人,可以巡查監控後臺master主機是否故障,如果故障可以根據投票數自動將一個從庫轉換為新的m ...
  • 實驗五 Java多線程程式設計 實驗目的 1. 掌握Runnable介面實現多線程的方法 2. 掌握Thread類實現多線程的用法 3. 掌握Java語言中多線程編程的基本方法 ...
  • 哈嘍大家好我是鹹魚,今天給大家分享一個能夠提升運維效率的 python 腳本 鹹魚平常在工作當中通常會接觸到下麵類似的場景: 容災切換的時候批量對機器上的配置文件內容進行修改替換 對機器批量替換某個文件中的欄位 對於 Linux 機器,鹹魚可以寫個 shell 腳本或者直接批量使用 sed 命令就能 ...
  • 前言 在C語言中,有三種條件判斷結構:if語句、if-else語句和switch語句。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、if語句 基本語法 if (條件) { // 代碼塊1 } 代碼示例 #i ...
  • 併發編程的意義是充分的利用處理器的每一個核,以達到最高的處理性能,可以讓程式運行的更快。而處理器也為了提高計算速率,作出了一系列優化 ...
  • 前言 從今天開始本系列就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。 全文大約 【1707】 字,不說廢話,只講可以讓你學到技術、明白原理的純乾貨!本文帶有豐富案例及配圖 ...
  • 目錄 什麼是 SQL,它的用途是什麼? SQL 在 2023 年仍然適用嗎? 你應該學習 SQL 嗎? 學習 SQL 的不同方法 SQL 入門 SQL初學者可能害怕問的問題 學習 SQL 的先決條件是什麼,我需要有任何編碼經驗嗎? SQL 有哪些實際應用,哪些行業依賴於此技能? 學習SQL需要多長時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...