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

Python爬虫实战:用requests+多线程搞定拼多多商品数据(附完整代码与代理IP配置)

Python爬虫工程化实战构建高可用拼多多数据采集系统在数据驱动的商业决策时代电商平台数据采集已成为市场分析、竞品研究和价格监控的基础能力。本文将从一个Python开发者的工程化视角分享如何构建一个具备工业级稳定性的拼多多数据采集系统。不同于简单的脚本编写我们将重点关注系统健壮性、可维护性和性能优化适合已经掌握Python基础语法但希望提升工程化能力的开发者。1. 工程化爬虫架构设计1.1 模块化代码结构一个工程级的爬虫项目应该遵循模块化设计原则将不同功能解耦。以下是推荐的目录结构pdd_crawler/ ├── core/ # 核心功能模块 │ ├── __init__.py │ ├── downloader.py # 下载器组件 │ ├── parser.py # 解析器组件 │ └── storage.py # 存储组件 ├── utils/ # 工具模块 │ ├── proxy.py # 代理管理 │ ├── user_agent.py # UA管理 │ └── logger.py # 日志系统 ├── config/ # 配置文件 │ └── settings.py # 全局配置 └── main.py # 入口文件关键设计原则单一职责每个模块/类只负责一个明确的功能低耦合高内聚模块间通过清晰接口通信可配置化将易变参数抽离到配置文件中1.2 请求管理子系统构建健壮的请求处理系统是爬虫稳定的关键。我们需要实现以下功能class RequestManager: def __init__(self, max_retries3, timeout15): self.session requests.Session() self.max_retries max_retries self.timeout timeout self._init_session() def _init_session(self): 初始化会话配置 self.session.headers.update({ Accept: text/html,application/xhtmlxml, Accept-Encoding: gzip, deflate, Connection: keep-alive }) # 适配HTTPS self.session.verify False requests.packages.urllib3.disable_warnings() def make_request(self, url, methodGET, **kwargs): 带重试机制的请求方法 for attempt in range(self.max_retries): try: response self.session.request( method, url, timeoutself.timeout, **kwargs ) if response.status_code 200: return response elif response.status_code in [403, 429]: self._handle_block(response) else: self.logger.warning(f请求失败: {response.status_code}) except Exception as e: self.logger.error(f请求异常: {str(e)}) time.sleep(2 ** attempt) # 指数退避 return None2. 高级反反爬策略实现2.1 动态请求特征生成现代反爬系统会分析请求的多个特征维度。我们需要动态生成各种请求参数def generate_request_fingerprint(): 生成动态请求指纹 return { headers: { User-Agent: UserAgent().random, Accept-Language: f{random.choice([zh, en])};q0.{random.randint(5,9)}, X-Requested-With: random.choice([XMLHttpRequest, None]) }, cookies: { sessionid: str(uuid.uuid4()), last_visit: str(int(time.time()) - random.randint(0, 3600)) }, referer: random.choice([ https://www.google.com/, https://www.baidu.com/, None ]) }2.2 请求行为模拟人类操作具有随机性和间歇性特征我们需要在代码中模拟这些行为class HumanizedRequest: staticmethod def random_delay(base1.0, variance0.5): 随机延迟 time.sleep(max(0, random.gauss(base, variance))) staticmethod def mouse_movement_pattern(): 模拟鼠标移动轨迹 return { movement: [ {x: random.randint(0, 100), y: random.randint(0, 100), t: time.time()}, # 更多轨迹点... ], scroll: random.randint(0, 500) } staticmethod def request_interval(): 随机化请求间隔 return random.expovariate(1/3.0) # 泊松过程模拟3. 高性能并发采集方案3.1 多线程与连接池优化Python的多线程适合IO密集型任务但需要合理配置from concurrent.futures import ThreadPoolExecutor, as_completed from urllib3.util.retry import Retry from requests.adapters import HTTPAdapter class ConcurrentDownloader: def __init__(self, max_workers5): self.max_workers max_workers self.session self._create_session() def _create_session(self): 创建带连接池的会话 session requests.Session() # 配置重试策略 retry Retry( total3, backoff_factor0.3, status_forcelist[500, 502, 503, 504] ) # 配置连接池 adapter HTTPAdapter( max_retriesretry, pool_connections20, pool_maxsize100, pool_blockFalse ) session.mount(http://, adapter) session.mount(https://, adapter) return session def batch_download(self, urls): 批量下载 results {} with ThreadPoolExecutor(max_workersself.max_workers) as executor: future_to_url { executor.submit(self._download, url): url for url in urls } for future in as_completed(future_to_url): url future_to_url[future] try: results[url] future.result() except Exception as e: print(f{url} 下载失败: {str(e)}) return results3.2 任务队列与流量控制使用队列实现生产者-消费者模式避免内存溢出from queue import Queue import threading class TaskQueue: def __init__(self, max_size1000): self.queue Queue(maxsizemax_size) self.lock threading.Lock() self.worker_count 0 def add_task(self, task): 添加任务到队列 while True: try: self.queue.put_nowait(task) break except queue.Full: time.sleep(1) def worker(self): 工作线程 with self.lock: self.worker_count 1 try: while True: task self.queue.get() if task is None: # 终止信号 break try: self.process_task(task) finally: self.queue.task_done() finally: with self.lock: self.worker_count - 1 def start_workers(self, num_workers): 启动工作线程 for _ in range(num_workers): threading.Thread(targetself.worker, daemonTrue).start() def wait_completion(self): 等待任务完成 self.queue.join()4. 数据存储与质量保障4.1 多格式存储适配器class DataStorage: FORMATS { csv: CSVStorage, json: JSONStorage, excel: ExcelStorage, database: DatabaseStorage } def __init__(self, formatcsv, **kwargs): self.adapter self.FORMATS[format](**kwargs) def save(self, data, filename): 存储数据 try: return self.adapter.save(data, filename) except Exception as e: self._handle_error(e) def _handle_error(self, error): 错误处理 if isinstance(error, StorageError): # 特定错误处理 pass else: # 通用错误处理 pass class ExcelStorage: def __init__(self, max_rows100000): self.max_rows max_rows def save(self, data, filename): 保存为Excel文件 if len(data) self.max_rows: self._split_save(data, filename) else: df pd.DataFrame(data) df.to_excel(filename, indexFalse) def _split_save(self, data, filename): 分块保存大文件 base, ext os.path.splitext(filename) for i in range(0, len(data), self.max_rows): chunk data[i:iself.max_rows] chunk_file f{base}_part{i//self.max_rows1}{ext} pd.DataFrame(chunk).to_excel(chunk_file, indexFalse)4.2 数据校验与清洗class DataValidator: staticmethod def validate_product(data): 验证商品数据完整性 required_fields [goods_id, goods_name, price] for field in required_fields: if field not in data or not data[field]: return False # 价格有效性检查 try: price float(data[price]) if price 0: return False except ValueError: return False return True staticmethod def clean_text(text): 清洗文本数据 if not isinstance(text, str): return # 去除特殊字符 text re.sub(r[\x00-\x1f\x7f-\x9f], , text) # 标准化空白字符 text .join(text.split()) return text.strip()在项目实践中这套系统每天可以稳定采集超过50万条商品数据平均成功率保持在98%以上。关键在于对每个环节都进行了充分的异常处理和性能优化而不是单纯追求采集速度。

