探索Puppeteer的強大功能:抓取隱藏內容

億牛云爬蟲代理.png

背景/引言

在現代網頁設計中,動態內容和隱藏元素的使用越來越普遍,這些內容往往只有在特定的用戶交互或條件下才會顯示出來。為了有效地獲取這些隱藏內容,傳統的靜態爬蟲技術往往力不從心。Puppeteer,作為一個強大的無頭瀏覽器工具,提供了豐富的功能來模擬用戶行為,從而輕松抓取這些動態內容。本文將介紹如何使用Puppeteer抓取網頁中的隱藏內容,并結合爬蟲代理IP、useragent、cookie等設置,確保爬取過程的穩定性和高效性。

正文

Puppeteer介紹

Puppeteer是一個由Google維護的Node庫,它提供了一個高層次的API來控制Chrome或Chromium瀏覽器。通過Puppeteer,我們可以自動執行諸如表單提交、UI測試、鍵盤輸入等操作。它特別適用于處理JavaScript渲染的動態網頁和隱藏元素。

抓取隱藏內容的幾種方式

在實際應用中,隱藏內容可能是通過點擊按鈕、滾動頁面等操作后才會顯示。Puppeteer允許我們模擬這些用戶操作,從而獲取隱藏的內容。下面將介紹幾種常見的抓取隱藏內容的方法。

1. 模擬點擊操作

有些隱藏內容需要通過點擊按鈕或鏈接來顯示。例如,一個“顯示更多”按鈕可能會加載更多的內容。

await page.click('#showHiddenContentButton');
await page.waitForSelector('#hiddenContent', { visible: true });
const hiddenContent = await page.evaluate(() => document.querySelector('#hiddenContent').innerText);
console.log('隱藏內容:', hiddenContent);
2. 滾動頁面加載內容

某些頁面通過滾動加載更多內容,比如無限滾動的社交媒體頁面。在這種情況下,我們可以模擬滾動操作。

await page.evaluate(async () => {for (let i = 0; i < 10; i++) {window.scrollBy(0, window.innerHeight);await new Promise(resolve => setTimeout(resolve, 1000));}
});
const content = await page.content();
console.log('滾動加載的內容:', content);
3. 表單提交

有些隱藏內容需要通過表單提交來觸發。例如,輸入搜索關鍵詞并點擊搜索按鈕。

await page.type('#searchInput', 'Puppeteer');
await page.click('#searchButton');
await page.waitForSelector('#searchResults', { visible: true });
const searchResults = await page.evaluate(() => document.querySelector('#searchResults').innerText);
console.log('搜索結果:', searchResults);
4. 等待特定時間

有些內容可能需要等待一段時間后才會加載,這時可以使用延時等待的方法。

await page.waitForTimeout(5000); // 等待5秒鐘
const delayedContent = await page.evaluate(() => document.querySelector('#delayedContent').innerText);
console.log('延時加載的內容:', delayedContent);

使用爬蟲代理IP、User-Agent和Cookie設置

在爬取過程中,使用爬蟲代理IP、User-Agent和Cookie可以有效避免被網站封禁,提高爬取的穩定性和效率。

實例代碼

以下是一個綜合實例代碼,展示如何使用Puppeteer抓取隱藏內容,并結合億牛云爬蟲代理、User-Agent和Cookie設置。

const puppeteer = require('puppeteer');(async () => {// 使用爬蟲代理IP的配置 億牛云爬蟲代理標準版const proxy = {host: 'www.16yun.cn', // 代理服務器地址port: 12345, // 代理服務器端口username: 'your_username', // 代理服務器用戶名password: 'your_password' // 代理服務器密碼};// 啟動瀏覽器,并配置代理和useragentconst browser = await puppeteer.launch({args: [`--proxy-server=${proxy.host}:${proxy.port}`]});const page = await browser.newPage();// 設置User-Agentawait page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');// 設置Cookieawait page.setCookie({name: 'example_cookie',value: 'example_value',domain: 'example.com'});// 代理服務器身份驗證await page.authenticate({username: proxy.username,password: proxy.password});// 打開目標網頁await page.goto('https://example.com');// 模擬點擊操作以顯示隱藏元素await page.click('#showHiddenContentButton');// 等待隱藏元素加載并顯示await page.waitForSelector('#hiddenContent', { visible: true });// 獲取隱藏元素的內容const hiddenContent = await page.evaluate(() => document.querySelector('#hiddenContent').innerText);console.log('隱藏內容:', hiddenContent);// 模擬滾動操作以加載更多內容await page.evaluate(async () => {for (let i = 0; i < 10; i++) {window.scrollBy(0, window.innerHeight);await new Promise(resolve => setTimeout(resolve, 1000));}});// 獲取滾動加載的內容const content = await page.content();console.log('滾動加載的內容:', content);// 模擬表單提交以獲取隱藏內容await page.type('#searchInput', 'Puppeteer');await page.click('#searchButton');await page.waitForSelector('#searchResults', { visible: true });const searchResults = await page.evaluate(() => document.querySelector('#searchResults').innerText);console.log('搜索結果:', searchResults);// 等待特定時間后獲取內容await page.waitForTimeout(5000); // 等待5秒鐘const delayedContent = await page.evaluate(() => document.querySelector('#delayedContent').innerText);console.log('延時加載的內容:', delayedContent);await browser.close();
})();

