以下谈论的 scrapy 基于 0.20.2 版本(当前最新版本是 0.22.0 ),python 2.7.6。
开发环境是windows 7 sp1。
互联网上比较有价值的参考资料
1. Scrapy入门教程
对官网文档的翻译,主要讲了 scrapy 的基本使用。创建一个工程,使用 item 和 spider 。我们会简单涉及到官方教程的内容。
这篇文章并未涉及到代码细节,介绍了一些使用 scrapy 的经验,用的是较老的0.9版本。我们会对该文章涉及到的内容简单展开。
一 安装 scrapy
因为不同的版本 scrapy 依赖库变换很大,网上的安装教程版本太老,所以我的建议是直接安装 scrapy ,运行 scrapy 时 python 打印的错误可以看出是缺少了哪个库,缺了哪个安装哪个。
安装 scrapy 后 会多出 python/Scripts 目录,记得添加到环境变量,这样才能直接在命令行使用“scrapy”命令。
二 创建项目
在命令行运行 “scrapy startproject 项目名”可以直接在当前目录创建 scrapy 工程。
工程目录会有如下文件:
scrapy.cfg
配置文件,开发中基本用不到。
ajian\item.py
这里主要处理递归爬取和返回页面数据。
ajian\pipelines.py
返回的数据会传到这里,进行下一步处理。存储到数据库或者进行分析,随你喜欢。
ajian\settings.py
设置文件,有很多有趣的设置,比如是深度还是广度爬,对每个IP的爬虫数,每个域名的爬虫数,总爬虫数,爬虫延时等等。
ajian\__init__.py
ajian\spider\__init__.py
上述两个文件是 python 包要求的文件,对 scrapy 作用不大。
三 构建第一个蜘蛛
使用命令构建的项目默认生成了 pipelines.py 却没有生成 spider.py 文件,有点让人摸不着头脑。不过无所谓,我们自己写一个就好了。在 spider 新建文件 ajian_spider.py 内容如下。
from scrapy.spider import BaseSpider class AJianSpider(BaseSpider):
name = "ajian"
start_urls = [
"http://www.163.com/"
] def parse(self, response):
print response.body
其中 name 变量和 start_urls 是必须的,name 变量是启动 scrapy 抓取时指定的蜘蛛名, start_urls 是初始抓取的 url,是个 list,可以指定多个。现在一个最简单的蜘蛛就做好了,只有一个功能,输出163的页面内容。
这个蜘蛛太逊了,我们加上最基本的功能,返回页面内容、递归爬取。
在讲返回页面内容和递归爬取之前,先了解一些背景知识。
spider.py 文件中的 parse 函数实际是个迭代器,python 有一个命令 yield ,有一篇文章很详细的说明了 yield 的作用。这里简略描述一下。当调用 yield 时,不仅会返回值,还会记录当前函数的状态,在下次调用函数时,会从调用 yield 的下一句开始执行。相当于函数执行到一半,先返回给调用者一个结果,再接着执行。
parse 可以返回两种对象,一种是 item 另外一种是 Request,分别对应着页面内容和递归请求。
如果返回的是Request,那么会将这个返回结果放到待抓取列表;如果返回的是item,则会传递到pipelines.py进行处理。
待续。。。