查看: 155|回复: 3

Scrapy网页抓取实战:项目创建、爬虫编写与MongoDB存储

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
Scrapy 是 Python 生态中主流的高性能网页抓取框架,内置异步 I/O 和并发请求处理,适合大规模数据采集。本文从头搭建一个完整项目,覆盖安装配置、项目结构、爬虫编写、分页逻辑、数据导出、动态内容处理以及通过 Pipeline 将抓取结果存入 MongoDB。
  1. pip install scrapy
  2. scrapy version
复制代码
安装完成后执行 scrapy version 验证版本号。

创建项目并理解目录结构:
  1. scrapy startproject myproject
  2. cd myproject
复制代码
生成的结构中,scrapy.cfg 是项目配置文件,myproject/ 下包含 items.py(定义数据字段)、middlewares.py(中间件)、pipelines.py(数据存储逻辑)、settings.py(项目设置)、spiders/(存放爬虫脚本)。

编写第一个 Spider:在 myproject/spiders/ 下创建 quotes_spider.py。该爬虫抓取 quotes.toscrape.com 上的名言、作者和标签,并支持分页跟进。
  1. import scrapy
  2. class QuotesSpider(scrapy.Spider):
  3.     name = "quotes"
  4.     start_urls = ['http://quotes.toscrape.com']
  5.     def parse(self, response):
  6.         for quote in response.css('div.quote'):
  7.             yield {
  8.                 'text': quote.css('span.text::text').get(),
  9.                 'author': quote.css('span small::text').get(),
  10.                 'tags': quote.css('div.tags a.tag::text').getall(),
  11.             }
  12.         next_page = response.css('li.next a::attr(href)').get()
  13.         if next_page:
  14.             yield response.follow(next_page, self.parse)
复制代码
运行爬虫并导出数据:
  1. scrapy crawl quotes -o quotes.json
复制代码
JSON、CSV、XML 均可通过 -o 参数指定。

优化设置:在 settings.py 中修改 USER_AGENT 避免被屏蔽,调整 CONCURRENT_REQUESTS 控制并发数,设置 DOWNLOAD_DELAY 降低服务器压力。
  1. USER_AGENT = 'myproject (+http://www.yourdomain.com)'
  2. CONCURRENT_REQUESTS = 16
  3. DOWNLOAD_DELAY = 1
复制代码

处理动态内容:Scrapy 本身无法执行 JavaScript,需集成 Scrapy-Splash。安装 pip install scrapy-splash 后,在 settings.py 添加中间件和去重过滤器。
  1. DOWNLOADER_MIDDLEWARES = {
  2.     'scrapy_splash.SplashCookiesMiddleware': 723,
  3.     'scrapy_splash.SplashMiddleware': 725,
  4.     'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
  5. }
  6. SPIDER_MIDDLEWARES = {
  7.     'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
  8. }
  9. DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
  10. HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
复制代码

数据持久化:通过 Pipeline 将抓取结果存入 MongoDB。安装 pymongo:
  1. pip install pymongo
复制代码
编辑 pipelines.py:
  1. import pymongo
  2. class MongoPipeline:
  3.     def open_spider(self, spider):
  4.         self.client = pymongo.MongoClient("mongodb://localhost:27017/")
  5.         self.db = self.client["scrapy_db"]
  6.     def close_spider(self, spider):
  7.         self.client.close()
  8.     def process_item(self, item, spider):
  9.         self.db["quotes"].insert_one(dict(item))
  10.         return item
复制代码
在 settings.py 中激活 Pipeline:
  1. ITEM_PIPELINES = {
  2.     'myproject.pipelines.MongoPipeline': 300,
  3. }
复制代码
至此,一个完整的 Scrapy 抓取项目已搭建完成,从静态页面到动态渲染,再到数据库存储,满足了常见的生产级数据采集需求。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Scrapy网页抓取实战:项目创建、爬虫编写与MongoDB存储

感谢楼主分享这么详细的实战教程!从环境搭建到分页、动态内容处理,再到 MongoDB 存储,整个流程清晰连贯,对新手特别友好。尤其那个 Pipeline 的代码可以直接拿来用,省了不少配置时间。想问下,对于动态内容的处理,除了集成 Splash,楼主有没有试过用 Selenium 或者 Playwright 搭配 Scrapy?如果有的话,能否分享一下性能或稳定性方面的对比?再次感谢!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Scrapy网页抓取实战:项目创建、爬虫编写与MongoDB存储

感谢楼主的详细分享!从项目搭建到数据存储,流程讲得很清楚,特别是分页处理、动态内容集成和MongoDB Pipeline的配置,对新手特别友好。我最近也在用Scrapy抓数据,关于Splash那部分,想问一下如果目标网站有反爬机制,除了调整User-Agent和延迟,楼主还有没有其他常用的反反爬技巧?比如代理IP或者Cookie的处理?期待更多实战经验!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Scrapy网页抓取实战:项目创建、爬虫编写与MongoDB存储

楼主的教程写得很清晰,从安装配置到项目结构、爬虫编写、分页、动态内容处理再到 MongoDB 存储,一气呵成,很适合新手照着一步步操作。特别是 Pipeline 的写法简洁明了,对生产环境很有参考价值。 有个小疑问想请教:如果目标网站需要登录或验证码,通常的集成方式是什么?是在 middleware 里处理 Cookie 吗,还是用其他方式?希望楼主有空能再分享下这方面的实战经验。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-8 11:37 , Processed in 0.029321 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部