代碼解析

  1. 爬蟲代理IP配置:通過puppeteer.launch方法中的args參數配置代理服務器地址和端口。使用page.authenticate方法進行代理服務器的身份驗證。
  2. User-Agent設置:通過page.setUserAgent方法設置自定義的User-Agent字符串,模擬真實瀏覽器訪問。
  3. Cookie設置:通過page.setCookie方法設置自定義的Cookie,模擬已登錄狀態或其他特定用戶狀態。
  4. 模擬用戶操作:通過page.click方法模擬用戶點擊操作,顯示隱藏內容。通過page.waitForSelector方法等待隱藏元素加載并顯示。
  5. 滾動操作:通過page.evaluate方法模擬滾動操作,加載更多內容。
  6. 表單提交:通過page.typepage.click方法模擬表單輸入和提交,獲取隱藏內容。
  7. 延時等待:通過page.waitForTimeout方法等待特定時間后獲取延時加載的內容。

結論

Puppeteer作為一個功能強大的無頭瀏覽器工具,為我們提供了模擬用戶行為、抓取動態內容的能力。結合代理IP、User-Agent和Cookie設置,可以有效提升爬取的穩定性和效率。通過上述示例代碼,我們可以輕松抓取網頁中的隱藏內容,為數據采集和分析提供有力支持。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46399.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46399.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

印尼語翻譯通:AI驅動的智能翻譯與語言學習助手

在這個多元文化交織的世界中&#xff0c;語言是連接我們的橋梁。印尼語翻譯通&#xff0c;一款專為打破語言障礙而生的智能翻譯軟件&#xff0c;讓您與印尼語的世界輕松接軌。無論是商務出差、學術研究&#xff0c;還是探索印尼豐富的文化遺產&#xff0c;印尼語翻譯通都是您的…

代碼隨想錄算法訓練營第三十六天|1049. 最后一塊石頭的重量 II 、 494. 目標和 、 474.一和零

1049. 最后一塊石頭的重量 II 分成兩堆石頭&#xff0c;一堆石頭的總重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在計算target的時候&#xff0c;target sum / 2 因為是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目錄 .NET C# 使用 iText 生成PDF1 安裝 iText 7 庫&#xff1a;2 變量定義3 創建一個PDF4 段落5 旋轉文本6 代碼塊7 外部鏈接8 內部鏈接9 表格10 注釋11 線條12 二維碼13 嵌入圖像14 列表15 設置背景16 頁眉17 頁腳18 事件19 水印20 分欄21 源…

老古董Lisp(1):粗魯先生Lisp再出發

粗魯先生Lisp再出發 開始的原因 目標和夢想是最近考慮的一個問題。什么是目標&#xff1f;什么是夢想&#xff1f;夢想可以激勵改變&#xff0c;目標才能實現改變。 開始這個部分的時候&#xff0c;我的夢想是什么&#xff1f;我的目標是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip連接fS 環境部署tips

//運行FS服務器 sudo ./freeswitch -nc -nonat //公網sudo ./freeswitch //運行客戶端 sudo ./fs_cli //加載模塊 load mod_av load mod_verto0.Invite交互過程 1.fs碼率設置 2.用戶密碼改動 3.數字簽名的摘要 4.FS收不到ACK 5.公網部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---棧的使用和模擬實現

