Scrapy 学习文档

Scrapy简介: 当前最流行的基于 python 的爬虫框架

本文将介绍 Scrapy 安装与快速开始

安装

强烈推荐使用虚拟环境

$ sudo pip install virtualenv
$ cd /yourownpath # 在你认为适当的路径下
$ sudo virlualenv venv
$ cd venv
$ source bin/activate # 开启虚拟环境
---------开始在虚拟环境中安装scrapy-----------
(venv)$ pip install scrapy

一般情况下都会自动安装所有依赖包,如果出现某些包无法安装的情况,请 google 之,95%都可以顺利找到解决方案,如果还是解决不了,请在文章下方留言,我们一起探讨。

强烈推荐使用国内 pip 源
pypi源速度过慢的情况下,可以考虑切换至国内源百度一下解决方案
例子:使用清华源

$ sudo -H pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

QuickStart

(venv)$ cd /yourownpath
# 创建你的第一个 scrapy project
(venv)$ scrapy startproject tutorial


# project 结构目录
tutorial/
    scrapy.cfg            # deploy configuration file

    tutorial/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py

第一个爬虫程序

# 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: 定义爬虫的名字,在一个 scrapy project 中每个 name 是独一无二的
  • start_requests(): 比如返回可迭代的 Requests,(可以返回 requests list 或者写一个生成器 就像例子中 yield 一样)。接下来的请求都是从这些初始的请求中生成的。
  • parse(): 一个处理请求回复内容的回调函数,response 参数是 scrapy.http.TextResponse 的实例。 parse 方法通常用来分析 response,将爬取内容转化为 dicts,并发现新的 urls 然后创建新的请求。就像你找到了一个节点,然后继续向下扩散一样,就像蜘蛛织网一样越扩越大,爬取内容越来越多。

怎么运行爬虫

(venv)$ scrapy crawl quotes

运行成功的话,你会在终端里得到和下面类似的打印信息:

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)

在 tutorial/ 下会生成两个文件quotes-1.html and quotes-2.html
让我们分析一下整个爬取过程
start_requests方法里定义了两个初始爬取页面,并返回一个 scrapy.Request 的生成器,回调函数为 parse()。
接下来分析一下 parse 方法,对于每一个 response 生成一个对应的 html 文件,将 response 的内容即 response.body 存入对应的 html 中。
这只是个 scrapy 的 quickstart 程序,不过已经讲清楚 scrapy 的基本使用,接下来我们只需要修改回调函数就可以抓取想要的内容并做相应的操作。接下来我会针对 scrapy 的 xpath 语法同样写一份学习分享。

未完待续。。。

坚持原创技术分享,您的支持将鼓励我继续创作!