pyppeteer與selenium對比

txmmy發表於2024-03-30

pyppeteer與selenium對比

分析來源

requests 爬取下來的只能是伺服器端網頁的原始碼,這和瀏覽器渲染以後的頁面內容是不一樣的。因為,真正的資料是經過 JavaScript 執行後,渲染出來的,資料來源可能是 Ajax,也可能是頁面裡的某些 Data,或者是一些 ifame 頁面等。不過,大多數情況下極有可能是 Ajax 介面獲取的。

很多情況我們需要分析 Ajax請求,分析這些介面的呼叫方式,透過抓包工具或者瀏覽器的“開發者工具”,找到資料的請求連結,然後再用程式來模擬。但是,抓包分析流的方式,也存在一定的缺點。

一是:因為有些介面帶著加密引數,比如 token、sign 等等,模擬難度較大;

二是:抓包的方式只適合量小的情況。如果有一百、一千個,甚至五千、一萬個網站要處理時,該如何處理?還一個一個分析資料流?一個一個去抓包嗎?

由於Selenium流行已久,現在稍微有點反爬的網站都會對selenium和webdriver進行識別,網站只需要在前端js新增一下判斷指令碼,很容易就可以判斷出是真人訪問還是webdriver。雖然也可以透過中間代理的方式進行js注入遮蔽webdriver檢測,但是webdriver對瀏覽器的模擬操作(輸入、點選等等)都會留下webdriver的標記,同樣會被識別出來,要繞過這種檢測,只有重新編譯webdriver,麻煩自不必說,難度不是一般大。

由於Selenium流行已久,現在稍微有點反爬的網站都會對selenium和webdriver進行識別,網站只需要在前端js新增一下判斷指令碼,很容易就可以判斷出是真人訪問還是webdriver。雖然也可以透過中間代理的方式進行js注入遮蔽webdriver檢測,但是webdriver對瀏覽器的模擬操作(輸入、點選等等)都會留下webdriver的標記,同樣會被識別出來,要繞過這種檢測,只有重新編譯webdriver,麻煩自不必說,難度不是一般大。

學習筆記

基本操作

開啟網頁

   executable_path=r'C:\Users\txmmy\AppData\Local\Google\Chrome\Application\chrome.exe'
browser=await launch(headless=False,executable_path=executable_path)
page=await  browser.newPage()
await page.goto('https://www.baidu.com/')

執行pyppeteer:

import asyncio
from pyppeteer import launch
if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

來個例項

例項一、搜尋百度關鍵字

    #下拉捲軸
    await  page.evaluate('window.scrollBy(0,window.innerHeight)')
    await asyncio.sleep(random.random() * random.randint(3, 5))
    #提取搜尋第一頁標題、網址連結 #JX evaluate??
    title_element = await page.Jx('//*[contains(@class,"result c-container")]//h3/a')
    for t in title_element:
        title = await page.evaluate('t => t.textContent', t)
        link = await (await t.getProperty('href')).jsonValue()
    #清空搜尋框的關鍵字
    await page.evaluate('document.querySelector("input[id=kw]").value=""')

pager.Jx

page.evaluate

page.getPorperty

文件摘要

相關文章