当前位置: 代码网 > it编程>前端脚本>Python > Python + Chrome抓取AJAX动态数据的两种方法

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

2025年04月15日 Python 我要评论
前言在现代web 开发中,ajax(asynchronous javascript and xml)技术被广泛应用于动态加载数据,使得网页能够在不刷新的情况下更新内容。然而,这也给传统爬虫带来了挑战&

前言

在现代 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数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com