Scrapy简单介绍和使用

spider

什么是scrapy?

Scrapy是基于Python开发的一个高效、轻量级的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结 构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy可使用的场景非常多,试想一下,如果你想做一个电影收录的网站或者APP,这么多的电影资料,手动录入基本是不可行的,这时候用爬虫来获取数据就显得非常的便利了。再比如,要做一个小区的应用,上海大大小小的社区不下两三万个,一个个的收集小区信息工作量也是非常大的。使用Scrapy的话,只要花几个小时,写一个非常简单的爬虫,分分钟就能获取你想要的数据。

Scrapy的特点

  1. 简单
  2. 高效
  3. 快速
  4. 可扩展
  5. 开源

安装Scrapy

Scrapy的安装也十分简单,Mac或Linux下使用pip安装:

$ pip install scrapy

使用easy_install安装:

$ easy_install scrapy

概述

Scrapy的架构图如下(绿色箭头代表数据流)

Scrapy Engine

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。

Scheduler

Scheduler从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。

Downloader

Downloader负责获取页面数据并提供给引擎,而后提供给spider。

Spiders

Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

Item Pipeline

Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(存取到数据库中)。

Downloader middlewares

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

Spider middlewares

Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

数据流(Data flow)

Scrapy中的数据流由执行引擎控制,其过程如下:

  1. 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
  2. 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
  3. 引擎向调度器请求下一个要爬取的URL。
  4. 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
  6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
  7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
  8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
  9. (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

Scrapy 命令

使用方式:scrapy <command> [options] [args]

Available commands:

        bench         Run quick benchmark test
        check         Check spider contracts
        crawl         Run a spider
        deploy        Deploy project in Scrapyd target
        edit          Edit spider
        fetch         Fetch a URL using the Scrapy downloader
        genspider     Generate new spider using pre-defined templates
        list          List available spiders
        parse         Parse URL (using its spider) and print the results
        runspider     Run a self-contained spider (without creating a project)
        settings      Get settings values
        shell         Interactive scraping console
        startproject  Create new project
        version       Print Scrapy version
        view          Open URL in browser, as seen by Scrapy

创建项目

$ scrapy startproject myproject

创建一个新的spider

$ scrapy genspider mydomain mydomain.com

爬取数据

$ scrapy crawl myspider

Scrapy Shell

$ scrapy shell http://www.zhihu.com

什么是selector?

Scrapy使用选择器(Selector)来提取数据,它通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。

HtmlXPathSelector

这是一个通过 XPath 对 HTML 页面进行结构化定位和内容读取的工具。scrapy 使用它定位到网页中用户所需要的数据并进行抓取。

selector的方法

    • xpath(query):

寻找可以匹配xpath query 的节点,并返回 SelectorList 的一个实例结果,单一化其所有元素。

    • css(query):

应用给定的CSS选择器,返回 SelectorList 的一个实例。

    • extract():

串行化并将匹配到的节点返回一个unicode字符串列表。

    • re(regex):

应用给定的regex,并返回匹配到的unicode字符串列表。

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

Spider

Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及您自己编写的spider)。

    • name

定义spider名字的字符串(string),必须唯一。

    • allowed_domains

包含了spider允许爬取的域名(domain)列表(list)。

    • start_urls

URL列表,spider将从该列表中开始进行爬取。

    • parse()

Scrapy处理下载的response的默认方法。

CrawlSpider

爬取一般网站常用的spider。其定义了一些规则(rule)来提供跟进link的方便的机制。

    • rules

一个包含一个(或多个) Rule 对象的集合(list)。 每个 Rule 对爬取网站的动作定义了特定表现。

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
item pipeline的一些典型应用:

  • 验证爬取的数据
  • 查重(并丢弃)
  • 保存到数据库

编写一个Pipeline

每个item pipeline组件是一个独立的Python类,编写pipeline时实现以下方法即可:

    • process_item(item, spider)

每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。

其他方法:

    • open_spider(spider)

当spider被开启时被调用。

    • close_spider(spider)

当spider被关闭时被调用。

我用Scrapy写了几个demo,其中一个可以从安居客抓取小区的基本信息,几分钟就能爬去两万条有效的小区信息。下载地址戳这里

Leave a Comment

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax