動態內容加載時,爬蟲應如何處理?

處理動態內容加載是爬蟲開發中的一個常見挑戰。許多現代網站使用 JavaScript 動態加載內容,這意味著頁面的某些部分可能在初始加載時并不存在,而是通過后續的 AJAX 請求或 JavaScript 執行動態生成的。為了處理這種情況,爬蟲需要能夠模擬瀏覽器的行為,執行 JavaScript 并等待內容加載完成。以下是幾種常見的方法和工具,可以幫助你處理動態內容加載。

1. 使用 Selenium

Selenium 是一個用于自動化瀏覽器操作的工具,可以模擬真實用戶的行為,包括點擊、滾動、等待等。Selenium 支持多種瀏覽器,如 Chrome、Firefox 等。

示例代碼

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdef get_html_with_selenium(url):options = webdriver.ChromeOptions()options.add_argument("--headless")  # 無頭模式,不顯示瀏覽器界面driver = webdriver.Chrome(options=options)driver.get(url)# 等待頁面加載完成try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.product-item")))finally:html = driver.page_sourcedriver.quit()return html# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html_with_selenium(url)
print(html)

2. 使用 Puppeteer

Puppeteer 是一個 Node 庫,通過 DevTools 協議控制 Chrome 或 Chromium。Puppeteer 默認以無頭模式運行,但也可以配置為運行“有頭”模式。

示例代碼

JavaScript

const puppeteer = require('puppeteer');async function getHtmlWithPuppeteer(url) {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto(url, { waitUntil: 'networkidle2' }); // 等待網絡空閑const html = await page.content();await browser.close();return html;
}// 使用示例
const url = "https://www.vip.com/vip-products";
getHtmlWithPuppeteer(url).then(html => {console.log(html);
});

3. 使用 Requests + BeautifulSoup + PyQuery

如果你不想使用 Selenium 或 Puppeteer,可以嘗試結合 RequestsBeautifulSoupPyQuery 來處理動態內容。這種方法通常需要手動分析頁面的 AJAX 請求,并直接發送請求獲取數據。

示例代碼

Python

import requests
from bs4 import BeautifulSoupdef get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)return response.textdef parse_html(html):soup = BeautifulSoup(html, "lxml")products = []items = soup.select(".vip-product")for item in items:product = {"name": item.select_one(".product-name").text.strip(),"price": item.select_one(".product-price").text.strip(),"discount": item.select_one(".product-discount").text.strip(),"description": item.select_one(".product-description").text.strip(),"image_url": item.select_one(".product-image img")["src"]}products.append(product)return products# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html(url)
products = parse_html(html)
for product in products:print(product)

4. 使用 Scrapy + Splash

Scrapy 是一個強大的 Python 爬蟲框架,而 Splash 是一個用于渲染 JavaScript 的工具,可以與 Scrapy 結合使用,處理動態內容。

示例代碼

Python

import scrapy
from scrapy_splash import SplashRequestclass VipProductSpider(scrapy.Spider):name = "vip_product"start_urls = ["https://www.vip.com/vip-products"]def start_requests(self):for url in self.start_urls:yield SplashRequest(url, self.parse, args={'wait': 0.5})def parse(self, response):products = response.css("div.product-item")for product in products:yield {"name": product.css(".product-name::text").get(),"price": product.css(".product-price::text").get(),"discount": product.css(".product-discount::text").get(),"description": product.css(".product-description::text").get(),"image_url": product.css(".product-image img::attr(src)").get()}

5. 使用 Playwright

Playwright 是一個用于自動化 Chromium、Firefox 和 WebKit 瀏覽器的工具,支持 Python、JavaScript、.NET 和 Java 等多種語言。

示例代碼

Python

from playwright.sync_api import sync_playwrightdef get_html_with_playwright(url):with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()page.goto(url)html = page.content()browser.close()return html# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html_with_playwright(url)
print(html)

總結

