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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本教程介绍使用Python模拟点击事件,通过HTTP请求采集拼多多商品价格和优惠信息。主要内容包括:1. **目标**:利用代理IP、Cookie和User-Agent防止被屏蔽,结合多线程加速数据采集。2. **前置知识**:Python编程、HTTP协议、多线程基础、代理IP使用。3. **步骤**: - 环境准备:安装`requests`库。 - 配置代理IP、Cookie和User-Agent。 - 模拟点击加载数据,解析JSON响应。 - 实现多线程采集,提高效率。

爬虫代理

一、明确目标与前置知识

目标

  • 使用 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 与多线程技术采集拼多多的商品数据。希望通过本教程,初学者能更好地理解动态数据加载、策略应对及并发采集的实战技巧。

相关文章
|
11月前
|
Web App开发 移动开发 JavaScript
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
|
Web App开发
浏览器事件机制中事件触发三个阶段?
js中时间执行的整个过程称之为事件流,分为三个阶段:事件捕获阶段,事件目标处理函数、事件冒泡。 当某歌元素触发某个事件(如:click),顶级对象document发出一个事件流,顺着dom的树节点向触发它的目标节点流去,直到达到目标元素,这个层层递进,向下找目标的过程为事件的捕获阶段,此过程与事件相应的函数是不会触发的。
3358 0
|
JavaScript 前端开发
浏览器事件机制中 事件触发的三个阶段
javaScript事件的三个阶段:捕获阶段 目标阶段 冒泡阶段 addEventListener
activex嵌入浏览器时线程触发事件
8 推荐 在浏览器中嵌入activex后,线程中触发的事件就没有动静了,如果在调试的情况下,还能发现浏览器有非法错发生。而同样的activex如果使用应用程序来调用则正常。解决方法是取巧的方式,在线程中发出消息,控件响应消息后再FireEvent。
1051 0
|
5月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
139 63
|
5月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
179 57
|
5月前
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
103 5
在浏览器执行js脚本的两种方式
|
5月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
900 1
|
6月前
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
1244 1
下一篇
oss创建bucket