安装
目前只支持python2
pip install Scrapy
升级Scrapy
pip install --upgrade Scrapy
UR²IM——基本抓取流程
和Scrapy打交道时,你所遵循得最通用的流程是UR²IM流程。
创建项目
进入你想保存项目的目录
scrapy startproject tutorial
tutorial/
├── scrapy.cfg #项目的配置文件
└── tutorial #项目的python文件
├── __init__.py
├── items.py #项目中的item文件
├── middlewares.py
├── pipelines.py #pipelines文件
├── settings.py #设置文件
└── spiders #防止spider代码的目录
└── __init__.py
定义Item
Item是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供额外保护机制来避免拼写错误导致的为定义字段错误。类似ORM中作的一样。
首先根据需要从dmoz.org获取到的数据对item进行建模,需要从dmoz中获取名字,url以及网站的描述。
tutorial/items.py
class DmozItem(scrapy.Item):
title=scrapy.Field()
link=scrapy.Field()
desc=scrapy.Field()
编写第一个爬虫
Spider使用户编写用于从单个网站爬取的类。
其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成的item的方法。
创建Spider
- name:用于区别Spider,该名字唯一。
- start_urls:包含了Spider在启动时进行爬取的url列表。
- parse()是spider得一个方法。被调用时,每个初始URL完成下载后生成的Response对象将会作为为以参数传递给该函数。该方法负责解析返回的数据,提取数据以及生成需要进一步处理的URL的Request对象。
tutorail/spiders.dmoz_spider.py
import scrapy
class DomzSpider(scrapy.Spider):
name="dmoz"
allowed_domains=["dmoz.org"]
start_urls=[
"http://exanple.com/"
]
def parse(self, response):
filename=response.url.split("/")[-2]
with open(filename,'wb') as f:
f.write(response.body)
并且生成url所对应的内容的文件被创建。
原理:Scrapy为Spider的start_urls属性中的每个URL创建了scrapy.Request对象,并将parse方法作为会掉函数故只给Request。
Request对象经调度,执行生成scrapy.http.Response对象并返回给spider.parse()方法。
Selectors选择器简介
从网页中提取数据有很多种方法。Scrapy使用了一种基于XPath和CSS表达机制:Scrapy Selectors。
Selector有四种基本方法:
- xpath():传入xpath表达式,返回该表达式所对应的所有节点的selecor list 列表;
- css():传入CSS表达式,返回该表达式所对应的所有节点的selector list列表;
- extract():序列化该节点为unicode字符串并返回list;
- re():根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。
使用Selector选择器
使用内置的Scrapy shell,需要已安装好的IPython。
pip install ipython --user
scrapy shell "http://example1.com"
当shell载入之后,你将得到一个包含response
的数据的本地response变量。输入response.body
将会得到response的包体,输入response.head
将会得到包头。
输入response.selector时,将获取到一个可以用于查询返回数据的selector选择器。以及映射到 response.selector.xpath() 、 response.selector.css() 的 快捷方法(shortcut): response.xpath() 和 response.css() 。
In [2]: response.xpath('//title')
Out[2]: [<Selector xpath='//title' data=u'<title>Example 1</title>'>]
In [3]: response.xpath('//title').extract()
Out[3]: [u'<title>Example 1</title>']
In [4]: response.xpath('//title/text()')
Out[4]: [<Selector xpath='//title/text()' data=u'Example 1'>]
In [5]: response.xpath('//title/text()').extract()
Out[5]: [u'Example 1']
In [3]: response.xpath('//title').extract()
Out[3]: [u'<title>Example 1</title>']
In [4]: response.xpath('//title/text()')
Out[4]: [<Selector xpath='//title/text()' data=u'Example 1'>]
In [7]: response.xpath('//title/text()').re('(\w+)')
Out[7]: [u'Example', u'1']