處理動態內容加載時,選擇合適的工具和方法取決于你的具體需求和開發環境。Selenium 和 Puppeteer 是處理動態內容的常用工具,而 Requests + BeautifulSoup + PyQuery 則適用于一些簡單的動態內容處理。Scrapy + Splash 和 Playwright 提供了更強大的功能,適合復雜的動態內容處理。希望這些方法能幫助你高效地處理動態內容加載,完成爬蟲任務。

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

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

相關文章

uni-app 安卓消失的字符去哪里了?maxLength失效了!

前情提要 皮一下~這個標題我還蠻喜歡的嘿嘿嘿【附上一個自行思考的猥瑣的笑容】 前段時間不是在開發uni-app的一個小應用嘛,然后今天測試發現,有一個地方在蘋果是沒有問題的,但是在安卓上出現了問題,附上安卓的截圖 在這里我是有限制maxLength=50的,而且,賦值字符串到字…

2025年5月藍橋杯stema省賽真題——象棋移動

上方題目可點下方去處,支持在線編程~ 象棋移動_scratch_少兒編程題庫學習中心-嗨信奧 程序演示可點下方,支持源碼和素材獲取~ 象棋移動-scratch作品-少兒編程題庫學習中心-嗨信奧 題庫收集了歷屆各白名單賽事真題和權威機構考級…

Cesium 實戰 26 - 自定義紋理材質 - 實際應用之飛線(拋物線)

Cesium 實戰 26 - 自定義紋理材質 - 實際應用之飛線(拋物線) 前言核心代碼完整代碼在線示例前言 之前總結了項目實戰用常用的自定義紋理材質,包括擴散、預警、動態線等,后續還會不定期增加一些效果。 除了單個的自定義紋理材質介紹,文章系列后期會增加一些實際項目應用、…

Apache Airflow

目錄 Apache Airflow是什么 CVE-2020-11978(Airflow 示例dag中的命令注入) CVE-2020-11981(Airflow Celery消息中間件命令執行) CVE-2020-17526(Airflow 默認密鑰導致的權限繞過) Apache Airflow是什么 Airflow是一個以編程方式編寫,安排和監視工作流的平臺。 …

【Python Cookbook】迭代器與生成器(四)

目錄 案例 目錄 案例 迭代器與生成器(一)1.手動遍歷迭代器2.代理迭代3.使用生成器創建新的迭代模式4.實現迭代器協議迭代器與生成器(三)9.排列組合的迭代10.序列上索引值迭代11.同時迭代多個序列12.不同集合上元素的迭代迭代器與生…

React 播客專欄 Vol.16|useRef 和 useMemo 是干嘛的?

👋 歡迎回到《前端達人 React 播客書單》第 16 期(正文內容為學習筆記摘要,音頻內容是詳細的解讀,方便你理解),請點擊下方收聽 視頻版 🎙 歡迎來到《前端達人 播客書單》第 16 期。 今天我們來…

漫談英偉達GPU架構進化史:從Celsius到Blackwell

在英偉達官網,我們可以清晰地看到其從1999年Celsius到2024年Blackwell的20+代架構演進。這一歷程猶如一部波瀾壯闊的科技史詩,見證了英偉達在GPU領域的卓越創新與持續引領。 NVIDIA GPU架構變遷路線: 年份 NV GPU架構變遷 2025 Blackwell 2.0 2024 Blackwell 2023-2024 Hopp…

車載通信網絡 --- CAN FD與CAN XL

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

DM達夢數據庫開啟SQL日志記錄功能

DM達夢數據庫開啟SQL日志記錄功能 配置SQL日志(非必須的配置步驟,與主備集群配置無關,如果沒有需求可以跳過配置SQL日志) sqllog.ini 配置文件用于SQL日志的配置,當且僅當 INI(dm.ini) 參數 SV…

【HW系列】—C2遠控服務器(webshell鏈接工具, metasploit、cobaltstrike)的漏洞特征流量特征

