Python + Chrome抓取AJAX動(dòng)態(tài)數(shù)據(jù)的兩種方法
前言
在現(xiàn)代 Web 開(kāi)發(fā)中,AJAX(Asynchronous JavaScript and XML) 技術(shù)被廣泛應(yīng)用于動(dòng)態(tài)加載數(shù)據(jù),使得網(wǎng)頁(yè)能夠在不刷新的情況下更新內(nèi)容。然而,這也給傳統(tǒng)爬蟲(chóng)帶來(lái)了挑戰(zhàn)——使用 <font style="color:rgb(64, 64, 64);">requests</font>
+ <font style="color:rgb(64, 64, 64);">BeautifulSoup</font>
只能獲取初始 HTML,而無(wú)法捕獲 AJAX 返回的動(dòng)態(tài)數(shù)據(jù)。
解決方案:
- Selenium + ChromeDriver:模擬瀏覽器行為,等待 AJAX 數(shù)據(jù)加載完成后再抓取。
- 直接分析 AJAX 請(qǐng)求:通過(guò) Chrome DevTools 捕獲 API 接口,用
requests
直接請(qǐng)求數(shù)據(jù)(更高效)。
本文將詳細(xì)介紹 Python + Chrome 如何抓取 AJAX 動(dòng)態(tài)數(shù)據(jù),并提供兩種方法的完整實(shí)現(xiàn)代碼。
1. 理解 AJAX 動(dòng)態(tài)加載
1.1 AJAX 工作原理
- 用戶訪問(wèn)網(wǎng)頁(yè) → 瀏覽器加載初始 HTML。
- JavaScript 發(fā)起 AJAX 請(qǐng)求(通常是
fetch
或XMLHttpRequest
)。 - 服務(wù)器返回 JSON/XML 數(shù)據(jù) → 前端動(dòng)態(tài)渲染到頁(yè)面。
1.2 傳統(tǒng)爬蟲(chóng)的問(wèn)題
import requests from bs4 import BeautifulSoup response = requests.get("https://example.com") soup = BeautifulSoup(response.text, "html.parser") # 只能獲取初始 HTML,無(wú)法得到 AJAX 數(shù)據(jù)!
2. 方法 1:使用 Selenium + Chrome 模擬瀏覽器
2.1 環(huán)境準(zhǔn)備
安裝必要的庫(kù)
2.2 示例:爬取動(dòng)態(tài)加載的新聞列表
假設(shè)目標(biāo)網(wǎng)站(如新浪新聞)通過(guò) AJAX 加載更多新聞。
from selenium import webdriver from selenium.webdriver.chrome.service import Service 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.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager import time # 設(shè)置代理信息 proxyHost = "www.16yun.cn" proxyPort = "5445" proxyUser = "16QMSOML" proxyPass = "280651" # 配置 Chrome 代理 chrome_options = Options() chrome_options.add_argument(f"--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}") # 啟動(dòng) Chrome driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) driver.get("https://news.sina.com.cn/") # 等待 AJAX 內(nèi)容加載(假設(shè)新聞列表通過(guò) AJAX 渲染) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".news-item")) ) except: print("超時(shí),未找到新聞列表") # 提取新聞標(biāo)題和鏈接 news_items = driver.find_elements(By.CSS_SELECTOR, ".news-item") for item in news_items: title = item.find_element(By.CSS_SELECTOR, "a").text link = item.find_element(By.CSS_SELECTOR, "a").get_attribute("href") print(f"標(biāo)題: {title}\n鏈接: {link}\n") # 關(guān)閉瀏覽器 driver.quit()
2.3 關(guān)鍵點(diǎn)說(shuō)明
WebDriverWait
:顯式等待 AJAX 數(shù)據(jù)渲染完成。EC.presence_of_element_located
:檢查目標(biāo)元素是否已加載。find_elements
+ CSS/XPath:定位動(dòng)態(tài)生成的內(nèi)容。
3. 方法 2:直接抓取 AJAX API 數(shù)據(jù)(更高效)
3.1 分析 AJAX 請(qǐng)求
- 打開(kāi) Chrome → F12(開(kāi)發(fā)者工具) → Network(網(wǎng)絡(luò)) 標(biāo)簽頁(yè)。
- 刷新頁(yè)面,篩選 XHR/fetch 請(qǐng)求。
- 找到返回目標(biāo)數(shù)據(jù)的 API 接口(通常是
json
格式)。
3.2 示例:爬取豆瓣電影 AJAX 數(shù)據(jù)
豆瓣電影首頁(yè)通過(guò) AJAX 加載熱門(mén)電影列表。
步驟 1:分析 API
- 打開(kāi)
https://movie.douban.com
→ F12 → Network → 篩選 XHR。 - 發(fā)現(xiàn) API:
https://movie.douban.com/j/search_subjects?...
步驟 2:用 Python 直接請(qǐng)求 API
import requests import json # 豆瓣電影 AJAX API url = "https://movie.douban.com/j/search_subjects?type=movie&tag=熱門(mén)&sort=recommend&page_limit=20&page_start=0" 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) data = response.json() # 直接解析 JSON # 提取電影信息 for movie in data["subjects"]: print(f"電影名: {movie['title']}") print(f"評(píng)分: {movie['rate']}") print(f"鏈接: {movie['url']}\n")
3.3 優(yōu)勢(shì)與限制
- 優(yōu)勢(shì):速度快,無(wú)需加載完整頁(yè)面。
- 限制:需手動(dòng)分析 API,部分接口可能有加密或鑒權(quán)。
4. 總結(jié)
方法 | 適用場(chǎng)景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|
Selenium | 復(fù)雜動(dòng)態(tài)渲染頁(yè)面 | 能模擬完整瀏覽器行為 | 速度慢,資源占用高 |
直接請(qǐng)求 API | 結(jié)構(gòu)化數(shù)據(jù)(如 JSON) | 高效,速度快 | 需手動(dòng)分析接口,可能受限 |
最佳實(shí)踐建議
- 優(yōu)先分析 AJAX API:如果目標(biāo)網(wǎng)站有清晰的接口,直接請(qǐng)求更高效。
- Selenium 備用:適用于無(wú)法直接獲取 API 或需要交互的頁(yè)面。
- 遵守 Robots.txt:避免高頻請(qǐng)求,防止被封禁。
到此這篇關(guān)于Python + Chrome抓取AJAX動(dòng)態(tài)數(shù)據(jù)的兩種方法的文章就介紹到這了,更多相關(guān)Python Chrome抓取AJAX數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)分析中Groupby用法之通過(guò)字典或Series進(jìn)行分組的實(shí)例
下面小編就為大家分享一篇Python數(shù)據(jù)分析中Groupby用法之通過(guò)字典或Series進(jìn)行分組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12python中nan與inf轉(zhuǎn)為特定數(shù)字方法示例
這篇文章主要給大家介紹了將python中nan與inf轉(zhuǎn)為特定數(shù)字的方法,文中給出了詳細(xì)的示例代碼和運(yùn)行結(jié)果,對(duì)大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條)
這篇文章主要介紹了Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python map及filter函數(shù)使用方法解析
這篇文章主要介紹了Python map及filter函數(shù)使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08wtfPython—Python中一組有趣微妙的代碼【收藏】
Wtfpython講解了大量的Python編譯器的內(nèi)容。這篇文章主要介紹了wtfPython-Python中一些奇妙的代碼,感興趣的朋友跟隨腳本之家小編一起看看吧2018-08-08關(guān)于Python 常用獲取元素 Driver 總結(jié)
今天小編就為大家分享一篇關(guān)于Python 常用獲取元素 Driver 總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Pycharm配置Qt Designer及Pyuic的實(shí)現(xiàn)方法
本文介紹了如何安裝Qt designer和Pyuic以及他們的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07