基于JavaScript、puppeteer的爬蟲

前期準備:

npm puppeteer

import puppeteer from 'puppeteer';

puppeteer文檔

第一步:啟動瀏覽器,跳轉到需要爬取的頁面

const browser = await puppeteer.launch({ headless: false });const page = await browser.newPage();await page.goto(url, { waitUntil: 'networkidle2' });

第二步:打開需要爬取的網頁,按“F12”查看前端的dom,查看我們想獲取的文本信息的父級類名,例如:

第三步,通常列表頁面都有下拉刷新,我們需要寫一個腳本讓頁面下拉刷新

我要爬取的頁面下拉到一定的地步后會有一個“加載更多”按鈕,需要點擊,直到頁面無法滾動,且沒有加載更多按鈕的時候停止,腳本參考如下:

 // 定義滾動函數const scrollPage = async () => {const distance = 100000; // 每次滾動的距離const delay = 2000; // 每次滾動后的延遲let previousHeight = await page.evaluate('document.body.scrollHeight');while (true) {await page.evaluate(`window.scrollBy(0, ${distance})`);await new Promise(resolve => setTimeout(resolve, delay));const newHeight = await page.evaluate('document.body.scrollHeight');if (newHeight === previousHeight) {const loadMoreButton = await page.$('.類名1.類名2');//鎖定“加載更多按鈕”if (loadMoreButton) {await loadMoreButton.click();console.log('點擊加載更多結果按鈕');await new Promise(resolve => setTimeout(resolve, delay)); // 等待加載更多內容} else {console.log('已滾動到底部,沒有更多內容加載');break;}}previousHeight = newHeight;}
};await scrollPage();

第四步,封裝成對象并打印

第三步的腳本讓我們把頁面加載到擁有全部數據的狀態,現在需要將第二步收集的類名里的文本封裝成數組

await page.waitForSelector('.卡片父級類名', { timeout: 60000 });//卡片最外層
const info= await page.evaluate(() => {const cardElements = document.querySelectorAll('.卡片父級類名');//獲取所有卡片const arr= [];cardElements.forEach(hotel => {const nameElement = hotel.querySelector('[需要的元素1的屬性]');const priceElement = hotel.querySelector('[需要的元素2的屬性]');const name = nameElement ? nameElement.innerText.trim() : null;const price = priceElement ? priceElement.innerText.trim() : null;if (name || price) {arr.push({ name, price });}});return arr;
});console.log(JSON.stringify(info, null, 2))// 完事關閉瀏覽器
await browser.close();

運行

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

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

相關文章

【目標檢測實驗系列】YOLOv5模型改進:引入輕量化多維動態卷積ODConv,減少計算量的同時保持精度穩定或略微上漲!(內含源代碼,超詳細改進代碼流程)

1. 文章主要內容 本篇博客主要涉及輕量化多維動態卷積ODConv,融合到YOLOv5模型中,減少計算量的同時保持精度穩定或略微上漲。(通讀本篇博客需要7分鐘左右的時間)。 2. 介紹 ODconv沿著空間、輸入通道、輸出通道以及卷積核空間的核…

領導被我的花式console.log吸引了!直接寫入公司公共庫!

背景簡介 這幾天代碼評審,領導無意中看到了我本地代碼的控制臺,被我花里胡哨的console打印內容吸引了! 老板看見后,說我這東西有意思,花里胡哨的,他喜歡! 但是隨即又問我,這么花里胡哨的東西,上生產會影響性能吧?我自信的說:不會,代碼內有判斷的,只有開發環境會…

后端工作之一:CrapApi —— API接口管理系統部署

一個API接口的網絡請求都有這些基本元素構成: API接口大多數是由后端編寫,前端開發人員進行請求調用 就是一個網絡請求的流程。 API(Application Programming Interface)接口是現代軟件開發中不可或缺的一部分。它們提供了一種…

14270-02G 同軸連接器

型號簡介 14270-02G是Southwest Microwave的2.4 mm 同軸連接器。這款連接器連接器采用不銹鋼、鈹銅合金、黃銅合金和 ULTEM 1000 等高質量材料,可能具有更好的耐腐蝕性、導電性和機械強度。金鍍層可以提供更低的接觸電阻和更好的耐腐蝕性。 型號特點 電纜的中心導體…

過擬合和欠擬合的概念

過擬合和欠擬合的概念 過擬合(Overfitting)是指機器學習模型在訓練數據上表現得非常好,但在新數據(測試集或實際應用中的數據)上卻表現不佳的現象。這種情況通常發生在模型復雜度過高,導致它過度適應了訓練…

健康課程知識培訓小程序網站如何學員教務管理

醫學專業學生或是從業醫生、護士等都需要不斷學習鞏固自己的技術和拓寬知識面,除了主要學習來源外,培訓機構課程需求也是提升自身實力的方法,市場中也存在不少醫藥健康內容培訓機構或是醫院內部員工培訓等。 運用雨科平臺搭建醫藥健康內容培…

