Scrapy是一个由python语言编写的通用爬虫框架,最近项目组的一个兄弟在帮大数据那边从一些大型电商网站上爬取商口信息,就是使用scrapy来操作的。由于帮其修改了一点该项目的东西,这里也顺便记录下scray的一些内容,能写多少是多少吧。scrayp源码托管在GitHub上,官网(http://scrapy.org)。当前已更新到了1.0.x版本。

一、安装

scrapy要求python2.7+ 的环境,ubuntu的很久之前就已经是python2.7+了,安装也比较简单。centos7.x上默认使用的是python2.7+ 。这里以这两个主流发行版为例说下安装。

1、ubuntu下

ubuntu下的安装非常容易 ,直接可以通过apt-get命令搞定(不过默认ubuntu源里的scrapy版本会有些老旧):

1sudo apt-get update && sudo apt-get install scrapy-VERSION

上面VERSION换成你要安装版本号。这里可以导入scrapy的官方源,并导入key和scray.list,如下:

1sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 627220E7
2echo 'deb http://archive.scrapy.org/ubuntu scrapy main' | sudo tee /etc/apt/sources.list.d/scrapy.list

当然也可以使用pip进行安装,命令如下:

1pip install scrapy

2、centos7下

由于centos6下需要升级python版本,这里简单起见直接使用centos7 ,默认centos7使用的python包管理器是easy_install ---当然也可以通过easy_install安装pip。所以使用如下命令搞定scrapy的安装:

1easy_install  scrapy

不过安装过程可能不会像上面那么顺利,就为其还依赖一些rpm包,所以在安装前需要安装如下包:

1yum install libxslt-devel  libffi libffi-devel  python-devel gcc  openssl openssl-devel

如果不事先安装以上包,可能会遇到如下的相关报错和问题

报错1

ERROR: /bin/sh: xslt-config: command not found
** make sure the development packages of libxml2 and libxslt are installed **

解决方法yum -y install libxslt-devel 。

报错2

1Using build configuration of libxslt 1.1.28
2Building against libxml2/libxslt in the following directory: /usr/lib64
3src/lxml/lxml.etree.c:85:20: fatal error: Python.h: No such file or directory
4 #include "Python.h"
5                    ^
6compilation terminated.
7Compile failed: command 'gcc' failed with exit status 1
8error: Setup script exited with error: command 'gcc' failed with exit status 1

缺少python-devel包,因为Python.h文件是在python-devel包中的。直接yum安装该包即可。

报错3

1removing: _configtest.c _configtest.o
2c/_cffi_backend.c:13:17: fatal error: ffi.h: No such file or directory
3 #include <ffi.h>
4                 ^
5compilation terminated.
6error: Setup script exited with error: command 'gcc' failed with exit status

centos下的报错示还是很好的,yum list|grep ffi相关的包,发现执行如下安装yum -y install libffi libffi-devel 。

二、简单测试

我们先创建一个demo项目,并查看下其目录结构:

 1创建demo项目
 2# scrapy startproject demo
 32015-12-26 12:24:09 [scrapy] INFO: Scrapy 1.0.3 started (bot: scrapybot)
 42015-12-26 12:24:09 [scrapy] INFO: Optional features available: ssl, http11
 52015-12-26 12:24:09 [scrapy] INFO: Overridden settings: {}
 6New Scrapy project 'demo' created in:
 7    /root/demo
 8You can start your first spider with:
 9    cd demo
10    scrapy genspider example example.com
11demo项目的目录结构
12# tree demo/
13demo/
14├── demo
15│   ├── __init__.py
16│   ├── items.py
17│   ├── pipelines.py
18│   ├── settings.py
19│   └── spiders
20│       └── __init__.py
21└── scrapy.cfg
222 directories, 6 files

上面创建的这些demo文件作用如下:

  • scrapy.cfg: 项目的配置文件,一般无需修改。
  • tutorial/: 该项目的python模块。之后您将在此加入代码。
  • tutorial/items.py: 项目中的item文件,该文件存放的是抓取的类目,类似于dict字典规则。
  • tutorial/pipelines.py: 项目中的pipelines文件,该文件为数据抓取后进行数据处理的方法。
  • tutorial/settings.py: 项目的设置文件,可以设置请求的request header、cookie等
  • tutorial/spiders/: 放置spider代码的目录。

在进行更细的介绍之前,先看一个官方示例:

修改items.py文件,内容如下:

1import scrapy
2class DmozItem(scrapy.Item):
3    title = scrapy.Field()
4    link = scrapy.Field()
5    desc = scrapy.Field()

该处我们定义了我们要抓取某网站的标题、url、描述三部分信息,后在spider中会调用到。

可以根据上面的提示,使用scrapy genspider example example.com 命令创建一个name名为example,start_urls为example.com 的spider,也可以手动在demo/spiders目录下创建一个文件,按官方示例内容如下:

 1import scrapy
 2class DmozSpider(scrapy.Spider):
 3    name = "dmoz"
 4    allowed_domains = ["dmoz.org"]
 5    start_urls = [
 6        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
 7        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
 8    ]
 9    def parse(self, response):
10        filename = response.url.split("/")[-2]
11        with open(filename, 'wb') as f:
12            f.write(response.body)

上面这段代码非常简单,定义了一个名字为dmoz的spider,抓取的起始页为二个,没有指定rules及followe页面。也未指定特别的回调函数,只编辑了一个默认的处理函数parse,作为是将上面两个页的内容抓取下来,保存到文件。所以连items里的定义都没用到。调用该抓取规则的命令如下:

1scrapy crawl dmoz

注:在一个项目下spider的name需要是唯一的,绝对不能重复,一个项目下有多少spider可以通过scrapy list查看。

1# scrapy  list
2dmoz
3example

而使用items,就要加入选择器(selectors)将相应的request内容通过xpath(xml 或html 规则)或re模块规则对页面对应处理后斌值给items项,并返回。如下:

 1import scrapy
 2class DmozSpider(scrapy.Spider):
 3    name = "dmoz"
 4    allowed_domains = ["dmoz.org"]
 5    start_urls = [
 6        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
 7        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
 8    ]
 9    def parse(self, response):
10        for sel in response.xpath('//ul/li'):
11            title = sel.xpath('a/text()').extract()
12            link = sel.xpath('a/@href').extract()
13            desc = sel.xpath('text()').extract()
14            print title, link, desc

再执行scrapy crawl dmoz时,会将相应的三项结果输出到屏幕,也可以将print改为return,并在scrapy crawl命令后面使用-o参数指定保存到文件,默认支持的文件类型有csv\xml\json等。

三、其他

本篇介结的示例可以在github上找到:https://github.com/scrapy/dirbot

不懂英文可以先查看Scrapy 0.24的中文文档 ,如查想查看最新版本的doc文档,可以到http://scrapy.org/doc/官方站点查看。