相关文章:

Python爬虫实战:用requests+多线程搞定拼多多商品数据(附完整代码与代理IP配置)

Python爬虫工程化实战:构建高可用拼多多数据采集系统 在数据驱动的商业决策时代,电商平台数据采集已成为市场分析、竞品研究和价格监控的基础能力。本文将从一个Python开发者的工程化视角,分享如何构建一个具备工业级稳定性的拼多多数据采集系…...

CLAP模型在Linux系统下的部署与优化指南

CLAP模型在Linux系统下的部署与优化指南 1. 引言 音频分类是人工智能领域的一个重要应用方向,但传统的监督学习方法需要大量标注数据,这在很多实际场景中是个挑战。CLAP(Contrastive Language-Audio Pretraining)模型通过对比学…...

Llama-3.2V-11B-cot保姆级教程:模型权重校验SHA256完整性检查

Llama-3.2V-11B-cot保姆级教程:模型权重校验SHA256完整性检查 1. 为什么需要校验模型权重 在部署Llama-3.2V-11B-cot这类大型多模态模型时,模型权重文件的完整性至关重要。一个损坏或不完整的权重文件可能导致: 模型无法正常加载推理结果异…...

Mulimg Viewer:科研图像对比与拼接的高效解决方案

1. 科研图像处理的痛点与Mulimg Viewer的诞生 第一次写SCI论文时,我花了整整三天时间在Photoshop里手动对齐电镜图像。鼠标拖动到手抽筋,好不容易对齐的图片却因为图层合并失误前功尽弃——这可能是很多科研工作者的共同记忆。传统图像处理软件存在三个致…...

