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