前端八股文 說一下盒模型

網頁中任何一個元素都可以視為一個盒子,由里到外,盒模型包括外邊界(margin)、邊框(border)、內邊界(padding)和內容(content)。 盒模型基本分為3種&#xff1…

k8s離線安裝安裝skywalking9.4

目錄 概述資源下載Skywalking功能介紹成果速覽實踐rbacoapoap-svcuiui-svc 結束 概述 k8s 離線安裝安裝 skywalking9.4 版本,環境:k8s版本為:1.27.x 、spring boot 2.7.x spring cloud :2021.0.5 、spring.cloud.alibab&#xff1…

智慧消防視頻監控煙火識別方案,筑牢安全防線

一、方案背景 在現代化城市中,各類小型場所(簡稱“九小場所”)如小餐館、小商店、小網吧等遍布大街小巷,為市民生活提供了極大的便利。然而,由于這些場所往往規模較小、人員流動性大、消防安全意識相對薄弱&#xff0…

vue配置sql規則

vue配置sql規則 實現效果組件完整代碼父組件 前端頁面實現動態配置sql條件,將JSON結構給到后端,后端進行sql組裝。 這里涉及的分組后端在組裝時用括號將這塊規則括起來就行,分組的sql連接符(并且/或者)取組里的第一個。…

【Linux】Linux常用指令合集精講,一篇讓你徹底掌握(萬字真言)

文章目錄 一、文件與目錄操作1.1 ls - 列出目錄內容1.2 cd - 切換目錄1.3 pwd - 顯示當前目錄1.4 mkdir - 創建目錄1.5 rmdir - 刪除空目錄1.6 rm - 刪除文件或目錄1.7 cp - 復制文件或目錄1.8 mv - 移動或重命名文件或目錄1.9 touch - 創建空文件或更新文件時間戳 二、文件內容…

Vue 詳情實戰涉及從項目初始化到功能實現、測試及部署的整個過程

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

《操作系統真象還原》學習筆記:第2章——編寫MBR主引導記錄

2.1 計算機的啟動過程 載入內存: (1) 程序被加載器(軟件或硬件)加載到內存某個區域 (2)CPU 的 cs:ip 寄存器被指向這個程序的起始地址 2.2 軟件接力第一棒,BIOS 2.2.1 實模式下的…

Jenkins 使用 Publish over SSH進行遠程訪問

Publish over SSH 是 Jenkins 的一個插件,可以讓你通過 SSH 將構建產物分發到遠程服務器。以下是如何開啟 Publish over SSH 的步驟: 一、安裝 Publish over SSH 插件 在 Jenkins 中,進入 "Manage Jenkins" > "Manage Plugins"。選擇 "Availab…

怎么用AI合成PPT?這5款風靡全球的AIPPT軟件一定要知道!

當下我們已進入信息過載的時代,每天有無數的信息試圖爭奪我們的注意力,與此同時,我們也需要向別人展示和呈現信息,這就要求我們能夠以最低的成本,在短時間內引起對方的注意,這其中最常用到的工具非PPT莫屬。…

Java集合框架:深入探索與性能優化指南

引言 Java集合框架是Java標準庫中用于存儲和操作對象集合的一套工具。它提供了一套統一的接口和類,使得開發者可以高效地處理對象集合,而無需關心底層的實現細節。Java集合框架主要包括List、Set、Map等接口及其實現類。本文將詳細介紹Java中的集合框架,并分享如何選擇和使用…

簡易電阻、電容和電感測量儀-FPGA

通過VHDL語言編寫程序用于設計電阻、電容和電感測量儀,通過使用試驗箱進行驗證是否設計正確,資料獲取到咸🐟:xy591215295250 \\\或者聯系wechat 號:comprehensivable 設計并制作--臺數字顯示的電阻、電容和電感參數測試…

一篇說清楚大端和小端

端是什么? “我們常說的大端小端模式是計算機中 字節順序(Endianness) 常見的兩種表現形式。(此外還有混合序 (Middle-Endian)) “endian”一詞來源于十八世紀愛爾蘭作家喬納森斯威夫特(Jonathan Swift)的小說《格列佛…

Linux上從NCBI序列

要下載NCBI Gene數據庫中所有Gene ID的FASTA格式序列,可以使用以下方法: 使用Entrez Direct命令行工具 安裝Entrez Direct: conda install bioconda::entrez-direct使用Entrez Direct下載FASTA格式序列: esearch -db gene -query "(Triticum aes…

C++ 空間和時間高效的二項式系數(Space and time efficient Binomial Coefficient)

這里函數采用兩個參數n和k,并返回二項式系數 C(n, k) 的值。 例子: 輸入: n 4 和 k 2 輸出: 6 解釋: 4 C 2 等于 4!/(2!*2!) 6 輸入: n 5 和 k 2 輸出: 10 解釋: 5 C …