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

15.2 Scrapy入门

在网络爬虫开发的广阔领域中,Scrapy无疑是一个高效、强大且易于扩展的框架。它基于Python开发,专为网页抓取和数据挖掘设计,支持多种数据库和文件格式的输出,如JSON、CSV、XML等。对于想要深入探索Python网络爬虫开发的读者而言,掌握Scrapy是不可或缺的一步。本章将带您踏入Scrapy的世界,从安装配置到基本使用,再到实战演练,逐步揭开Scrapy的神秘面纱。

15.2.1 Scrapy简介

Scrapy是一个快速的高级Web抓取和网页抓取框架,用于抓取网站并从页面中提取结构化的数据。它使用Python编写,并遵循爬虫的标准架构:引擎(Scrapy Engine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)、条目管道(Item Pipelines)等。Scrapy的设计目标是让抓取网页变得简单快速,同时提供强大的功能来提取抓取到的数据。

15.2.2 安装Scrapy

在开始使用Scrapy之前,首先需要确保你的环境中已经安装了Python。Scrapy支持Python 2.7和Python 3.x(推荐Python 3.6及以上版本),因为Python 2已经在2020年初停止支持。

安装Scrapy可以通过pip命令轻松完成。在命令行中执行以下命令:

  1. pip install scrapy

安装完成后,你可以通过运行scrapy --version来检查Scrapy是否成功安装以及安装的版本信息。

15.2.3 Scrapy项目结构

Scrapy项目是一个包含Scrapy配置、爬虫、管道等组件的Python项目。通过Scrapy的命令行工具,可以快速生成项目的基础结构。

创建一个新的Scrapy项目,可以使用以下命令:

  1. scrapy startproject myproject

这将创建一个名为myproject的目录,其中包含以下文件和目录:

  • myproject/:项目的根目录
    • myproject/:项目的Python模块,将会从这里引用代码
      • __init__.py
      • items.py:定义要爬取的数据的容器(类似Django的models)
      • middlewares.py:中间件的定义
      • pipelines.py:数据管道的定义,负责处理爬虫提取的数据
      • settings.py:项目的配置文件
      • spiders/:存放爬虫代码的目录
        • __init__.py

15.2.4 定义Items

在Scrapy中,Item是保存爬取到的数据的容器,类似于字典,但是提供了额外的保护来避免使用未定义的字段。

编辑items.py文件,定义你的Item。例如,假设我们要爬取一个新闻网站,我们可能需要存储新闻的标题、链接、发布时间和内容:

  1. # items.py
  2. import scrapy
  3. class NewsItem(scrapy.Item):
  4. # 定义字段
  5. title = scrapy.Field()
  6. link = scrapy.Field()
  7. pub_date = scrapy.Field()
  8. content = scrapy.Field()

15.2.5 编写爬虫(Spider)

爬虫是Scrapy中用于定义如何爬取网站(或网站特定部分)的类。每个爬虫负责处理一个特定(或一组)网站的爬取工作。

spiders目录下创建一个新的Python文件,例如news_spider.py,并定义一个爬虫类。以下是一个简单的爬虫示例,用于爬取新闻网站的标题和链接:

  1. # news_spider.py
  2. import scrapy
  3. from myproject.items import NewsItem
  4. class NewsSpider(scrapy.Spider):
  5. name = 'news' # 爬虫的名字,必须是唯一的
  6. start_urls = ['http://example.com/news'] # 爬取的起始URL列表
  7. def parse(self, response):
  8. # 遍历新闻列表
  9. for news in response.css('selector_for_news_items'):
  10. item = NewsItem()
  11. item['title'] = news.css('selector_for_title::text').get()
  12. item['link'] = news.css('selector_for_link::attr(href)').get()
  13. yield item # 提交item到pipeline
  14. # 如果有下一页,则继续爬取
  15. next_page = response.css('selector_for_next_page::attr(href)').get()
  16. if next_page:
  17. yield response.follow(next_page, self.parse)

15.2.6 编写Item Pipeline

Item Pipeline负责处理由Spider提取出来的Item,并进行后续处理(如清洗、验证、存储等)。

编辑pipelines.py文件,定义你的Pipeline。以下是一个简单的Pipeline示例,它将数据打印到控制台:

  1. # pipelines.py
  2. class PrintPipeline(object):
  3. def process_item(self, item, spider):
  4. print(item)
  5. return item

然后,在settings.py文件中激活这个Pipeline:

  1. # settings.py
  2. ITEM_PIPELINES = {
  3. 'myproject.pipelines.PrintPipeline': 300,
  4. }

15.2.7 运行爬虫

一切准备就绪后,就可以运行爬虫了。在命令行中,进入你的Scrapy项目目录,然后执行以下命令:

  1. scrapy crawl news

这里的news是你在NewsSpider类中定义的爬虫名字。Scrapy将开始运行爬虫,并根据你定义的逻辑爬取数据,通过管道处理,最后输出结果。

15.2.8 进阶话题

  • 中间件(Middlewares):Scrapy提供了中间件机制,允许你在请求发送之前或响应返回之后插入自定义代码,以实现如请求重试、代理设置、Cookies处理等功能。
  • 选择器(Selectors):Scrapy内置了强大的选择器库lxml和parsel,使得提取网页数据变得简单快捷。
  • 链接提取器(Link Extractors):Scrapy提供了Link Extractors,用于从网页中提取链接,以便进一步爬取。
  • 扩展(Extensions):Scrapy支持通过扩展来添加额外的功能,如邮件通知、统计信息收集等。
  • 部署与监控:了解如何将Scrapy项目部署到生产环境,以及如何监控其运行状态和性能。

结语

通过本章的学习,您应该对Scrapy有了初步的认识,并掌握了如何使用Scrapy进行基本的网页抓取。Scrapy的强大之处在于其灵活性和可扩展性,通过深入学习其各个组件和高级特性,您可以构建出更加复杂和高效的爬虫系统。无论是学术研究、数据分析还是商业应用,Scrapy都将是您不可多得的好帮手。


该分类下的相关小册推荐: