← 返回 Skill 列表
extension
分类: 数据与分析无需 API Key

网页数据爬虫搭建助手

把"我想从某网站批量拿数据"变成能跑、能续、能合规落库的采集器。覆盖数据可得性判定(有没有现成 API/导出)、技术路线选型(静态页 requests、JS 渲染页抓 XHR 或 Playwright)、健壮采集器写法(重试退避/限流/随机 UA/断点续爬)、轻量反爬应对、以及 pandas 清洗导出 csv/json。每条都给可直接运行的代码与合规红线清单。

person作者: u_04a46b4ehubenterprise

网页数据爬虫搭建助手

适用场景

  • 需要从某个网站批量抓数据(行情/榜单/商品/评论/研报),但对方没有现成开放 API。
  • 有接口但要登录态、要翻页、要限流,手写脚本总被封或中途断掉。
  • 想做成"定时跑 + 增量更新",而不是每次手动 copy 一页。
  • 爬下来的数据要落库或导出 csv/json,供后续分析或可视化。
  • 遇到反爬:UA 校验、参数签名、登录滑块、频率限制,不知道从哪下手。
  • 已有脏数据(编码乱、字段错位、重复行),需要清洗标准化。

不适用:破解付费墙后的专有内容、抓取明确标注"禁止爬取"的个人信息、接入打码平台绕过验证码的黑产用途、超大规模分布式爬虫集群架构设计。

工作流

  1. 先判定数据可得性:看有没有官方 API/导出按钮;读 robots.txt;用 DevTools 看页面是 SSR 静态还是前端渲染(决定技术路线)。
  2. 选技术路线:
    • 静态页 / 有 XHR 接口 → requests/httpx + BeautifulSoup/parsel/lxml。
    • 纯 JS 渲染且无接口 → 优先在 Network 里抓真实 XHR 接口(最稳),其次用 Playwright 真浏览器。
    • 需登录态 → 复用 session/cookie,不硬编码账号密码,用环境变量或 cookie 文件。
  3. 写健壮采集器:tenacity 重试 + 指数退避;随机 User-Agent + 可选代理池;并发限流(如 asyncio.Semaphore);断点续爬(记录已抓页,失败从断点继续)。
  4. 反爬应对(教学级轻量):Headers 仿浏览器、必要参数签名逆向(轻量)、cookie 池轮换、必要时 Playwright 真浏览器模拟真人节奏;强风控时果断回退官方 API/授权数据。
  5. 落库与导出:pandas 清洗(去重/类型转换/编码修复)→ 导出 csv/parquet/json;增量用 last_seen 字段去重。
  6. 合规自检:只采公开数据、尊重 robots.txt、控制请求频率、绝不碰个人信息与付费墙。

示例

输入:

抓某电商搜索页前 5 页的商品名、价格、月销量,导出 csv,别被封。

输出(节选):

import requests, time, random, pandas as pd
from tenacity import retry, stop_after_attempt, wait_exponential

UA = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."]

@retry(stop=stop_after_attempt(4), wait=wait_exponential(multiplier=1, max=10))
def fetch_page(kw, p):
    r = requests.get(
        f"https://x.com/s/{kw}?page={p}",
        headers={"User-Agent": random.choice(UA),
                 "Referer": "https://x.com/"},
        timeout=10,
    )
    r.raise_for_status()
    return r

rows = []
for p in range(1, 6):
    html = fetch_page("耳机", p).text
    # parsel 提取 name/price/sales ...(略)
    rows.extend(parsed)
    time.sleep(random.uniform(1.5, 3.5))   # 限速,别太快

pd.DataFrame(rows).drop_duplicates().to_csv("goods.csv", index=False, encoding="utf-8-sig")

反爬提示:若返回 403,优先在 DevTools→Network 复制真实请求的完整 Headers 与 Query 参数;发现 _signature 类参数再做轻量逆向,复杂加密建议放弃并走官方数据授权。

边界

  • 明确红线:不抓取个人信息、不绕过付费墙、不接入打码平台;违规需求一律拒绝并说明原因。
  • 反爬签名逆向只做教学级轻量分析,遇到强加密/行为风控不深挖,建议改用官方 API 或采购授权数据。
  • 不保证能突破所有反爬;风控升级时以"拿不到数据"如实反馈,而不是伪造结果。
  • 大规模分布式集群、代理 IP 机房采购、验证码打码平台对接不在本技能范围。

技术底座

  • Python 生态:requests/httpx 发请求,BeautifulSoup/parsel/lxml 解析;JS 渲染页用 Playwright。
  • 健壮性:tenacity 重试退避、随机 UA、代理轮换、asyncio 并发限流、断点续爬(本地状态文件)。
  • 数据处理:pandas 清洗与导出(utf-8-sig 防 Excel 中文乱码)。
  • 合规参考:robots.txt 协议、数据安全法与个人信息保护法对公开数据采集的边界要求。
  • 所有代码为可运行片段,按用户环境(Python 3.10+)可直接补全字段提取逻辑后执行。