其他
用 Scrapy 构建可扩展且合规的网站爬虫,解决抓取…
当你需要用 Scrapy Python 框架开发、优化和维护网站爬虫时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
用 Scrapy 构建可扩展且合规的网站特定
解决思路
- 使用 Scrapy 框架架构和组件构建爬虫。
- 开发 spider 并制定抓取策略。
- 使用 CSS Selectors 和 XPath 表达式提取数据。
- 使用 Item Pipelines 处理和存储数据。
- 开发 Middleware 处理请求/响应。
- 使用 Scrapy-Splash 或 Scrapy-Playwright 处理 JavaScript 渲染内容。
- 使用代理轮换和反爬规避技术。
- 使用 Scrapy-Redis 进行分布式爬取。
- 编写干净、可维护的 spider 代码,遵循 Python 最佳实践。
- 使用模块化 spider 架构,清晰分离关注点。
- 实现健壮的错误处理和重试机制。
- 遵循伦理抓取实践,包括 robots.txt 合规。
- 从一开始就设计可扩展性和性能。
- 彻底记录 spider 行为和数据 schema。
- 按标准结构创建 Scrapy 项目:myproject/ 包含 scrapy.cfg;myproject/ 包含 __init__.py、items.py、middlewares.py、pipelines.py、settings.py;spiders/ 包含 __init__.py、myspider.py。
- 使用能反映目标站点的描述性 spider 名称。
- 定义清晰的 allowed_domains,防止爬取超出范围。
- 实现 start_requests() 以自定义起始逻辑。
- 使用职责清晰、单一的 parse() 方法。
- 利用 ItemLoader 进行一致的数据提取。
- 应用 input/output processors 进行数据清洗。
- 在可能时优先使用 CSS 选择器以提升可读性。
- 对复杂选择使用 XPath(父级遍历、文本规范化)。
- 始终将数据提取到定义的 Item 类中。
- 用默认值优雅处理缺失数据。
- 在 CSS 选择器中使用 ::text 和 ::attr() 伪元素。
- 在 parse_product 中使用 ItemLoader:loader = ItemLoader(item=ProductItem(), response=response);loader.add_css('name', 'h1.product-title::text');loader.add_css('price', 'span.price::text');loader.add_xpath('description', '//div[@class="desc"]/text()');yield loader.load_item()。
- 适当配置 DOWNLOAD_DELAY(至少 1-3 秒)。
- 启用 AUTOTHROTTLE 进行动态速率调整。
- 使用 CONCURRENT_REQUESTS_PER_DOMAIN 限制并行请求。
- 轮换 User-Agent 字符串以避免检测。
- 设置合适的 headers,包括 Referer。
- 使用 scrapy-fake-useragent 进行真实的 User-Agent 轮换。
- 为大规模爬取实现代理轮换 middleware。
- 对敏感目标使用住宅代理。
- 通过自动轮换处理代理失败。
- 在 pipelines 中验证数据完整性和格式。
- 实现去重逻辑。
- 清洗和规范化提取的数据。
- 将数据存储为合适格式(JSON、CSV、数据库)。
- 对数据库操作使用异步 pipelines。
- 在 ValidationPipeline 的 process_item 中验证:如果 item.get('name') 不存在,则 raise DropItem("Missing name field"),否则返回 item。
- 为特定错误码实现自定义重试 middleware。
- 记录失败请求以供后续分析。
- 对请求失败使用 errback 处理器。
- 通过统计收集监控 spider 健康。
- 开发期间启用 HTTP 缓存。
- 使用 HTTPCACHE_ENABLED 避免重复请求。
- 通过 job persistence 实现增量爬取。
- 使用 scrapy.extensions.memusage 分析内存使用。
- 对 I/O 操作使用异步 pipelines。
- 设置推荐生产配置:CONCURRENT_REQUESTS = 16;DOWNLOAD_DELAY = 1;AUTOTHROTTLE_ENABLED = True;AUTOTHROTTLE_START_DELAY = 1;AUTOTHROTTLE_MAX_DELAY = 10;ROBOTSTXT_OBEY = True;HTTPCACHE_ENABLED = True;LOG_LEVEL = 'INFO'。
- 为解析逻辑编写单元测试。
- 使用 scrapy.contracts 编写 spider contracts。
- 使用缓存响应进行可复现测试。
- 验证输出数据格式和完整性。
- 安装/使用 scrapy。
- 安装/使用 scrapy-splash(用于 JavaScript 渲染)。
- 安装/使用 scrapy-playwright(用于现代 JS 网站)。
- 安装/使用 scrapy-redis(用于分布式爬取)。
- 安装/使用 scrapy-fake-useragent。
- 安装/使用 itemloaders。
- 始终尊重 robots.txt,除非明确允许。
- 用描述性 User-Agent 标识爬虫。
- 实现合理的速率限制。
- 未经同意不要抓取个人或敏感数据。
- 抓取前检查网站服务条款。
适用边界 · 注意事项
- 目标站点以复杂 JavaScript 渲染为主,但无法安装 scrapy-splash/scrapy-playwright 或浏览器运行环境时,基础 Scrapy 不适合。
- 只需一次性、小规模抓取,且不希望引入 Scrapy 项目结构、异步框架和依赖时,用更轻量方案更合适。
- 网站条款或法律禁止抓取,或 robots.txt 明确禁止且未获许可时,不应使用本技能执行抓取。