首页/新闻资讯/正文详情

Python爬虫实战:二手平台数据采集与反爬策略

发布时间:2026/9/25 3:50:27 来源:云帆数科 栏目:资讯中心
Python爬虫实战:二手平台数据采集与反爬策略
1. 爬虫项目概述与法律边界在当今数据驱动的商业环境中获取公开市场数据对于价格监测、竞品分析和市场研究具有重要意义。本次项目以某二手交易平台以下简称目标平台的商品数据采集为例演示如何通过Python技术栈实现合规的网页数据采集。需要特别强调的是所有爬虫操作必须严格遵循以下原则遵守目标平台的robots.txt协议通常位于网站根目录下如https://example.com/robots.txt请求频率控制在人类操作范围内建议单次采集间隔不低于3-5秒仅采集公开可见数据不尝试突破任何访问限制采集的数据仅用于个人学习和技术研究不得用于商业用途重要提示在开始任何爬虫项目前建议使用requests库检查目标网站的robots.txt文件。例如import requests robots requests.get(https://目标网站.com/robots.txt).text print(robots)2. 技术选型与工具准备2.1 核心工具链配置本项目采用Python 3.8环境主要依赖以下工具包pip install requests2.31.0 # 网络请求 pip install pandas2.0.3 # 数据处理 pip install hashlib # 加密算法内置库 pip install fake-useragent # 随机User-Agent生成2.2 开发辅助工具浏览器开发者工具Chrome/Firefox快捷键F12打开Network面板用于监控HTTP请求Sources面板用于调试JavaScriptJSON格式化工具推荐VS Code插件或在线工具帮助解析复杂的API响应结构时间戳转换工具用于验证请求参数中的时间戳3. 逆向工程全流程解析3.1 接口定位与数据分析通过浏览器开发者工具的Network面板我们可以观察到目标平台采用典型的前后端分离架构。商品数据通过XHR接口返回关键发现包括搜索接口URL模式https://api.example.com/search?q关键词page页码响应数据结构示例{ code: 200, data: { total: 1200, items: [ { id: 123456, title: 二手iPhone 12, price: ¥1999, seller: 用户***, location: 北京 } ] } }3.2 加密参数逆向实战目标平台的防爬机制主要依赖动态签名sign参数通过逆向分析发现其生成逻辑如下签名原始字符串构成token timestamp fixed_salt json_payloadMD5加密实现代码import hashlib def generate_sign(token: str, timestamp: str, payload: str) - str: salt 固定盐值 # 通过逆向获得 raw f{token}{timestamp}{salt}{payload} return hashlib.md5(raw.encode()).hexdigest()参数获取技巧token可从首次请求的Cookie中提取timestamp使用当前毫秒级时间戳payload为JSON序列化的查询参数3.3 请求头精细化配置模拟真实浏览器的请求头能显著降低被封风险推荐配置headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Referer: https://目标网站.com/search, Accept: application/json, X-Requested-With: XMLHttpRequest, Cookie: 获取到的有效cookie }4. 完整爬虫实现4.1 核心采集逻辑import time import json import pandas as pd from typing import List, Dict class ItemSpider: def __init__(self, keyword: str, max_pages: int 10): self.base_url https://api.example.com/search self.keyword keyword self.max_pages max_pages self.session requests.Session() self.session.headers.update(self._gen_headers()) def crawl(self) - List[Dict]: all_items [] for page in range(1, self.max_pages 1): items self._fetch_page(page) if not items: break all_items.extend(items) time.sleep(5) # 遵守爬虫礼仪 return all_items def _fetch_page(self, page: int) - List[Dict]: params self._build_params(page) try: resp self.session.get(self.base_url, paramsparams) resp.raise_for_status() return self._parse_items(resp.json()) except Exception as e: print(f第{page}页采集失败: {str(e)}) return [] def _parse_items(self, data: Dict) - List[Dict]: 解析接口返回的JSON数据 return [ { title: item.get(title), price: float(item.get(price, 0).replace(¥, )), location: item.get(location), timestamp: pd.Timestamp.now() } for item in data.get(data, {}).get(items, []) ]4.2 数据存储方案提供三种存储方式供选择CSV存储适合小型数据集def save_to_csv(items: List[Dict], path: str): pd.DataFrame(items).to_csv(path, indexFalse)JSON存储保留原始结构def save_to_json(items: List[Dict], path: str): with open(path, w, encodingutf-8) as f: json.dump(items, f, ensure_asciiFalse)数据库存储推荐MySQLimport sqlalchemy def save_to_mysql(items: List[Dict]): engine sqlalchemy.create_engine(mysql://user:passlocalhost/db) pd.DataFrame(items).to_sql(items, engine, if_existsappend)5. 高级反反爬策略5.1 IP轮换方案from itertools import cycle proxies cycle([ http://proxy1.example.com:8080, http://proxy2.example.com:8080 ]) def get_with_proxy(url): proxy next(proxies) try: return requests.get(url, proxies{http: proxy}, timeout10) except: return get_with_proxy(url) # 自动切换下一个代理5.2 浏览器自动化方案当遇到复杂JavaScript渲染时可使用Seleniumfrom selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options opts Options() opts.add_argument(--headless) # 无界面模式 driver Chrome(optionsopts) driver.get(https://目标网站.com) search driver.find_element(name, q) search.send_keys(手机) search.submit() # 解析渲染后的DOM items driver.find_elements(css selector, .item)6. 常见问题排查指南6.1 请求被拒绝403错误可能原因及解决方案签名过期检查时间戳是否在有效期内通常±5分钟User-Agent被识别使用fake-useragent随机生成from fake_useragent import UserAgent ua UserAgent() headers {User-Agent: ua.random}6.2 数据解析失败调试建议保存原始响应到文件with open(debug.json, w) as f: json.dump(response.json(), f)使用JSONPath快速定位数据from jsonpath_ng import parse expr parse($.data.items[*].title) titles [match.value for match in expr.find(response.json())]6.3 频率限制应对阶梯式退避策略实现import random from time import sleep def safe_request(url): retries 3 for attempt in range(retries): try: return requests.get(url) except Exception as e: wait (2 ** attempt) random.random() print(f请求失败等待{wait:.2f}秒后重试) sleep(wait) raise Exception(超过最大重试次数)7. 项目优化方向分布式采集使用Scrapy-Redis实现多机协同增量采集记录最后采集时间只获取新数据数据清洗使用pandas处理价格异常值df pd.DataFrame(items) df df[df[price].between(100, 10000)] # 过滤异常价格可视化监控使用PrometheusGrafana监控采集状态在实际操作中发现目标平台大约每2周会更新一次签名算法。保持对接口变化的监控非常重要可以通过定期运行测试用例来验证采集逻辑的有效性。建议将核心采集逻辑封装为独立模块方便后续维护升级。

