Scrapy = Scratch+Python
,
Scratch
这个单词是抓取的意思
于是乎,爬虫框架
Scrapy
就这样出场了!
环境搭建:
1. 安装setuptools(
http://blog.csdn.net/pfm685757/article/details/48651389)
setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。安装Python时为可选项,建议勾选。
2. 安装Twisted(
http://twistedmatrix.com/trac/)你可以通过
https://pypi.python.org/pypi这个网站找到相关依赖包资源的下载。
Zope.Interface (required)
PyWin32 (required)
PyOpenSSL (needed for SSL)
Python
支持多继承,但是不支持接口,
zope.inteface
是其三方的接口实现库,在
Twisted
中有大量使用(
http://blog.csdn.net/vinrex/article/details/38118547
)
Python
是没有自带访问
windows
系统
API
的库的,需要下载。库的名称叫
pywin32
。(
http://www.linuxidc.com/Linux/2011-12/48525.htm
)
3. 安装lxml
lxml是一种使用 Python 编写的库,可以迅速、灵活地处理 XML。
4. 安装Scrapy
直接在cmd中输入easy_installscrapy回车即可。
Scrapy
入门
进入您打算存储代码的目录中,运行下列命令:
scrapy startproject tutorial
该命令将会创建包含下列内容的 tutorial 目录:
Spider的name用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
进入项目的根目录,执行下列命令启动spider:
scrapy crawl dmoz
您需要进入项目的根目录,执行下列命令来启动shell:
scrapy shell"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
最简单存储爬取的数据的方式是使用
Feed exports:
scrapy crawl dmoz -oitems.json
命令行工具
scrapy.cfg
存放的目录被认为是
项目的根目录
。该文件中包含
python
模块名的字段定义了项目的设置。
一般来说,使用
scrapy
工具的第一件事就是创建您的
Scrapy
项目
:
scrapystartproject myproject
接下来,进入到项目目录中
:
cd myproject
这时候您就可以使用
scrapy
命令来管理和控制您的项目了。
创建一个新的
spider:
scrapygenspider mydomain mydomain.com
fetch:该命令以spider下载页面的方式获取页面。例如,如果spider有 USER_AGENT 属性修改了 User Agent,该命令将会使用该属性。
$ scrapy fetch --nolog http://www.example.com/some/page.html
$ scrapy fetch --nolog --headers http://www.example.com/
View: 在浏览器中打开给定的URL,并以Scrapy spider获取到的形式展现。 有些时候spider获取到的页面和普通用户看到的并不相同。 因此该命令可以用来检查spider所获取到的页面,并确认这是您所期望的。
$ scrapy viewhttp://www.example.com/some/page.html
Shell: 以给定的URL(如果给出)或者空(没有给出URL)启动Scrapy shell。 查看
Scrapy终端(Scrapyshell) 获取更多信息。
$ scrapy shellhttp://www.example.com/some/page.html
当
shell
载入后,您将得到一个包含
response
数据的本地
response
变量。输入
response.body
将输出
response
的包体,
输出
response.headers
可以看到
response
的包头。
更为重要的是,当输入
response.selector
时,
您将获取到一个可以用于查询返回数据的
selector(
选择器
)
,
以及映射到
response.selector.xpath()
、
response.selector.css()
的
快捷方法
(shortcut):response.xpath()
和
response.css()
。
同时,
shell
根据
response
提前初始化了变量
sel
。该
selector
根据
response
的类型自动选择最合适的分析规则
(XML vs HTML)
。
In [1]: sel.xpath('//title')
Out[1]: [<Selector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>]
In [2]: sel.xpath('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']
In [3]: sel.xpath('//title/text()')
Out[3]: [<Selector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>]
In [4]: sel.xpath('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']
In [5]: sel.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']
Parse: 获取给定的URL并使用相应的spider分析处理。如果您提供 --callback 选项,则使用spider的该方法处理,否则使用 parse 。
Settings:在项目中运行时,该命令将会输出项目的设定值,否则输出Scrapy默认设定。
$ scrapy settings --getBOT_NAME
Runspider:在未创建项目的情况下,运行一个编写在Python文件中的spider。
$ scrapy runspidermyspider.py
Version:输出Scrapy版本。配合 -v 运行时,该命令同时输出Python, Twisted以及平台的信息,方便bug提交。
Items
爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供 Item 类来满足这样的需求。
Item
对象是种简单的容器,保存了爬取到得数据。
其提供了
类似于词典
(dictionary-like)
的
API
以及用于声明可用字段的简单语法。
扩展Item
您可以通过继承原始的
Item
来扩展
item(
添加更多的字段或者修改某些字段的元数据
)
。
例如
:
classDiscountedProduct(Product):
discount_percent = scrapy.Field(serializer=str)
discount_expiration_date = scrapy.Field()
您也可以通过使用原字段的元数据
,
添加新的值或修改原来的值来扩展字段的元数据
:
classSpecificProduct(Product):
name = scrapy.Field(Product.fields['name'],serializer=my_serializer)
这段代码在保留所有原来的元数据值的情况下添加
(
或者覆盖
)
了
name
字段的
serializer
。
Item对象
class
scrapy.item.Item
([arg])
返回一个根据给定的参数可选初始化的
item
。
fields
字段(Field)对象
classscrapy.item.Field([arg])