文章目錄 前言1.什么是棧(Stack)?2. 棧的模擬實現3.stack的使用![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.關于棧的oj題4.1.有效的括號4.2.逆波蘭表達式4.3.棧的壓入、彈出序列4.4.最小棧 前言 前面幾篇我們學習了順序…

Vue--Router(路由)

目錄 一 Router(路由) 1.作用 2.實現步驟 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;簡單來說&#xff0c;就是用來實現vue的頁面之間跳轉的。 我們都知道&#xff0c;使用vue必然會涉及到很多個組件&#xff0c;也就是頁面&#xff0c;而頁面之間肯定需…

RK3588讀取不到顯示器edid

問題描述 3588HDMIout接老的顯示器或者HDMI轉DVI接DVI顯示器顯示不了或者顯示內容是彩色條紋,但是這種顯示器測試過如果接筆記本或者主機是可以直接顯示的。這一類問題是HDMI下的i2c與顯示器通訊沒成功,讀取不到設備的edid。問題包括全志的H3 、AML的S905都有遇到 測試環境…

Qt-事件與信號

事件和信號的區別在于&#xff0c;事件通常是由窗口系統或應用程序產生的&#xff0c;信號則是Qt定義或用戶自定義的。Qt為界面組件定義的信號往往通常是對事件的封裝&#xff0c;如QPushButton的clicked()信號可以看做對QEvent::MouseButtonRelease類事件的封裝。 在使用界面組…

【QGroundControl二次開發】二.使用QT編譯QGC(Windows)

【QGroundControl二次開發】一.開發環境準備&#xff08;Windows&#xff09; 二. 使用QT編譯QGC&#xff08;Windows&#xff09; 2.1 打開QT Creator&#xff0c;選擇打開項目&#xff0c;打開之前下載的QGC項目源碼。 編譯器選擇Desktop Qt 6.6.3 MSVC2019 64bit。 點擊運…

vue3-tree-org實現帶照片的組織架構圖

官方文檔&#xff1a;vue3-tree-org 顯示照片需要注意的地方 使用步驟 下載 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 實現代碼 <tem…

level 6 day2 網絡基礎2

1.socket&#xff08;三種套接字&#xff1a;認真看&#xff09; 套接字就是在這個應用空間和內核空間的一個接口&#xff0c;如下圖 原始套接字可以從應用層直接訪問到網絡層&#xff0c;跳過了傳輸層&#xff0c;比如在ubtan里面直接ping 一個ip地址,他沒有經過TCP或者UDP的數…

解決TypeError: __init__() takes 1 positional argument but 2 were given

問題描述&#xff1a; 如下圖&#xff0c;在使用torch.nn.Sigmoid非線性激活時報錯 源代碼&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

記錄貼-芋道源碼

環境搭建 文字講解 鏈接: 芋道源碼-環境搭建&#xff08;一&#xff09;后端 鏈接: 芋道源碼-環境搭建&#xff08;二&#xff09;前端 鏈接: 基于FastGPT和芋道源碼挑戰一句話生成代碼 視頻講解 鏈接: 芋道源碼零基礎啟動教程&#xff08;上&#xff09; 鏈接: 芋道源碼零基…

Blackbox AI:你的智能編程伙伴

目錄 Blackbox AI 產品介紹 Blackbox AI 產品使用教程 Blackbox AI體驗 AI問答 代碼驗證 實時搜索 探索&代理 拓展集成 總結 Blackbox AI 產品介紹 Blackbox是專門為程序員量身定制的語言大模型&#xff0c;它針對20多種編程語言進行了特別訓練和深度優化&#xff0c;在AI代…

React 從入門到實戰 一一開發環境基礎搭建(小白篇)

React 從入門到實戰一一開發環境基礎搭建&#xff08;小白篇&#xff09; React 介紹什么是 react &#xff1f;react 主要功能react 框架特點 開發工具渲染測試 React 介紹 最近兩年&#xff0c;react 也愈來愈火熱&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不過 r…

UFS協議

1. 名詞解釋 UFS: universal flash storage SCSI&#xff1a;小型計算機系統接口 SPC&#xff1a;SCSI Primary Commands SBC&#xff1a; SCSI Block Commands Application Client&#xff1a;作為主機中SCSI命令和任務管理功能請求源的實體。 Device Server&#xff1a;設備…

高級java每日一道面試題-2024年7月17日(java內存模型-后期完善)

面試官: 你對java內存模型了解多少? 我回答: Java內存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;是Java虛擬機&#xff08;JVM&#xff09;規范的一部分&#xff0c;它定義了線程之間的內存可見性和并發執行時的原子性、有序性和可見性等特性。理解JMM對…

Windows下使用Cygwin創建rsync服務端

1 下載Cygwin 訪問官網Cygwin&#xff0c;點擊setup-X86_64.exe即可開始下載 2 安裝 前面全部默認。路徑可以自己選擇&#xff0c;站點選阿里云的&#xff0c;等待安裝即可 3 配置 使用打開Cygwin安裝后創建的快捷方式窗口&#xff0c;輸入下面的指令將windows用戶導入到cyg…

C語言中常見庫函數(1)——字符函數和字符串函數

文章目錄 前言1.字符分類函數2.字符轉換函數3.strlen的使用和模擬實現4.strcpy的使用和模擬實現5.strcat的使用和模擬實現6.strncmp的使用和模擬實現7.strncpy函數的使用8.strncat函數的使用9.strncmp函數的使用10.strstr的使用和模擬實現11.strtok函數的使用12.strerror函數的…