爬蟲進階:Selenium與Ajax的無縫集成

00475.png

爬蟲與Ajax的挑戰

Ajax(Asynchronous JavaScript and XML)允許網頁在不重新加載整個頁面的情況下與服務器交換數據并更新部分內容。這為用戶帶來了更好的體驗,但同時也使得爬蟲在抓取數據時面臨以下挑戰:

  1. 動態內容加載:Ajax請求異步加載數據,爬蟲需要等待數據加載完成才能抓取。
  2. JavaScript依賴:Ajax通常依賴JavaScript執行,而傳統爬蟲不執行JavaScript。
  3. 元素定位:動態加載的內容可能導致元素的ID或類名發生變化,使得定位變得困難。

Selenium的優勢

Selenium是一個用于自動化Web應用程序測試的工具,它能夠模擬用戶的真實交互,包括處理JavaScript和Ajax。使用Selenium,爬蟲可以:

  1. 執行JavaScript:Selenium可以執行頁面中的JavaScript代碼。
  2. 等待Ajax請求:Selenium提供了等待機制,可以等待Ajax請求完成。
  3. 元素定位:Selenium可以定位到動態生成的元素。

環境搭建

要使用Selenium,首先需要安裝Selenium庫和對應的WebDriver。以下是Python環境下的安裝步驟:

pip install selenium

確保下載了與瀏覽器對應的WebDriver,例如Chrome的ChromeDriver,并將其路徑添加到系統PATH中。

Selenium與Ajax集成的基本步驟

1. 初始化WebDriver

from selenium import webdriverdriver = webdriver.Chrome()

2. 訪問目標網頁

driver.get("http://example.com/ajax")

3. 等待Ajax請求完成

Selenium提供了顯式等待和隱式等待兩種方式來處理Ajax請求。

顯式等待

顯式等待允許你設置等待條件和超時時間。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "dynamic-element")))
隱式等待

隱式等待為所有查找操作設置全局等待時間。

driver.implicitly_wait(10)  # 等待10秒
element = driver.find_element_by_id("dynamic-element")

4. 抓取數據

一旦Ajax請求完成,就可以使用Selenium提供的API抓取數據。

data = element.text
print(data)

5. 關閉WebDriver

完成數據抓取后,關閉WebDriver。

driver.quit()

實現代碼示例

以下是一個使用Selenium處理Ajax動態加載內容的爬蟲示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.proxy import Proxy, ProxyType# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 創建代理對象
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyHost}:{proxyPort}"
proxy.ssl_proxy = f"{proxyHost}:{proxyPort}"
proxy.add_to_capabilities(webdriver.DesiredCapabilities.CHROME)# 初始化WebDriver,添加代理
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}/')
driver = webdriver.Chrome(options=chrome_options)# 目標網頁URL
url = "http://example.com/ajax-content"# 打開網頁
driver.get(url)# 顯式等待Ajax加載完成
wait = WebDriverWait(driver, 20)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ajax-loaded")))# 抓取需要的數據
data = driver.find_element_by_class_name("ajax-loaded").text# 輸出數據
print(data)# 關閉瀏覽器
driver.quit()

性能優化與最佳實踐

  1. 合理設置等待時間:避免過長的等待時間,影響爬蟲效率。
  2. 異常處理:增加異常處理邏輯,確保爬蟲的穩定性。
  3. 元素定位策略:使用更穩定的元素定位策略,如CSS選擇器或XPath。
  4. 資源管理:確保及時關閉WebDriver,釋放資源。

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

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

相關文章

go語言 函數和包

go語言 函數和包 一、函數 在Go語言中,函數是執行特定任務的自包含代碼塊。 1.函數的定義 函數通過func關鍵字定義,格式如下: func 函數名(形參 形參類型, 形參 形參類型) 返回值類型 {函數體return 返回值 }2.基礎函數類型 無參數無返回…

vue中數組出現__ob__: Observer屬性,導致不能正確使用問題解決

直接上圖,如下圖,數組中出現__ob__: Observer屬性,導致無法取值。 解決方案為:JSON.parse(JSON.stringify(數組變量名))深拷貝數組,重新生成一個可枚舉數組。 // 處理代碼如let tempIds JSON.parse(JSON.stringify(i…

一文帶你初探FreeRTOS信號量

本文記錄我初步學習FreeRTOS的信號量的知識,在此記錄分享,希望我的分享對你有所幫助! 什么是信號量 在FreeRTOS中,信號量(Semaphore)是一種用于任務間同步和資源共享的機制。信號量主要用于管理對共享資源的…

Cgi上傳文件 注意事項

//核心代碼 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //錯誤方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 參考博客&#xff1a; https://blog.cs…

GNU/Linux - 各種包管理器介紹

Linux 包管理器根據不同的發行版和包管理系統有所不同。以下是一些常見的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在圖片上添加文字

HTML如何在圖片上添加文字 當我們開發一個頁面&#xff0c;插入圖片時&#xff0c;需要有一組文字對圖片進行描述。那么HTML中如何在圖片上添加文字呢&#xff1f;這篇文章告訴你。 先讓我們來看下效果圖&#xff1a; 句子“這是一張夜空圖片”被放置在了圖片的左下角。 那么…

Leetcode.342 4的冪