文章目錄 蟻劍、冰蝎、哥斯拉一、蟻劍(AntSword)流量特征二、冰蝎(Behinder)流量特征三、哥斯拉(Godzilla)流量特征 metasploit、cobaltstrike一、Metasploit流量特征二、CobaltStrike流量特征三、檢測與防…

手機平板等設備租賃行業MDM方案解析

目錄 引言:MDM 在租賃行業的重要性日益凸顯 用戶場景:租賃公司面臨的主要挑戰 1. 設備丟失、逾期未還 2. 手動配置和恢復效率低 3. 非授權使用頻繁 4. 時區設置混亂影響運維 5. 缺乏實時監管能力 EasyControl MDM:租賃設備的遠程管控…

前端面試核心考點全解析

前端面試常見問題及解析大綱 核心技術篇 HTML相關問題 1. HTML5新特性解析 語義化標簽&#xff08;<header>、<section>等&#xff09;的作用與示例本地存儲&#xff08;localStorage與sessionStorage&#xff09;的差異 localStorage.setItem(key, value); c…

Selenium 測試框架 - Kotlin

??Selenium Kotlin 實踐指南:以百度搜索為例的完整測試示例 隨著測試自動化的普及,Selenium 已成為 Web 自動化測試的事實標準,而 Kotlin 憑借其簡潔語法和高安全性,越來越受到開發者歡迎。本指南將通過一個完整的實戰案例——在百度中執行搜索操作,來展示如何使用 Sele…

vscode調試stm32,Cortex Debug的配置文件lanuch.json如何寫,日志

https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相關屬性。 // 懸停以查看現有屬性的描述。// 欲了解更多信息&#xff0c;請訪問: https://go.microsoft.com/fwlink/?li…

反范式設計應用場景解析

反范式設計應用場景解析 1. 反范式設計核心概念 反范式設計是指為了特定性能優化目標,在數據庫設計中故意違反關系數據庫的范式規則(通常是第三范式或BC范式),通過引入冗余數據或合并表結構來提升查詢效率的設計方法。 關鍵結論:反范式不是對范式理論的否定,而是在特定…

算法-js-子集

題&#xff1a;給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 方法一&#xff1a;迭代法 核心邏輯&#xff1a;動態擴展子集&#xff0c; 小規…

python里的NumPy算法

NumPy&#xff08;Numerical Python&#xff09;是 Python 中用于科學計算的基礎庫&#xff0c;提供了高性能的多維數組對象、矩陣運算以及大量數學函數庫。其核心優勢在于通過向量化操作替代傳統循環&#xff0c;大幅提升計算效率&#xff0c;尤其適合處理大規模數據的算法實現…

HarmonyOS優化應用文件上傳下載慢問題性能優化

一、概述 在開發應用時&#xff0c;客戶端與服務器之間數據交換的效率取決于文件傳輸的性能。一個數據交換性能較低的應用會導致其在加載過程中耗費較長時間&#xff0c;在很多的場景造成頁面卡頓&#xff0c;極大的影響了用戶體驗。相反&#xff0c;一個數據交換高效的應用&a…

64、【OS】【Nuttx】任務休眠與喚醒:clock_nanosleep

背景 之前的 blog 63、【OS】【Nuttx】任務休眠與喚醒&#xff1a;sleep 分析了任務休眠中的 sleep 函數&#xff0c;下面繼續來分析下 sleep 函數中的核心功能 clock_nanosleep clock_nanosleep usleep 上篇 blog 分析了 sleep 函數&#xff0c;其核心功能封裝到了 clock_…

【生產實踐】華為存儲XSG1在RHEL 7.x/8.x上的多路徑配置操作手冊(生產環境)

一、概述 本手冊針對Red Hat Enterprise Linux 7.x/8.x系統與華為XSG1存儲設備的多路徑I/O&#xff08;MPIO&#xff09;配置&#xff0c;通過優化路徑策略實現高可用、負載均衡及故障容錯&#xff0c;適配華為存儲硬件特性&#xff0c;滿足生產環境需求。 二、參數解析與配置…