Spider 类定义了如何爬取某个网站。包括爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。

Spider 的执行流程:

  1. 以设置的 URL 初始化 Request,设置回调函数,Request 下载完毕返回时,生成 Response,并作为参数传给回调函数,Response 里面包含了所有想要的数据。Spider 中初始的 Request 通过 start_requests()) 来获取, start_requests()) 读取 start_urls 中的URL, 生成 Request 并把 parse()) 作为回调函数。
  2. 在回调函数中处理返回内容,可以使用 XPath 或者 CSS,处理后的数据封装到 Item 对象里面
  3. 通过 Item Pipelinme 存入数据库,也可以使用 Feed exports 存入文件中

scrapy.Spider

最简单的 Spider,其他的 Spider 都继承该类

单个回调函数中返回多个 Request 以及 Item 的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import scrapy
from douban.joke import Joke

class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]

def parse(self, response):
sel = scrapy.Selector(response)
for h3 in response.xpath('//h3').extract():
yield Joke(title=h3)

for url in response.xpath('//a/@href').extract():
yield scrapy.Request(url, callback=self.parse)

name

字符串类型,定义 spider 的名称

allowed_domains

要爬取的域名列表,当 OffsiteMiddleware 开启后,不在列表中的域名将不会被跟进
OffsiteMiddleware 过滤出不由该 spider 负责的 URL。

start_urls

要爬取的具体 URL 列表

make_request_from_url(url)

该方法接受一个URL并返回用于爬取的 Request 对象。 该方法在初始化request时被 start_requests() 调用,也被用于转化url为request。

start_requests()


该方法必须返回一个可迭代对象(iterable)。该对象包含了 Spider 用于爬取的 Request

parse(response)


当 Response 没有指定回调函数时,该方法是 Scrapy 处理下载的 Response 的默认方法,它负责处理 response 并返回处理的数据以及跟进的 URL

log(message[, level, component])

使用 scrapy.log.msg() 方法记录 (log)message,log 中自动带上该spider的 name 属性

closed(reason)

当spider关闭时,该函数被调用。该方法提供了一个替代调用signals.connect()来监听 spider_closed 信号的快捷方式

CrawlSpider

CrawlSpider 可以自定义规则来跟进指定的 URL,除了继承了 Spider 的全部属性,它还提供了新的属性:

rules

一个包含一个(或多个) Rule 对象的集合(list),如果多个 Rule 匹配了相同的连接,该列表中的第一个会被使用

parse_start_url(response)

当start_url的请求返回时,该方法被调用。 该方法分析最初的返回值并必须返回一个 Item 对象或者 一个 Request 对象或者 一个可迭代的包含二者对象