給定一個整數&#xff0c;寫一個函數來判斷它是否是 4 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 4 的冪次方需滿足&#xff1a;存在整數 x 使得 n 4x 示例 1&#xff1a; 輸入&#xff1a;n 16 輸出&#xff1a;true示…

微信小程序的智慧物流平臺-計算機畢業設計源碼49796

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3研究方法 1.4開發技術 1.4.1 微信開發者工具 1.4.2 Node.JS框架 1.4.3 MySQL數據庫 1.5論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 用戶登錄流程 2.2.2 數據刪除流程 2.3 系統功能分…

C#面:ASP.NET Core Filter如何?持依賴注??

ASP.NET Core Filter可以通過依賴注入來支持。在ASP.NET Core中&#xff0c;依賴注入是一種將依賴對象提供給類的機制&#xff0c;它可以幫助我們解耦和測試代碼。 要在ASP.NET Core Filter中使用依賴注入&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物聯網教學09

ESP32CAM物聯網教學09 攝像頭配上顯示屏 小智給攝像頭配上了一塊液晶顯示屏,ESP32Cam變得更加酷炫了,應用也更加廣泛了。 TFT彩色顯示屏從第一課的CameraWebServer開始,我們一直都是利用瀏覽器來查看顯示攝像頭的視頻流,都需要借助這個網頁提供的服務。 可以讓ESP32Cam開…

【案例干貨】智能導覽智慧景區系統小程序開發主要功能

智能景區/園區導覽系統是一種利用云計算、物聯網等新技術&#xff0c;通過互聯網或移動互聯網&#xff0c;借助便攜的終端上網設備&#xff0c;為游客提供全方位、便捷化街區導航與信息服務的系統。 其主要功能可以歸納為以下幾個方面&#xff1a; 1. 街區資訊展示 信息介紹&…

纏中說禪李彪08年“假死”具體原因探討

在纏中說禪的信徒圈內&#xff0c;流傳著創始人李彪于2008年逝世的說法&#xff0c;這一事件常被描繪成一種悲壯的犧牲&#xff0c;仿佛是為了其理念與信徒們的福祉鞠躬盡瘁。然而&#xff0c;這一“逝世”既未經公開證實&#xff0c;也與李彪生前構建的高大名聲形成了某種諷刺…

短鏈接學習day2

用戶敏感信息脫敏展示&#xff1a; RequestParam 和 PathVariable的區別 注解是用于從request中接收請求的&#xff0c;兩個都可以接收參數&#xff0c;關鍵點不同的是RequestParam 是從request里面拿取值&#xff0c;而 PathVariable 是從一個URI模板里面來填充。 PathVari…

異步加載與動態加載

異步加載和動態加載在概念上有相似之處&#xff0c;但并不完全等同。 異步加載&#xff08;Asynchronous Loading&#xff09;通常指的是不阻塞后續代碼執行或頁面渲染的數據或資源加載方式。在Web開發中&#xff0c;異步加載常用于從服務器獲取數據&#xff0c;而不需要用戶等…

昇思25天學習打卡營第12天|ResNet50遷移學習

昇思25天學習打卡營第12天|ResNet50遷移學習 前言ResNet50遷移學習數據準備下載數據集 加載數據集數據集可視化 訓練模型構建Resnet50網絡固定特征進行訓練訓練和評估可視化模型預測 個人任務打卡&#xff08;讀者請忽略&#xff09;個人理解與總結 前言 非常感謝華為昇思大模型…

vite簡介

vite是新一代前端構建工具&#xff0c;vite具有優勢如下&#xff1a; 輕量快速的熱重載&#xff08;HMR&#xff09;&#xff0c;能實現快速的服務啟動。對TypeScript、JSX、CSS等支持開箱即用。真正的按需編譯&#xff0c;不再等待整個應用編譯完成。webpack構建與vite構建對…

Java 遍歷Map的方法

在Java中遍歷Map可以采用以下幾種常見方法&#xff1a; 1、使用 entrySet 遍歷 這是最常見的遍歷方式&#xff0c;同時訪問鍵值對。 for (Map.Entry<K, V> entry : map.entrySet()) {K key entry.getKey();V value entry.getValue();// 處理鍵值對} 2、遍歷 keySet 后…

【Java】CompletableFuture+Mockito單元測試不通過 Unnecessary stubbings detected

文章目錄 問題描述問題分析解決Thread.sleepget()Mockito.lenient() 問題描述 有個接口使用CompletableFuture實現的異步調用&#xff0c;現在要用Mockito寫單元測試 Testpublic void updateNumAsync() {Integer newNum 600;// updateRoleCountAsync用CompletableFuture異步調…

Jenkins 強制殺job

有時候有的jenkins job運行時間太長&#xff0c;在jenkins界面點擊x按鈕進行abort&#xff0c;會失敗&#xff1a; 這時候點擊&#xff1a; “Click here to forcibly terminate running steps” 會進一步kill 任務&#xff0c;但是也還是有殺不掉的可能性。 終極武器是jenkin…

vue3【提效】使用 VueUse 高效開發(工具庫 @vueuse/core + 新增的組件庫 @vueuse/components)

Vueuse 是一個功能強大的 Vue.js 生態系統工具庫&#xff0c;提供了可重用的組件和函數&#xff0c;幫助開發者更輕松地構建復雜的應用程序。 官網 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安裝 VueUse npm i vueuse/core vueuse/components&#xff08;可選&a…