当前位置: 首页 > article >正文

Click Event Simulation:无需浏览器触发动态数据加载

爬虫代理

一、明确目标与前置知识

目标

  • 使用 Python 模拟点击事件,直接发送 HTTP 请求采集拼多多上商品价格和优惠信息。
  • 采用爬虫代理(代理IP)的技术,设置好 Cookie 和 User-Agent,以防止被目标网站屏蔽。
  • 利用多线程技术加速数据采集,提高效率。

前置知识

  • 基本的 Python 编程知识
  • HTTP 协议与请求头、Cookie 的概念
  • 多线程编程基础(如线程、队列的使用)
  • 代理IP的使用原理

二、按步骤拆解操作

1. 环境准备

在开始编写代码之前,请确保已安装以下 Python 库:

  • requests:用于发送 HTTP 请求
  • threadingqueue:实现多线程任务调度

可使用以下命令安装必要的库(通常 Python 标准库中已自带 threadingqueue):

pip install requests
2. 配置代理IP、Cookie 和 User-Agent

在采集过程中,为了防止频繁访问被封,我们使用爬虫代理服务。以下是代理的参考配置(请将示例中的用户名、密码、域名、端口替换为实际的亿牛云提供的参数)。

import requests
import threading
from queue import Queue

# ------------------ 代理IP设置 ------------------
# 配置亿牛云爬虫代理(请替换为实际的代理信息)
proxy_user = "16YUN"       # 代理用户名
proxy_pass = "16IP"       # 代理密码
proxy_domain = "proxy.16yun.cn"  # 代理域名
proxy_port = "8080"             # 代理端口

proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_domain}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_domain}:{proxy_port}"
}

# ------------------ 设置Cookie和User-Agent ------------------
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",  # 模拟浏览器请求
    "Cookie": "your_cookie_here"  # 请将此处替换为实际的Cookie信息
}
3. 模拟点击事件加载数据(无需浏览器)

很多网站使用点击事件来动态加载数据,其实核心在于分析页面加载时实际发送的 HTTP 请求。针对拼多多,假设我们已经通过抓包工具找到了对应的接口(示例接口仅供参考),代码如下:

# ------------------ 定义目标URL及数据采集函数 ------------------
# 目标接口(示例),实际使用中需根据抓包工具确定真实接口
base_url = "https://apiv3.yangkeduo.com/..."

def fetch_product_data(page):
    """
    模拟点击加载数据,采集指定页码的商品信息
    :param page: 页码参数
    """
    # 构造请求URL,假设接口支持页码参数
    url = f"{base_url}?page={page}"
    try:
        # 发送 GET 请求,利用代理IP及设置的headers
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if response.status_code == 200:
            # 解析返回的JSON数据(示例数据格式,实际可能不同)
            data = response.json()
            # 分析并输出商品价格与优惠信息
            for product in data.get("products", []):
                title = product.get("title")
                price = product.get("price")
                discount = product.get("discount")
                print(f"商品:{title},价格:{price},优惠:{discount}")
        else:
            print(f"页面{page}请求失败,状态码:{response.status_code}")
    except Exception as e:
        print(f"请求页面{page}时出现异常:{e}")
4. 实现多线程采集

为了提高采集效率,我们使用 threadingqueue 实现多线程采集。将待采集页码放入队列中,由多个线程并发执行采集任务。

# ------------------ 多线程采集实现 ------------------
def worker():
    """
    线程工作函数,从队列中取出页码后调用数据采集函数
    """
    while True:
        page = q.get()
        if page is None:
            break  # 队列结束标志,退出线程
        fetch_product_data(page)
        q.task_done()

# 初始化任务队列
q = Queue()
num_threads = 5  # 线程数量,可根据实际情况调整
threads = []

# 启动工作线程
for i in range(num_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

# 向队列中添加页码任务(假设采集1到10页数据)
for page in range(1, 11):
    q.put(page)

q.join()  # 等待所有任务完成

# 发送结束信号,停止所有线程
for i in range(num_threads):
    q.put(None)
for t in threads:
    t.join()

完整代码如下:

import requests
import threading
from queue import Queue

# ------------------ 代理IP设置 ------------------
# 配置亿牛云爬虫代理(请替换为实际的代理信息)
proxy_user = "16YUN"       # 代理用户名
proxy_pass = "16IP"       # 代理密码
proxy_domain = "proxy.16yun.cn"  # 代理域名
proxy_port = "8080"             # 代理端口

proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_domain}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_domain}:{proxy_port}"
}