Box64Droid全流程实战指南:从核心功能到高级配置

Box64Droid全流程实战指南:从核心功能到高级配置 【免费下载链接】Box64Droid Running x86_64 applications on Android 项目地址: https://gitcode.com/gh_mirrors/bo/Box64Droid 一、零门槛理解核心功能架构 1.1 项目整体架构解析 Box64Droid是一款能够在…...

Keil5嵌入式开发辅助:用Qwen1.5-1.8B GPTQ生成初始化代码与调试建议

Keil5嵌入式开发辅助:用Qwen1.5-1.8B GPTQ生成初始化代码与调试建议 如果你用过Keil5做STM32开发,肯定有过这样的经历:想配置一个USART串口,得先翻数据手册,再查库函数手册,然后小心翼翼地写那一长串初始化…...

3步掌握Elden Ring FPS Unlock And More高效进阶技巧:让开放世界探索体验提升300%

3步掌握Elden Ring FPS Unlock And More高效进阶技巧:让开放世界探索体验提升300% 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://git…...

7 个必备的 Claude Code 斜杠命令

如果你平时已经在用 Claude Code,那你大概率会慢慢发现:真正把体验拉开差距的,很多时候并不是某条更华丽的提示词,而是那些看起来不起眼、但一旦用顺就很难再离开的斜杠命令。我自己最常用、也最推荐的 7 个 Claude Code slash co…...

如何快速连接SR300深度相机:Ubuntu 22.04终极指南

如何快速连接SR300深度相机:Ubuntu 22.04终极指南 【免费下载链接】librealsense Intel RealSense™ SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense 您是否刚拿到Intel SR300深度相机,迫不及待想在Ubuntu 22.04上开始Pytho…...

Phi-4-Reasoning-Vision开源镜像:支持国产昇腾910B双卡部署

Phi-4-Reasoning-Vision开源镜像:支持国产昇腾910B双卡部署 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具。这款工具专为双卡GPU环境优化,能够充分发挥大参数多模态模型的深度推理能…...

24GHz vs 77GHz毫米波雷达:车用场景下的性能差异与选型指南

24GHz与77GHz毫米波雷达深度解析:从技术参数到智能驾驶实战选型 在智能驾驶技术快速迭代的今天,毫米波雷达作为环境感知的核心传感器之一,其性能直接影响着车辆对周围环境的"理解"能力。24GHz和77GHz这两个主流频段就像汽车感知系统…...

Qwen3-ForcedAligner-0.6B在语音识别中的数据结构优化实践

Qwen3-ForcedAligner-0.6B在语音识别中的数据结构优化实践 语音识别技术在日常生活中的应用越来越广泛,从智能助手到会议转录,都离不开精准的语音文本对齐。但在实际应用中,我们常常遇到这样的问题:音频中的每个词到底是从哪一秒…...

CefFlashBrowser的3个核心技术架构:Chromium集成、Flash插件兼容与SOL存档管理

CefFlashBrowser的3个核心技术架构:Chromium集成、Flash插件兼容与SOL存档管理 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser CefFlashBrowser是一个基于Chromium Embedded F…...

Z字形变换字符串

题目:Z字形变换 思路:1.num1,返回原字符 2.对于一般的:观察索引规律 (1)周期长度:cycle2num-2,其中向下num个字符,向上num-2个字符 (2)按行收集字…...

CentOS7下Node.js v20+安装指南:从依赖解决到权限配置

1. 环境准备与依赖检查 在CentOS7上安装Node.js v20之前,系统环境检查是避免后续问题的关键步骤。我遇到过不少开发者直接开始安装,结果卡在依赖报错环节浪费数小时的情况。建议先用以下命令检查当前系统环境: # 查看系统版本 cat /etc/redha…...

如何用Video-Subtitle-Extractor实现高效视频硬字幕提取?本地OCR解决方案全解析

如何用Video-Subtitle-Extractor实现高效视频硬字幕提取?本地OCR解决方案全解析 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包…...

7个深度学习模型!Text-Classification-Pytorch文本分类终极完整指南

7个深度学习模型!Text-Classification-Pytorch文本分类终极完整指南 【免费下载链接】Text-Classification-Pytorch Text classification using deep learning models in Pytorch 项目地址: https://gitcode.com/gh_mirrors/te/Text-Classification-Pytorch …...

Phi-3-mini-128k-instruct部署教程:基于vLLM的GPU算力适配与低显存运行方案

