Scrapy 安装、项目创建和运行

Scrapy 爬虫框架可以在 Python2、Python3 的版本上运行。建议使用 Python 3.6.0 以上版本。本章将介绍 Scrapy 爬虫框架的安装、项目创建和运行。

 

1. 安装

我们可以简单地通过 pip 安装 Scrapy 框架及其依赖:

$ pip install scrapy

 

2. 创建项目

Scrapy 安装后,可以通过 Scrapy 命令创建一个爬虫项目,比如创建项目 tutorial:

scrapy startproject tutorial

项目结构如下:

tutorial/
    scrapy.cfg            # 部署配置文件
    tutorial/             # Python模块,代码写在这个目录下
        __init__.py
        items.py          # 数据项定义文件
        pipelines.py      # 数据项管道文件
        settings.py       # 项目设置文件
        spiders/          # 爬虫(蜘蛛)目录
            __init__.py

 

3. 编写爬虫

我们开始编写第一个爬虫类 QuotesSpider,代码存放到 tutorial/spiders/quotes_spider.py 文件中。

import scrapy
class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

爬虫类 QuotesSpider 说明:

  • 爬虫类必须继承 scrapy.Spider。
  • name:用来设置爬虫的标识(也称为名字),它在项目中必须是唯一的,不同的 Spider 不能设置相同的名称。
  • start_requests():必须返回一个迭代的 Requests,Spider 将按照这些 Requests,依次抓取对应的网页。
  • parse():用来处理每个 Request(请求)的响应。其中,response 参数是一个 TextResponse 对象,里面保存了页面内容。TextResponse 类提供了很多用来处理返回数据的方法。parse() 方法不仅用来解析响应,还能提取到新的网址,从而创建新的 Request(请求)。

 

4. 运行爬虫

进入项目根目录,也就是上面的 tutorial 目录。

cd tutorial

执行爬虫项目:

scrapy crawl quotes

其中的参数 quotes 就是爬虫标识(名字)。

运行结果如下:

... (omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)
...

现在,检查当前目录中的文件。您应该注意到,已经创建了两个新文件:quotes-1.html 和 quotes-2.html。文件里面就是我们编写的爬虫抓取的内容。

Scrapy 官方示例 Demo:Scrapy 官方提供了一个演示项目,Demo 项目中含有两个爬虫 Spider,分别使用了 CSS 解析 和 XPath 解析。Scrapy 官方示例地址:https://github.com/scrapy/quotesbot。