相关推荐

DataFusion CLI 专属函数完全指南:parquet_metadata 与三大文件缓存自省工具
DataFusion CLI 专属函数完全指南:parquet_metadata 与三大文件缓存自省工具

大数据数据分析后端 【免费下载链接】datafusion Apache DataFusion SQL Query Engine 项目地址: https://gitcode.com/gh_mirrors/datafu/datafusion 点击查看 免费下载 本篇指南聚焦 datafusion-cli(DataFusion 的命令行交互工具)内置的四… · 2026/9/25 3:50:21

Java+uniapp双定位考勤系统:WiFi指纹与GPS围栏落地实战
Java+uniapp双定位考勤系统:WiFi指纹与GPS围栏落地实战

简介:本资源是一套基于Java与安卓UniApp的WiFi和GPS双定位学生课程考勤管理系统毕业设计源码,面向计算机、软件工程、通信工程等专业的在校学生与教师,可用于毕业设计、课程设计、作业或项目立项演示。项目采用SSM后端与UniApp跨端前端&#… · 2026/9/25 3:50:21

Kata Containers 安装实践:前提条件、Helm 部署、发布包与 Docker 集成全解
Kata Containers 安装实践:前提条件、Helm 部署、发布包与 Docker 集成全解

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/25 3:50:21

Inoproshop指令库与库文件详解:从安装调用到封装避坑
Inoproshop指令库与库文件详解:从安装调用到封装避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25

SpringBoot学生考勤管理系统源码实战:环境搭建、数据库导入与二次开发
SpringBoot学生考勤管理系统源码实战:环境搭建、数据库导入与二次开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25

higgsfield项目深度解析:从强化学习原理到PyTorch实战
higgsfield项目深度解析:从强化学习原理到PyTorch实战

很多人第一眼看到“higgsfield”这个词,脑子里蹦出来的可能是物理课上那个给粒子赋予质量的希格斯场。我第一次在开源社区刷到这个项目名,也愣了一下,以为是某个理论物理方向的代码库。点进去才发现,这其实是一个聚焦强化学习和自… · 2026/9/25 4:25:19

汽车IMU原理与实战:从六轴感知到智能驾驶定位基石
汽车IMU原理与实战:从六轴感知到智能驾驶定位基石

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:13

ISO/SAE 21434网络安全合规落地:从风险评估到供应链治理
ISO/SAE 21434网络安全合规落地:从风险评估到供应链治理

简介:本资源为ISO/SAE DIS 21434:2020(E)《道路车辆—网络安全工程》国际标准草案官方英文原版PDF文档,面向汽车电子工程师、信息安全研究人员、整车及零部件企业合规与功能安全团队,以及参与智能网联汽车认证与开发的技术人员。该草案构建了… · 2026/9/25 4:25:13

Elsevier期刊排版全指南:Neurocomputing投稿格式与LaTeX模板实战
Elsevier期刊排版全指南:Neurocomputing投稿格式与LaTeX模板实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:07

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码