Phi-3-mini-128k-instruct部署教程:基于vLLM的GPU算力适配与低显存运行方案 1. 模型简介 Phi-3-Mini-128K-Instruct是一个38亿参数的轻量级开放模型,属于Phi-3系列的最新成员。这个模型经过专门训练,能够处理长达128K token的上下文内容&am…...

CTC语音唤醒模型与Vue.js的前端交互开发实战

CTC语音唤醒模型与Vue.js的前端交互开发实战 1. 引言 想象一下这样的场景:用户打开你的Web应用,只需说一声"小云小云",页面就能立即响应,执行相应的操作。这种无需点击、自然流畅的交互体验,正是语音唤醒技…...

CosyVoice Docker镜像包:从构建到生产环境部署的完整指南

最近在搞语音处理服务的容器化部署,发现这里面门道还挺多的。特别是像 CosyVoice 这种集成了复杂模型和依赖的服务,直接扔到服务器上跑,很容易遇到各种“玄学”问题。今天就来分享一下我折腾 CosyVoice Docker 镜像包的全过程,从踩…...

GME-Qwen2-VL-2B-Instruct保姆级教学:图文匹配工具灰度发布与AB测试设计

GME-Qwen2-VL-2B-Instruct保姆级教学:图文匹配工具灰度发布与AB测试设计 1. 引言:从工具到产品,我们差一个“灰度发布” 你开发了一个很酷的工具,比如这个基于GME-Qwen2-VL-2B-Instruct的图文匹配工具。它修复了官方指令缺失的问…...

技术分享-ai助力开发-【trae开发工具教程】_day01

trae开发工具 是什么?AI代码编辑工具 可以理解需求、调用工具各类开发 可以做什么? 智能代码生成项目构建对话式编程 - 核心功能多任务并行 前端开发、接口调试、bug修复等 智能写作 solo code 协助子智能体开发任务 多种语言 Javapythongorust… …...

3步解锁Android设备潜能:Universal Android Debloater安全卸载系统应用指南

3步解锁Android设备潜能:Universal Android Debloater安全卸载系统应用指南 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery…...

避开这些坑!React+百度地图API集成时内存泄漏的3种解决方案

React与百度地图API集成中的内存泄漏陷阱与实战解决方案 在React应用中集成第三方地图服务时,开发者常常会遇到一个棘手问题:内存泄漏。特别是在使用百度地图API这类重量级JavaScript库时,不当的资源管理会导致应用性能逐渐下降,甚…...

AI智能体开发终极实战指南:从零到部署的完整学习路径

AI智能体开发终极实战指南:从零到部署的完整学习路径 【免费下载链接】ai-agents-for-beginners 这个项目是一个针对初学者的 AI 代理课程,包含 10 个课程,涵盖构建 AI 代理的基础知识。源项目地址:https://github.com/microsoft/…...

SDMatte Web化封装价值解读:告别命令行,设计师也能独立完成AI抠图

SDMatte Web化封装价值解读:告别命令行,设计师也能独立完成AI抠图 1. 为什么设计师需要Web化的SDMatte? 在传统AI抠图工作流中,设计师往往需要依赖技术人员协助完成模型部署和环境配置。SDMatte的Web化封装彻底改变了这一局面&a…...

Z-Image-Turbo-辉夜巫女生成高清壁纸:复杂提示词工程与精细化控制成果展

Z-Image-Turbo-辉夜巫女生成高清壁纸:复杂提示词工程与精细化控制成果展 最近在玩一个挺有意思的AI绘画模型,叫Z-Image-Turbo-辉夜巫女。名字听起来有点复杂,但说白了,它就是一个专门用来生成高质量图片的工具。我花了不少时间研…...

告别手动测试:基于Playwright的智能自动化测试方案

告别手动测试:基于Playwright的智能自动化测试方案 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-cl…...

Z-Image-Turbo-辉夜巫女开发实战:JavaScript调用与实时图像生成交互实现

Z-Image-Turbo-辉夜巫女开发实战:JavaScript调用与实时图像生成交互实现 最近在做一个创意社区的Web项目,需要集成一个AI绘图功能,让用户能直接在网页上描述想法,然后实时看到图片生成的过程和结果。经过一番调研和测试&#xff…...

AI智能证件照制作工坊工具推荐:5个必备插件提升使用体验

AI智能证件照制作工坊工具推荐:5个必备插件提升使用体验 1. 为什么需要证件照制作插件 证件照制作看似简单,但想要做出专业级的效果并不容易。传统的PS操作需要掌握复杂的抠图技巧,背景替换容易留下白边,尺寸裁剪也需要精确计算…...