# ------------------ 设置Cookie和User-Agent ------------------
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",  # 模拟浏览器请求
    "Cookie": "your_cookie_here"  # 请将此处替换为实际的Cookie信息
}

# ------------------ 定义目标URL及数据采集函数 ------------------
# 目标接口(示例),实际使用中需根据抓包工具确定真实接口
base_url = "https://apiv3.yangkeduo.com/..."

def fetch_product_data(page):
    """
    模拟点击加载数据,采集指定页码的商品信息
    :param page: 页码参数
    """
    # 构造请求URL,假设接口支持页码参数
    url = f"{base_url}?page={page}"
    try:
        # 发送 GET 请求,利用代理IP及设置的headers
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if response.status_code == 200:
            # 解析返回的JSON数据(示例数据格式,实际可能不同)
            data = response.json()
            # 分析并输出商品价格与优惠信息
            for product in data.get("products", []):
                title = product.get("title")
                price = product.get("price")
                discount = product.get("discount")
                print(f"商品:{title},价格:{price},优惠:{discount}")
        else:
            print(f"页面{page}请求失败,状态码:{response.status_code}")
    except Exception as e:
        print(f"请求页面{page}时出现异常:{e}")

# ------------------ 多线程采集实现 ------------------
def worker():
    """
    线程工作函数,从队列中取出页码后调用数据采集函数
    """
    while True:
        page = q.get()
        if page is None:
            break  # 收到结束信号,退出线程
        fetch_product_data(page)
        q.task_done()

# 初始化任务队列
q = Queue()
num_threads = 5  # 线程数量,可根据实际情况调整
threads = []

# 启动工作线程
for i in range(num_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

# 向队列中添加页码任务(假设采集1到10页数据)
for page in range(1, 11):
    q.put(page)

q.join()  # 等待所有任务完成

# 发送结束信号,停止所有线程
for i in range(num_threads):
    q.put(None)
for t in threads:
    t.join()

运行以上代码后,你将看到控制台输出拼多多采集到的各个商品的价格与优惠信息。


三、常见错误提示与延伸练习

常见错误提示
  • 网络超时:检查代理IP、目标接口是否正确,或调整超时时间。
  • 数据解析异常:确保返回数据格式为 JSON,如有变动需调整解析逻辑。
  • 代理认证失败:请核对亿牛云代理的用户名、密码、域名和端口是否正确。
延伸练习
  • 尝试加入异常重试机制,进一步增强程序鲁棒性。
  • 使用队列存储抓取到的完整数据,并保存到本地数据库或文件中。
  • 深入分析拼多多其他页面请求,扩展采集更多商品信息。

四、陷阱警告

陷阱警告:

  • 模拟请求难点:拼多多等大型电商平台会采用多重反爬虫机制,如动态参数校验、验证码等。简单模拟点击事件可能无法覆盖所有反爬策略,实际使用中需做好不断调整。
  • 代理IP的稳定性:代理服务不稳定可能导致采集失败,务必设置超时和异常重试。

总结

本教程详细讲解了如何在无需浏览器的情况下,利用 Python 代码模拟点击事件加载数据,结合代理IP、Cookie、User-Agent 与多线程技术采集拼多多的商品数据。希望通过本教程,初学者能更好地理解动态数据加载、反爬策略应对及并发采集的实战技巧。


http://www.kler.cn/a/572553.html

相关文章:

  • 学习记录-用例设计编写
  • iOS安全和逆向系列教程 第16篇:Frida入门与高级应用
  • 【ESP-ADF】在 VSCode 安装 ESP-ADF 注意事项
  • 腾讯云物联网平台(IoT Explorer)设备端使用
  • Java中Date转LocalDateTime
  • 人机交互进化论:解码智能手机81种交互方式背后的用户体验革命
  • 策略模式-Java举例
  • http链接转成https的链接的几种方法
  • FPGA学习(一)——DE2-115开发板编程入级
  • 【C#】检查已有窗口,防止重复打开
  • Fiddler抓取App接口-Andriod/IOS配置方法
  • FMEA工具的发展历程及芯片行业的采用方式介绍-——芯片电子行业适用性分析
  • Ajax动态加载 和 网页动态渲染 之间的区别及应用场景
  • NVIDIA(英伟达) GPU 芯片架构发展史
  • Java多线程与高并发专题——ConcurrentHahMap 在 Java7 和 8 有何不同?
  • React中实现页面切换的深度指南:从基础到高级实践
  • GPIO的简介
  • 深入理解JavaScript的执行机制
  • 机器学习4-PCA降维
  • 14、TCP连接如何确保可靠性【高频】