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

产品销量数据爬虫通用模板

最近遇到各行各业的需要爬取销售数据,每次写一个教程相对麻烦,所以思前考后我还是觉得写一个通用模板更适合。所以模板需要足够的灵活性,让用户能够自定义选择器。比如,产品标题、价格、销量的CSS选择器可能因网站而异,所以可能需要能够传入这些参数。此外,分页处理也很重要,因为销量数据通常分布在多个页面。分页逻辑可能有不同形式,比如URL参数递增或者JavaScript加载,这里可能需要用户指定分页的URL模式或最大页数。

在这里插入图片描述

数据存储部分,可能需要将结果保存为CSV或JSON,方便后续分析。所以模板里应该包含保存数据的函数,比如保存到CSV文件,并处理可能的编码问题。

异常处理也是关键,网络请求可能会失败,页面结构可能变化,所以需要重试机制和日志记录。添加try-except块,记录错误信息,并在失败时重试几次请求。

另外,在实际操作中可能需要代理支持,以防止IP被封。所以在模板中应该允许用户传入代理配置,并在发送请求时使用。

以下就是我通宵几天写的一个通用的产品销量数据爬虫模板,使用 Python 编写,基于 requests 和 BeautifulSoup 库。使用时需要根据目标网站的具体结构进行调整:

import requests
from bs4 import BeautifulSoup
import csv
import time
import logging
from typing import Dict, Listclass ProductSpider:def __init__(self,base_url: str,headers: Dict[str, str] = None,proxies: Dict[str, str] = None,max_retries: int = 3,delay: float = 1.0):self.base_url = base_urlself.headers = headers or {'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'}self.proxies = proxiesself.max_retries = max_retriesself.delay = delayself.session = requests.Session()# 配置日志logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')def fetch_page(self, url: str) -> BeautifulSoup:"""获取页面并返回解析后的BeautifulSoup对象"""for _ in range(self.max_retries):try:response = self.session.get(url,headers=self.headers,proxies=self.proxies,timeout=10)response.raise_for_status()time.sleep(self.delay)  # 遵守爬取延迟return BeautifulSoup(response.text, 'lxml')except Exception as e:logging.error(f"请求失败: {str(e)},剩余重试次数:{self.max_retries - _ - 1}")time.sleep(2)return Nonedef parse_product(self, soup: BeautifulSoup, selectors: Dict[str, str]) -> Dict[str, str]:"""解析产品信息"""product = {}try:product['title'] = soup.select_one(selectors['title']).text.strip()product['price'] = soup.select_one(selectors['price']).text.strip()product['sales'] = soup.select_one(selectors['sales']).text.strip()product['rating'] = soup.select_one(selectors['rating']).text.strip()# 添加更多需要提取的字段...except AttributeError as e:logging.warning(f"解析失败: {str(e)}")return Nonereturn productdef get_page_products(self, page_url: str, selectors: Dict[str, str]) -> List[Dict]:"""获取单页产品数据"""soup = self.fetch_page(page_url)if not soup:return []products = []product_items = soup.select(selectors['product_list'])  # 产品列表选择器for item in product_items:product = self.parse_product(item, selectors)if product:products.append(product)return productsdef save_to_csv(self, data: List[Dict], filename: str):"""保存数据到CSV文件"""if not data:returnkeys = data[0].keys()with open(filename, 'w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=keys)writer.writeheader()writer.writerows(data)def run(self,output_file: str = 'products.csv',page_param: str = 'page',max_pages: int = 10,selectors: Dict[str, str] = None):"""执行爬虫"""all_products = []current_page = 1while current_page <= max_pages:# 构造分页URL(根据目标网站实际情况调整)page_url = f"{self.base_url}?{page_param}={current_page}"logging.info(f"正在爬取第 {current_page} 页: {page_url}")products = self.get_page_products(page_url, selectors)if not products:breakall_products.extend(products)current_page += 1self.save_to_csv(all_products, output_file)logging.info(f"爬取完成,共获取 {len(all_products)} 条数据,已保存到 {output_file}")if __name__ == "__main__":# 使用示例(需要根据目标网站修改选择器)spider = ProductSpider(base_url="https://example.com/products",headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'},delay=1.5)# CSS选择器配置(需要根据目标网站实际结构修改)SELECTORS = {'product_list': '.product-item',       # 产品列表容器'title': '.product-title',             # 产品标题'price': '.price-value',               # 产品价格'sales': '.sales-count',               # 销量信息'rating': '.rating-score'              # 评分信息}spider.run(output_file='products_data.csv',page_param='page',max_pages=5,selectors=SELECTORS)

主要功能说明:

1、可配置参数:

  • 请求头(headers)
  • 代理设置(proxies)
  • 最大重试次数(max_retries)
  • 请求延迟(delay)

2、核心方法:

  • fetch_page():处理HTTP请求和重试逻辑
  • parse_product():解析产品信息
  • get_page_products():获取单页数据
  • save_to_csv():数据存储

3、使用注意事项:

  • 需要根据目标网站结构修改CSS选择器
  • 需要遵守目标网站的robots.txt规则
  • 可能需要处理动态加载内容(可配合Selenium/Playwright使用)
  • 需要处理反爬机制(验证码、IP限制等)

4、扩展建议:

  • 添加代理池支持
  • 实现动态分页检测
  • 增加数据清洗功能
  • 添加数据库存储支持
  • 实现分布式爬虫

5、异常处理:

  • 网络请求失败重试
  • 页面解析失败记录
  • 防封禁机制
  • 请求频率控制

使用时需要根据具体网站修改以下部分:

1、CSS选择器(SELECTORS字典)

2、分页URL构造逻辑

3、请求头信息

4、可能需要添加登录认证逻辑

5、可能需要处理JavaScript渲染的内容

最后我还是要提醒大家,在请确保遵守目标网站的爬取规则和相关法律法规,在合法合规的前提下使用爬虫程序。

http://www.xdnf.cn/news/6501.html

相关文章:

  • js关于number类型的计算问题
  • msf安卓远控木马手动捆绑正常apk
  • LLM中最后一个位置的对数概率是什么? 怎么作为LOSS实现方式
  • C++23 新特性:ranges::contains 与 ranges::contains_subrange
  • 线代第二章矩阵第九、十节:初等变换、矩阵的标准形、阶梯形与行最简阶梯形、初等矩阵
  • RPA 自动化实现自动发布
  • 基于matlab实现AUTOSAR软件开发---答疑6
  • 瓶装燃气送气工考试的实操考核内容有哪些?
  • Python训练营打卡 Day26
  • Git - 1( 14000 字详解 )
  • 动态库和静态库的区别
  • 攻击溯源技术体系:从理论架构到工程化实践的深度剖析
  • SQL实战:06交叉日期打折问题求解
  • 论文学习_Precise and Accurate Patch Presence Test for Binaries
  • 浅析 Spring 启动过程:从源码到核心方法
  • 【Redis】双向链表结构
  • ARM A64 LDR指令
  • constexpr 关键字的意义(入门)
  • 关于在深度聚类中Representation Collapse现象
  • RM算法的地下宫殿
  • 解决 Conda 安装 PyTorch 1.1.0 报错:excluded by strict repo priority(附三种解决方案)
  • 射击游戏demo11
  • 微服务如何实现服务的高并发
  • idea整合maven环境配置
  • 幼儿学前教育答辩词答辩技巧问题答辩自述稿
  • IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
  • MapReduce架构-打包运行
  • gitlab+portainer 实现Ruoyi Vue后端CI/CD
  • Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验
  • 全面掌握JSR303校验:从入门到实战