首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python + Requests库爬取动态Ajax分页数据

Python + Requests库爬取动态Ajax分页数据

原创
作者头像
小白学大数据
发布于 2025-07-28 08:48:05
发布于 2025-07-28 08:48:05
1411
举报

引言

在当今的互联网环境中,许多网站采用Ajax(Asynchronous JavaScript and XML技术动态加载数据,以提高用户体验。传统的爬虫方法(如直接解析HTML)无法获取这些动态生成的内容,因此需要分析Ajax请求,模拟浏览器发送HTTP请求来获取数据。

本文将介绍如何使用Python + Requests库爬取动态Ajax分页数据,包括:

  1. 分析Ajax请求,找到数据接口
  2. 模拟请求参数,构造翻页逻辑
  3. 解析返回数据(通常是JSON格式)
  4. 存储数据(如CSV或数据库

我们将以某电商网站(模拟案例)为例,演示如何爬取分页商品数据。

1. 分析Ajax请求

1.1 目标网站分析

假设目标网站的商品列表采用Ajax动态加载,URL结构如下:

https://example.com/api/products?page=1&size=10

  • page:当前页码
  • size:每页数据量

1.2 使用浏览器开发者工具

  1. 打开Chrome/Firefox开发者工具(F12)
  2. 进入Network(网络)选项卡
  3. 选择XHR(Ajax请求)
  4. 翻页时观察新增的请求,找到数据接口

https://example.com/ajax-analysis.png

1.3 确定请求参数

观察请求的:

  • URL(是否包含页码参数)
  • Headers(是否需要User-AgentReferer等)
  • 请求方式(GET/POST)
  • 返回数据格式(通常是JSON)

2. Python + Requests 实现爬取

2.1 安装依赖库

2.2 构造请求函数

代码语言:txt
AI代码解释
复制
import requests
import pandas as pd

def fetch_ajax_data(page):
    url = "https://example.com/api/products"
    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",
        "Referer": "https://example.com/products",
    }
    params = {
        "page": page,
        "size": 10,
    }
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()  # 假设返回的是JSON数据
    else:
        print(f"请求失败,状态码:{response.status_code}")
        return None

2.3 解析数据并翻页

代码语言:txt
AI代码解释
复制
def crawl_ajax_pages(max_pages=5):
    all_products = []
    for page in range(1, max_pages + 1):
        print(f"正在爬取第 {page} 页...")
        data = fetch_ajax_data(page)
        if data and "products" in data:
            all_products.extend(data["products"])
        else:
            print(f"第 {page} 页无数据或解析失败")
    return all_products

2.4 存储数据(CSV)

代码语言:txt
AI代码解释
复制
def save_to_csv(data, filename="products.csv"):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding="utf-8-sig")
    print(f"数据已保存至 {filename}")

# 执行爬取
if __name__ == "__main__":
    products = crawl_ajax_pages(max_pages=5)
    if products:
        save_to_csv(products)

3. 进阶优化

3.1 处理反爬机制

  • 随机User-Agent:防止被识别为爬虫
  • 请求间隔:避免被封IP
  • 代理IP:应对IP限制
代码语言:txt
AI代码解释
复制
import time
from fake_useragent import UserAgent

def fetch_ajax_data_safe(page):
    ua = UserAgent()
    headers = {
        "User-Agent": ua.random,
        "Referer": "https://example.com/products",
    }
    time.sleep(1)  # 避免请求过快
    # 其余代码同上...

3.2 异常处理

代码语言:txt
AI代码解释
复制
try:
    response = requests.get(url, headers=headers, params=params, timeout=10)
    response.raise_for_status()  # 检查HTTP错误
except requests.exceptions.RequestException as e:
    print(f"请求异常:{e}")
    return None

3.3 多线程/异步爬取(提高效率)

代码语言:txt
AI代码解释
复制
import concurrent.futures

def crawl_with_threads(max_pages=5, workers=3):
    with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
        futures = [executor.submit(fetch_ajax_data, page) for page in range(1, max_pages + 1)]
        all_products = []
        for future in concurrent.futures.as_completed(futures):
            data = future.result()
            if data:
                all_products.extend(data.get("products", []))
    return all_products

4. 完整代码示例

代码语言:txt
AI代码解释
复制
import requests
import pandas as pd
import time
from fake_useragent import UserAgent

# 代理服务器配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 构造代理字典
proxies = {
    "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
    "https": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
}

def fetch_ajax_data(page):
    ua = UserAgent()
    url = "https://example.com/api/products"
    headers = {
        "User-Agent": ua.random,
        "Referer": "https://example.com/products",
    }
    params = {
        "page": page,
        "size": 10,
    }
    try:
        time.sleep(1)  # 防止请求过快
        # 添加proxies参数使用代理
        response = requests.get(
            url,
            headers=headers,
            params=params,
            timeout=10,
            proxies=proxies
        )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"第 {page} 页请求失败:{e}")
        return None

