Python + Chrome抓取AJAX动态数据的两种方法

 更新时间:2025年04月15日 10:33:39   作者:小白学大数据  
在现代 Web 开发中,AJAX技术被广泛应用于动态加载数据,使得网页能够在不刷新的情况下更新内容,本文将详细介绍 Python + Chrome 如何抓取 AJAX 动态数据,并提供两种方法的完整实现代码,需要的朋友可以参考下

前言

在现代 Web 开发中,AJAX(Asynchronous JavaScript and XML) 技术被广泛应用于动态加载数据,使得网页能够在不刷新的情况下更新内容。然而,这也给传统爬虫带来了挑战——使用 <font style="color:rgb(64, 64, 64);">requests</font> + <font style="color:rgb(64, 64, 64);">BeautifulSoup</font> 只能获取初始 HTML,而无法捕获 AJAX 返回的动态数据。

解决方案:

  • Selenium + ChromeDriver:模拟浏览器行为,等待 AJAX 数据加载完成后再抓取。
  • 直接分析 AJAX 请求:通过 Chrome DevTools 捕获 API 接口,用 requests 直接请求数据(更高效)。

本文将详细介绍 Python + Chrome 如何抓取 AJAX 动态数据,并提供两种方法的完整实现代码。

1. 理解 AJAX 动态加载

1.1 AJAX 工作原理

  • 用户访问网页 → 浏览器加载初始 HTML。
  • JavaScript 发起 AJAX 请求(通常是 fetch 或 XMLHttpRequest)。
  • 服务器返回 JSON/XML 数据 → 前端动态渲染到页面。

1.2 传统爬虫的问题

import requests
from bs4 import BeautifulSoup

response = requests.get("https://example.com")
soup = BeautifulSoup(response.text, "html.parser")
# 只能获取初始 HTML,无法得到 AJAX 数据!

2. 方法 1:使用 Selenium + Chrome 模拟浏览器

2.1 环境准备

安装必要的库

2.2 示例:爬取动态加载的新闻列表

假设目标网站(如新浪新闻)通过 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 内容加载(假设新闻列表通过 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 数据渲染完成。
  • EC.presence_of_element_located:检查目标元素是否已加载。
  • find_elements + CSS/XPath:定位动态生成的内容。

3. 方法 2:直接抓取 AJAX API 数据(更高效)

3.1 分析 AJAX 请求

  1. 打开 Chrome → F12(开发者工具) → Network(网络) 标签页。
  2. 刷新页面,筛选 XHR/fetch 请求。
  3. 找到返回目标数据的 API 接口(通常是 json 格式)。

3.2 示例:爬取豆瓣电影 AJAX 数据

豆瓣电影首页通过 AJAX 加载热门电影列表。

步骤 1:分析 API

  • 打开 https://movie.douban.com → F12 → Network → 筛选 XHR。
  • 发现 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 优势与限制

  • 优势:速度快,无需加载完整页面。
  • 限制:需手动分析 API,部分接口可能有加密或鉴权。

4. 总结

方法适用场景优点缺点
Selenium复杂动态渲染页面能模拟完整浏览器行为速度慢,资源占用高
直接请求 API结构化数据(如 JSON)高效,速度快需手动分析接口,可能受限

最佳实践建议

  • 优先分析 AJAX API:如果目标网站有清晰的接口,直接请求更高效。
  • Selenium 备用:适用于无法直接获取 API 或需要交互的页面。
  • 遵守 Robots.txt:避免高频请求,防止被封禁。

到此这篇关于Python + Chrome抓取AJAX动态数据的两种方法的文章就介绍到这了,更多相关Python Chrome抓取AJAX数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python数据分析中Groupby用法之通过字典或Series进行分组的实例

    Python数据分析中Groupby用法之通过字典或Series进行分组的实例

    下面小编就为大家分享一篇Python数据分析中Groupby用法之通过字典或Series进行分组的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • python中nan与inf转为特定数字方法示例

    python中nan与inf转为特定数字方法示例

    这篇文章主要给大家介绍了将python中nan与inf转为特定数字的方法,文中给出了详细的示例代码和运行结果,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    这篇文章主要介绍了Python OpenCV 图像区域轮廓标记(框选各种小纸条),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python map及filter函数使用方法解析

    Python map及filter函数使用方法解析

    这篇文章主要介绍了Python map及filter函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • wtfPython—Python中一组有趣微妙的代码【收藏】

    wtfPython—Python中一组有趣微妙的代码【收藏】

    Wtfpython讲解了大量的Python编译器的内容。这篇文章主要介绍了wtfPython-Python中一些奇妙的代码,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • 关于Python 常用获取元素 Driver 总结

    关于Python 常用获取元素 Driver 总结

    今天小编就为大家分享一篇关于Python 常用获取元素 Driver 总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 详解Python with/as使用说明

    详解Python with/as使用说明

    这篇文章主要介绍了Python with/as使用说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 基于Python制作个抢红包的工具

    基于Python制作个抢红包的工具

    快过年了,刚刚收到了两个消息,一个好消息,一个坏消息。好消息就是微信群里有人要发红包,坏消息是不一定能都抢到。所以本文就来用Python做一个抢红包工具,需要的可以参考一下
    2023-01-01
  • Pycharm配置Qt Designer及Pyuic的实现方法

    Pycharm配置Qt Designer及Pyuic的实现方法

    本文介绍了如何安装Qt designer和Pyuic以及他们的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python搭建HTTP服务过程图解

    Python搭建HTTP服务过程图解

    这篇文章主要介绍了Python搭建HTTP服务过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论