当前位置:  首页>> 技术小册>> Python3网络爬虫开发实战(下)

15.13 Scrapy 实战

在Python网络爬虫开发的广阔领域中,Scrapy作为一个快速、高层次的Web抓取和网页抓取框架,凭借其强大的功能集和可扩展性,成为了众多开发者和数据科学家的首选工具。本章“Scrapy实战”将带你深入探索Scrapy的核心组件、项目结构、实战案例以及高级技巧,帮助你从理论走向实践,掌握Scrapy的精髓。

15.13.1 Scrapy基础回顾

在开始实战之前,简要回顾一下Scrapy的基本概念是必要的。Scrapy是一个基于Twisted异步网络框架的爬虫框架,它提供了丰富的内置组件,如引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)、项目管道(Item Pipelines)等,这些组件协同工作,实现了从网页下载、解析到数据处理的完整流程。

  • 引擎(Engine): 控制数据流在Scrapy各个组件间流动的中枢。
  • 调度器(Scheduler): 负责接受引擎发送的请求,并按照一定的顺序将它们排列,等待下载器下载。
  • 下载器(Downloader): 负责从互联网上下载页面内容。
  • 爬虫(Spiders): 用户自定义的类,用于解析下载后的页面,提取需要的数据或进一步生成新的请求。
  • 项目管道(Item Pipelines): 负责处理爬虫提取的数据,如清洗、验证、存储等。

15.13.2 创建Scrapy项目

实战的第一步是创建一个Scrapy项目。假设我们要爬取一个电商网站上的商品信息,首先需要在命令行中执行以下命令来创建一个新的Scrapy项目:

  1. scrapy startproject myecommerce_scraper
  2. cd myecommerce_scraper

接下来,在项目目录下创建一个爬虫:

  1. scrapy genspider -t basic myecommerce myecommerce.com

这里-t basic指定了生成基本模板的爬虫,myecommerce是爬虫的名称,myecommerce.com是你要爬取的网站的域名(或起始URL)。

15.13.3 编写爬虫

编辑myecommerce_scraper/myecommerce/spiders/myecommerce.py文件,编写爬虫逻辑。一个基本的Scrapy爬虫类会继承自scrapy.Spider,并定义起始请求的URL列表和解析这些请求的回调函数。

  1. import scrapy
  2. class MyecommerceSpider(scrapy.Spider):
  3. name = 'myecommerce'
  4. allowed_domains = ['myecommerce.com']
  5. start_urls = ['http://myecommerce.com/categories/electronics']
  6. def parse(self, response):
  7. # 解析商品列表页面
  8. for product in response.css('div.product'):
  9. item = {
  10. 'name': product.css('h3 a::text').get(),
  11. 'price': product.css('p.price::text').get(),
  12. 'link': product.css('h3 a::attr(href)').get()
  13. }
  14. yield item
  15. # 跟进分页链接
  16. next_page = response.css('a.next-page::attr(href)').get()
  17. if next_page:
  18. yield response.follow(next_page, self.parse)

在这个例子中,我们使用了CSS选择器来提取商品信息,并跟进分页链接以继续爬取。

15.13.4 定义Item与Item Pipeline

在Scrapy中,Item用于定义爬取的数据结构。编辑myecommerce_scraper/myecommerce/items.py,定义Item:

  1. import scrapy
  2. class MyecommerceItem(scrapy.Item):
  3. name = scrapy.Field()
  4. price = scrapy.Field()
  5. link = scrapy.Field()

接下来,创建Item Pipeline来处理爬取到的数据。编辑或创建pipelines.py,实现数据存储逻辑:

  1. class JsonWriterPipeline(object):
  2. def open_spider(self, spider):
  3. self.file = open('items.json', 'w')
  4. def close_spider(self, spider):
  5. self.file.close()
  6. def process_item(self, item, spider):
  7. line = json.dumps(dict(item)) + "\n"
  8. self.file.write(line)
  9. return item

settings.py中启用这个Pipeline:

  1. ITEM_PIPELINES = {
  2. 'myecommerce.pipelines.JsonWriterPipeline': 300,
  3. }

15.13.5 爬取与调试

一切准备就绪后,可以运行爬虫了:

  1. scrapy crawl myecommerce

Scrapy提供了丰富的日志信息,帮助你了解爬虫的运行情况。如果遇到问题,可以利用Scrapy的Shell功能进行调试:

  1. scrapy shell http://myecommerce.com/categories/electronics

在Scrapy Shell中,你可以尝试各种XPath或CSS选择器,查看它们是否能够正确提取数据。

15.13.6 高级技巧

  • 使用Scrapy中间件:Scrapy中间件允许你在请求发送和响应接收时插入自定义功能,如添加HTTP头、处理Cookies、代理设置等。
  • 反爬虫策略应对:面对网站的反爬虫机制,可能需要设置User-Agent、使用代理IP、限制请求频率等策略。
  • 增量爬取:对于需要定期更新的数据,实现增量爬取可以有效减少数据冗余和爬取成本。
  • 分布式爬取:Scrapy结合Scrapyd和Redis等工具可以实现分布式爬取,提高爬取效率。

15.13.7 实战总结

通过本章的实战演练,我们不仅学会了如何使用Scrapy创建项目、编写爬虫、定义Item和Item Pipeline,还了解了Scrapy的一些高级特性和应对反爬虫策略的方法。Scrapy的强大之处在于其灵活性和可扩展性,通过自定义组件和中间件,可以轻松地适应各种复杂的爬取需求。希望本章的内容能够帮助你更好地掌握Scrapy,并在实际项目中发挥其最大效用。