1. 这不是写代码是“教AI读网页”2026年爬虫的本质迁移你打开一个网页右键“查看源代码”满屏的div classitem、a href/product/12345、span>docker run -d \ --name claude-crawler \ -v /data/config:/app/config \ -v /data/output:/app/output \ -e CLAUDE_API_KEYsk-xxx \ -p 8080:8000 \ claude-crawler:latest然后通过 HTTP API 提交需求curl -X POST http://localhost:8080/extract \ -H Content-Type: application/json \ -d { url: https://www.zhihu.com/billboard, prompt: 提取知乎热榜前10名问题包含标题、排名、热度值、是否为‘盐选’内容 }整个流程与传统爬虫完全解耦运维人员只管容器健康业务人员只管写中文需求。这才是2026年该有的协作形态。3. 实操详解从零搭建一个“对话式电商比价爬虫”3.1 环境准备与最小可行配置别被“Claude Code”名字吓住它不需要你拥有 GPU 服务器或深度学习背景。我用一台 4核8G 的阿里云 ECSUbuntu 22.04完成了全部部署总耗时23分钟。关键不是硬件而是配置逻辑第一步基础依赖安装严格按顺序# 1. 升级系统并安装必要工具 sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-venv curl wget git # 2. 创建隔离环境避免包冲突 python3 -m venv ~/claude-env source ~/claude-env/bin/activate # 3. 安装核心库注意版本锁定 pip install --upgrade pip pip install requests2.31.0 beautifulsoup44.12.2 lxml4.9.4 pip install selenium4.15.0 # 仅用于必要时的渲染兜底 pip install pandas2.1.4 openpyxl3.1.2 # 4. 安装 ChromeDriver必须匹配系统 Chrome 版本 sudo apt install -y chromium-browser CHROME_VERSION$(chromium-browser --version | cut -d -f2) wget https://chromedriver.storage.googleapis.com/${CHROME_VERSION}/chromedriver_linux64.zip unzip chromedriver_linux64.zip -d /usr/local/bin/ sudo chmod x /usr/local/bin/chromedriver注意selenium不是主力而是“保底方案”。Claude Code 默认走requestslxml只有当检测到页面严重依赖 JS 渲染如 React/Vue 的 SPA 应用才会启用 Chromium。我们统计过91.3% 的电商页面纯 HTML 解析足够。第二步Claude Code 运行时配置创建配置文件~/claude-config.yaml# API 连接配置 api: base_url: https://api.anthropic.com/v1 timeout: 30 max_retries: 3 # DOM 解析策略 dom: parser: lxml # 比 html.parser 快3.2倍支持 XPath timeout: 15 # 页面下载超时 retry_delay: 2 # 重试间隔秒数 # 智能定位参数 locator: confidence_threshold: 0.85 # 主选择器最低置信度 fallback_depth: 2 # 备选路径最大尝试深度 visual_weight: 0.4 # 视觉特征权重0-1 semantic_weight: 0.5 # 语义特征权重 relation_weight: 0.1 # 关系特征权重 # 输出控制 output: format: csv # 默认输出格式 encoding: utf-8-sig # 兼容 Excel 中文 max_items: 1000 # 单次提取最大条目数这个配置文件的价值在于把“经验”固化为参数。比如visual_weight: 0.4是我们测试得出的平衡点权重太高会过度依赖页面布局网站改版就失效太低则忽略重要视觉线索如“立即购买”按钮总在价格下方。你不必死记但要知道每个参数背后的战场故事。3.2 核心脚本编写用中文定义用 Python 执行现在进入最关键的环节如何把“让 Claude Code 替你聊出数据”这句话变成可运行的代码。我以京东手机频道为例目标是抓取“iPhone 15”相关商品的实时比价数据。第一步构造需求提示词Prompt Engineering这是成败关键。不要写“抓取京东iPhone15商品”要像给同事提需求一样精准请从京东搜索页 https://search.jd.com/Search?keywordiPhone15encutf-8 抓取前60个商品要求 1. 商品标题提取 div classp-name 内的完整文本去除“【自营】”等前缀 2. 价格提取 span classp-price 内的数字单位为元保留一位小数如“¥5,999.00” → 5999.0 3. 店铺类型判断是否为“京东自营”标准是 div classp-shop 中含“自营”字样输出布尔值 4. 评论数提取 div classp-commit 中的数字去除“条评论”文字若无则填0 5. 是否有PLUS会员价检查是否存在 span classp-price-plus 元素存在则填“是”否则“否” 6. 排序依据按价格升序排列价格相同时按评论数降序 输出为CSV字段顺序title,price,is_jd_self,comment_count,has_plus_price这段提示词包含5个专业要素URL 锚点、字段提取规则、清洗要求、排序逻辑、输出格式。Claude Code 会据此生成带完整异常处理的脚本。第二步生成并执行脚本运行以下命令假设已安装claude-crawlerCLI 工具claude-crawler generate \ --config ~/claude-config.yaml \ --prompt prompt.txt \ --output jingdong_iphone15.py生成的jingdong_iphone15.py文件核心逻辑如下import requests from bs4 import BeautifulSoup import pandas as pd import re import time from urllib.parse import urljoin def extract_data(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } # 1. 获取HTML带重试 for i in range(3): try: resp requests.get(url, headersheaders, timeout15) resp.raise_for_status() break except Exception as e: if i 2: raise e time.sleep(2 ** i) # 指数退避 soup BeautifulSoup(resp.text, lxml) items [] # 2. 主选择器定位商品列表 # Claude Code 自动生成的高置信度选择器 product_list soup.select(div#J_goodsList ul li.gl-item) # 3. 遍历提取带字段级容错 for item in product_list[:60]: # 限制数量 try: # 标题提取带清洗 title_elem item.select_one(div.p-name a em) title title_elem.get_text(stripTrue) if title_elem else title re.sub(r^【.*?】, , title) # 去除前缀 # 价格提取带格式转换 price_elem item.select_one(div.p-price i) price_text price_elem.get_text(stripTrue) if price_elem else 0 price float(re.sub(r[^\d.], , price_text)) if price_text else 0.0 # 店铺类型判断 shop_elem item.select_one(div.p-shop span) is_jd_self 自营 in shop_elem.get_text(stripTrue) if shop_elem else False # 评论数提取 commit_elem item.select_one(div.p-commit a) comment_text commit_elem.get_text(stripTrue) if commit_elem else 0 comment_count int(re.sub(r[^\d], , comment_text)) if comment_text else 0 # PLUS会员价判断 plus_elem item.select_one(span.p-price-plus) has_plus_price 是 if plus_elem else 否 items.append({ title: title, price: round(price, 1), is_jd_self: is_jd_self, comment_count: comment_count, has_plus_price: has_plus_price }) except Exception as e: # 字段级错误不影响整体 continue # 4. 排序与输出 df pd.DataFrame(items) df df.sort_values([price, comment_count], ascending[True, False]) return df if __name__ __main__: url https://search.jd.com/Search?keywordiPhone15encutf-8 result_df extract_data(url) result_df.to_csv(jd_iphone15_price.csv, indexFalse, encodingutf-8-sig) print(f成功提取 {len(result_df)} 条数据)实操心得生成的脚本不是终点而是起点。我总会做三件事① 把soup.select()替换为soup.find_all()测试兼容性某些复杂页面 lxml 选择器会失效② 在try-except块里加日志print(f第{i}个商品标题{title})快速定位哪条数据异常③ 用df.info()检查字段类型确保price是float64而非object。这些细节教程从不提但每天都在救你的命。3.3 进阶技巧处理动态渲染与反爬迷宫当遇到必须渲染的页面如某海外电商的 React 应用Claude Code 会启用 Chromium但绝不是简单地driver.get(url)。它采用“渐进式渲染”策略策略一延迟加载内容的智能等待传统做法是time.sleep(5)但页面加载时间波动极大。Claude Code 生成的代码会这样写from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待关键元素出现比固定sleep精准10倍 wait WebDriverWait(driver, 15) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, div.product-grid))) wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, loading-spinner)))它等待的是业务逻辑完成信号商品网格出现、加载动画消失而非技术信号DOM 加载完毕。策略二指纹伪装的轻量化实现面对高级反爬Claude Code 不会教你装一堆undetected-chromedriver而是用更优雅的方式# 启动Chrome时注入定制化指纹 options webdriver.ChromeOptions() options.add_argument(--no-sandbox) options.add_argument(--disable-dev-shm-usage) # 关键注入真实的User-Agent和屏幕尺寸 options.add_argument(f--user-agent{get_real_ua()}) # 从UA池随机取 options.add_argument(--window-size1920,1080) # 关键禁用自动化特征 options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False) driver webdriver.Chrome(optionsoptions) # 关键覆盖navigator.webdriver属性 driver.execute_cdp_cmd(Page.addScriptToEvaluateOnNewDocument, { source: Object.defineProperty(navigator, webdriver, { get: () undefined }) })这套组合拳让我们在某奢侈品官网的抓取中成功率从32%提升到96.8%且无需维护复杂的代理池。策略三验证码的语义绕过遇到图形验证码Claude Code 的第一反应不是调 OCR API而是分析验证码出现的上下文如果验证码只在“搜索关键词过多”时触发它会自动降低请求频率如果验证码与“登录态”强相关它会优先尝试无登录态的公开API如果必须过验证码它会调用ddddocr库比打码平台便宜90%且只对失败请求触发避免无效消耗。我们曾抓取某政府招标网其验证码有3种类型数字、汉字、算术Claude Code 自动生成的脚本会先用cv2判断验证码类型再路由到对应识别模型准确率81.4%成本仅为打码平台的1/7。4. 避坑指南那些没人告诉你的“Claude Code 爬虫”真相4.1 常见问题速查表附真实故障记录问题现象根本原因解决方案故障发生频率生成脚本运行报错AttributeError: NoneType object has no attribute get_text目标页面结构变更Claude Code 生成的选择器失效打开prompt.txt在需求中增加“若某字段缺失填空字符串”或手动修改脚本将elem.get_text()改为elem.get_text() if elem else 每周约2.3次高频CSV 输出中文乱码Excel 打开显示方块Windows Excel 默认用 ANSI 编码读取 UTF-8 文件在to_csv()中强制指定encodingutf-8-sig这是微软兼容方案每个项目必现100%抓取速度极慢单页耗时2分钟目标站启用了 Cloudflare 人机验证Claude Code 误判为需渲染在配置文件中设置dom.parser: html.parser强制禁用渲染或添加headers[Accept] text/html,application/xhtmlxml每月约1.7次中频数据重复同一商品出现3次页面使用瀑布流商品DOM被多次插入在脚本中添加去重逻辑df.drop_duplicates(subset[title, price], keepfirst)每个项目约0.8次低频API 调用失败返回429 Too Many RequestsAnthropic API 有速率限制Claude Code 默认并发过高修改配置文件api.max_retries: 1并在脚本外加time.sleep(0.5)间隔新账号首次使用必现100%注意所有解决方案都来自真实故障日志。比如“中文乱码”问题我们曾因忽略utf-8-sig导致财务部同事反复打电话问“为什么报表里的‘苹果’变成‘□□’”后来把这条写进团队 SOP 第一条。4.2 五个血泪教训从翻车现场学来的经验教训一别信“一次提示永久有效”2025年3月我用 Claude Code 抓取某招聘网站提示词是“提取公司名、职位、薪资、经验要求”。运行3个月后突然全量失败。排查发现对方把“经验要求”字段从span3-5年/span改成了span>