爬虫框架:Scrapy 快速入门

一、Scrapy简介

Scrapy 是一种网络爬虫框架,用于对网站进行爬网并从其页面提取结构化数据。它的应用很广泛,从数据挖掘监控再到自动化测试都可以用它来完成。

1.1 示例代码

下面是一个最简单的使用示例:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
   
   
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

把它放在一个文本文件中,命名为 quotes_spider.py 然后用 runspider命令:

scrapy runspider quotes_spider.py -o quotes.jl

运行完成后,它将以JSON格式将响应数据保存在quotes.jl 文件中,如下所示。

1.2 示例代码的运行流程

当我们运行scrapy runspider quotes_spider.py命令时,Scrapy会自动在quotes_spider.py 文件中查找Spider(它被定义为scrapy.Spider的子类),并通过爬虫引擎运行它:

  1. 爬虫先向start_urls列表中的 url 发送请求
  2. 得到响应后,调用默认的parse回调方法,并将响应传递给它;
  3. 在回调方法中,我们使用CSS选择器循环取出目标元素,提取信息并yield;
  4. 循环完成后查找下一页的链接,并使用与回调相同的解析方法调度下一个请求

二、安装Scrapy

Scrapy需要Python 3.6+,可以是CPython实现(默认),也可以是PyPy 7.2.0+实现(参见备选实现)。

2.1 Ubuntu下安装

安装依赖,在终端中执行:

sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

使用pip安装Scrapy:

pip install Scrapy

2.2 Windows下安装

在windows系统下安装,建议使用conda(AnacondaMiniconda):

conda install -c conda-forge scrapy

使用pip会有依赖问题,虽然有解决方法,但还是推荐conda

2.3 Mac OS下安装

请直接参考官方文档:传送门

三、Scrapy 快速入门

我们下面通过爬取quotes.toscrape.com来快速入门Scrapy,该网站是一个展示名人名言的网站。

我们接下来需要完成以下任务:

  1. 创建一个 scrapy 项目;
  2. 写一个 spider(spider 只是整个项目的一部分,并非指代整个爬虫项目)来爬取网站并提取数据;
  3. 使用命令行导出抓取的数据;
  4. 改变 spider 递归地跟随链接;
  5. 使用 spider 参数。

3.1 创建 scrapy 项目

在开始抓取之前,我们必须建立一个新的Scrapy项目,名称为tutorial。在终端中执行命令:

scrapy startproject tutorial

scrapy 会创建如下的目录:

tutorial/
    scrapy.cfg            # 部署配置文件
    tutorial/             # 存放我们的代码
        __init__.py
        items.py          # 定义 items
        middlewares.py    # 中间件
        pipelines.py      # 管道,持久化相关内容
        settings.py       # 项目配置文件
        spiders/          # 存放我们编写的 spider
            __init__.py 

3.2 编写 spider

scrapy 使用 spider 来抓取网站,而 spider 被定义为一个类,并且必须继承 scrapy.Spider类。

在 spider 文件夹下新建 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 = f'quotes-{
     
     page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {
     
     filename}')

scrapy.Spider定义了一些方法和属性:

  • name:spider 的名称,是一个唯一标识,即在整个项目中不能有同名的 spider。

  • start_requests():必须返回一个可迭代对象,比如一个列表或生成器对象。spider 将从这些对象开始爬取,之后的请求将从这些初始请求中陆续生成。

  • parse():一个回调方法,用于处理请求的响应。response参数是TextResponse的一个实例,它保存页面内容,并有一些进一步处理响应的方法。

    parse()方法通常用来解析响应,将所抓取的数据作为字典提取出来,同时查找要请求的新url,并从中创建新的请求。

3.3 运行爬虫项目

在 scrapy.cfg 同级目录下执行以下命令:

scrapy crawl quotes

上面的命令运行名称为“quote”的 spider,会输出类似于下面的内容:

... (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 两个文件,其中的内容对应于各自的url。

3.3.1 start_requests 方法的快捷方式

我们可以定义一个start_urls类属性,它是一个要请求的url的列表,用它可以代替start_requests方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花_城

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值