def crawl_ajax_pages(max_pages=5):
    all_products = []
    for page in range(1, max_pages + 1):
        print(f"正在爬取第 {page} 页...")
        data = fetch_ajax_data(page)
        if data and "products" in data:
            all_products.extend(data["products"])
        else:
            print(f"第 {page} 页无数据或解析失败")
    return all_products

def save_to_csv(data, filename="products.csv"):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding="utf-8-sig")
    print(f"数据已保存至 {filename}")

if __name__ == "__main__":
    products = crawl_ajax_pages(max_pages=5)
    if products:
        save_to_csv(products)

5. 总结

本文介绍了如何使用Python + Requests库爬取动态Ajax分页数据,核心步骤包括:

  1. 分析Ajax请求(使用浏览器开发者工具)
  2. 模拟请求参数(Headers、Query Params)
  3. 翻页逻辑实现(循环请求不同页码)
  4. 数据存储(CSV、数据库等)
  5. 反爬优化(随机UA、代理IP、请求间隔)

这种方法适用于大多数动态加载数据的网站,如电商、新闻、社交媒体等。如果需要更复杂的动态渲染(如JavaScript生成内容),可结合SeleniumPlaywright实现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
Ajax处理起来是很麻烦,而且requests本来是用于请求静态数据的,而Ajax需求模拟浏览器点击才可以采集,所以用selenium或者palywright这样的自动化工具比较容易处理Ajax。除了动态数据外,还有很多反爬机制限制爬虫,我一般会用第三方平台亮数据的方案,亮数据有专门的网页抓取浏览器,和普通浏览器一样,但它内置了CAPTCHA 解锁功能,可以自动的切换ip池,保证爬虫的稳定性,另外它还能设置请求头,处理cookies,防止被识别为人机,这就大大降低了被封锁的风险。最主要的是亮数据很安全,完全遵守网站规则,只采集公开数据,你也只能用于研究分析,没啥顾虑。
Ajax处理起来是很麻烦,而且requests本来是用于请求静态数据的,而Ajax需求模拟浏览器点击才可以采集,所以用selenium或者palywright这样的自动化工具比较容易处理Ajax。除了动态数据外,还有很多反爬机制限制爬虫,我一般会用第三方平台亮数据的方案,亮数据有专门的网页抓取浏览器,和普通浏览器一样,但它内置了CAPTCHA 解锁功能,可以自动的切换ip池,保证爬虫的稳定性,另外它还能设置请求头,处理cookies,防止被识别为人机,这就大大降低了被封锁的风险。最主要的是亮数据很安全,完全遵守网站规则,只采集公开数据,你也只能用于研究分析,没啥顾虑。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
12306旅游产品数据抓取:Python+API逆向分析
12306作为中国铁路官方售票平台,不仅提供火车票预订服务,还涵盖了丰富的旅游产品,如跟团游、自由行、酒店套餐等。这些数据对旅游行业分析、价格监控、竞品研究等具有重要价值。然而,12306的数据接口通常有严格的访问限制和反爬机制,直接爬取网页可能效率低下且容易被封禁。
小白学大数据
2025/08/05
1030
自动化爬虫:requests定时爬取前程无忧最新职位
在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。
小白学大数据
2025/05/30
2000
自动化爬虫:requests定时爬取前程无忧最新职位
自动化爬虫:requests定时爬取前程无忧最新职位
在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。
小白学大数据
2025/05/29
1440
淘宝店铺采集工具,采集淘宝卖家商家,python代码框架
下载地址:https://www.pan38.com/yun/share.php?code=JCnzE 提取密码:1199
用户11719788
2025/07/10
1170
产品销量数据爬虫通用模板
最近遇到各行各业的需要爬取销售数据,每次写一个教程相对麻烦,所以思前考后我还是觉得写一个通用模板更适合。所以模板需要足够的灵活性,让用户能够自定义选择器。比如,产品标题、价格、销量的CSS选择器可能因网站而异,所以可能需要能够传入这些参数。此外,分页处理也很重要,因为销量数据通常分布在多个页面。分页逻辑可能有不同形式,比如URL参数递增或者JavaScript加载,这里可能需要用户指定分页的URL模式或最大页数。
华科云商小徐
2025/05/15
1290
多线程Python爬虫:加速大规模学术文献采集
在学术研究过程中,高效获取大量文献数据是许多科研工作者和数据分析师的需求。然而,传统的单线程爬虫在面对大规模数据采集时,往往效率低下,难以满足快速获取数据的要求。因此,利用多线程技术优化Python爬虫,可以显著提升数据采集速度,尤其适用于爬取学术数据库(如PubMed、IEEE Xplore、Springer等)。
小白学大数据
2025/07/21
1620
Python爬虫实战:如何利用代理IP高效爬取Bilibili视频评论数据(附完整代码)
在当今时代,Bilibili(哔哩哔哩)作为国内知名的弹幕视频网站,以内容创作为载体,拥有海量活跃的用户,其评论数据也承载了用户的真实观看体验,这些评论数据对于了解用户喜好、分析内容创作趋势以及进行市场调研具有重要价值。但众所周知,Bilibili的反爬虫机制较为严格,有用相对完善的反爬虫体系(如IP检测、频率限制及登录验证等),一旦爬取任务超出阈值,IP很容易被限制或封禁。
阿秋数据采集
2025/03/26
2860
python电商数据爬虫代码示例
电商网站通常有反爬机制,比如频率限制、验证码等,所以代码中可能需要加入一些应对措施,比如设置请求头、使用代理、延迟请求等。
华科云商小徐
2025/05/07
3080
多线程Python爬虫:加速大规模学术文献采集
在学术研究过程中,高效获取大量文献数据是许多科研工作者和数据分析师的需求。然而,传统的单线程爬虫在面对大规模数据采集时,往往效率低下,难以满足快速获取数据的要求。因此,利用多线程技术优化Python爬虫,可以显著提升数据采集速度,尤其适用于爬取学术数据库(如PubMed、IEEE Xplore、Springer等)。
小白学大数据
2025/07/22
1000
优化 Python 爬虫性能:异步爬取新浪财经大数据
传统的同步爬虫(如requests+BeautifulSoup)在请求网页时,必须等待服务器返回响应后才能继续下一个请求。这种阻塞式I/O操作在面对大量数据时存在以下问题:
小白学大数据
2025/06/19
1890
Python爬取知乎评论:多线程与异步爬虫的性能优化
1. 知乎评论爬取的技术挑战 知乎的评论数据通常采用动态加载(Ajax),这意味着直接使用requests+BeautifulSoup无法获取完整数据。此外,知乎还设置了反爬机制,包括: ●请求头(Headers)验证(如User-Agent、Referer) ●Cookie/Session 校验(未登录用户只能获取部分数据) ●频率限制(频繁请求可能导致IP被封) 因此,我们需要: 1模拟浏览器请求(携带Headers和Cookies) 2解析动态API接口(而非静态HTML) 3优化爬取速度(多线程/异步)
小白学大数据
2025/07/08
1570
requests用法基础-进阶
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
xbhog
2019/11/04
5760
requests用法基础-进阶
如何动态调整Python爬虫的Request请求延迟
在网络爬虫开发中,合理控制请求延迟(Request Delay)是避免被封禁、提高爬取效率的关键。固定延迟(如 time.sleep(1))虽然简单,但在面对不同网站的反爬策略时可能不够灵活。动态调整请求延迟能够更智能地适应目标网站的变化,提高爬虫的稳定性和效率。
小白学大数据
2025/04/21
2290
Python使用爬虫ip抓取热点新闻
用户可能不太清楚如何获取和集成代理IP到爬虫中。我需要提到两种方式:免费代理和付费代理,并给出示例代码。同时,要提醒用户免费代理可能不稳定,生产环境建议用付费服务。代理的格式通常是http和https,需要在requests库中正确设置proxies参数。
华科云商小徐
2025/05/06
2090
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
猫头虎
2025/06/02
2.8K0
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
多线程爬虫优化:快速爬取并写入CSV
在数据驱动的时代,爬虫技术已成为获取网络数据的重要手段。然而,随着数据量的不断增加,单线程爬虫的效率逐渐难以满足需求。多线程爬虫通过并行处理,能够显著提升爬取速度,同时将数据快速写入CSV文件,为后续的数据分析和应用提供支持。本文将详细介绍多线程爬虫的优化策略,并通过一个完整的实战案例展示如何实现高效的数据爬取和存储。
小白学大数据
2025/06/16
2290
网络爬虫 | 动态渲染信息爬取--Ajax
在许多网页上显示数据并不是服务端一次性返回,而是向服务器单独发送一个或多个异步请求,服务端才会返回JSON格式数据信息。
数据STUDIO
2021/06/24
7110
社交媒体分析:破解无限滚动的技术实践
本方案已在多个商业分析系统中验证,日均处理请求量超过 2 万次,持续稳定运行超过 1 个月。建议根据业务需求调整分页深度和采集频率,以避免对目标网站造成过大压力。
jackcode
2025/03/18
1730
社交媒体分析:破解无限滚动的技术实践
AI数据采集的利器:动态住宅代理与网页抓取API实战解析
在AI大模型的训练中,高质量的海量数据集是不可或缺的。无论是用于训练语言模型(如ChatGPT)、计算机视觉模型,还是推荐系统,数据的质量、广度和时效性都会直接影响模型的性能。然而,许多数据源(如社交媒体、新闻网站、学术论文库)都设置了严格的访问限制,包括IP封禁、验证码、数据加密等。
默 语
2025/03/20
2410
AI数据采集的利器:动态住宅代理与网页抓取API实战解析
多语言爬虫实现网站价格监控
最近突发奇想想用多种代码来爬取数据做价格监控。常见的比如Python、JavaScript(Node.js)、或者Go?不过通常来说,Python应该是首选,因为它的库比较丰富,比如requests和BeautifulSoup,或者Scrapy。不过客户要求多种代码,所以我应该涵盖至少几种不同的方法。
华科云商小徐
2025/05/08
2090
推荐阅读
相关推荐
12306旅游产品数据抓取:Python+API逆向分析
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档