Scrapy 爬虫之 Spiders 官网手册翻译

网站)上的内容,包括如何爬行(比如跳转链接),如何从页面获取结构化的数据。换句话说,spider 提供了自定义爬行行为和从特定网站解析数据的平台。

对于 spider,抓取过程会这样进行:

  1. 一开始,生成请求爬第一个URL,然后指定回调函数,该函数以这些请求的响应作为参数。
    第一个发起的请求是由调用 start_request() 方法完成的,默认情况下,该方法生成 start_urls 的请求,将 parse 方法作为请求的回调函数。

2.在回调函数中,主要解析响应(web页面)并返回提取数据的字典、Item 对象、Request 对象或这些对象的迭代。这些请求包含回调(可能是同一个回调),然后由Scrapy下载,下载的响应会给指定的新回调处理。
这里可以理解为,在回调中需要处理 scrapy 下载,交由回调函数处理。回调函数默认为 'parse(self, response)',会在下面一步介绍。

  1. 在回调函数中中,你需要解析页面内容,一般来说使用 Selectors 解析(也可以使用 BeautifulSoup, lxml 和任意你喜欢的解析机制),然后生成解析数据内容。
  2. 在最后,spider 返回的解析内容会被持久化到数据库(也可以是数据管道)或通过 Feed 导出为文件。

即使这个过程被应用在绝大部分 spider 上,但处于不同的期望,还是有不同的默认 spider 绑定到 Scrapy 上。

scrapy.Spider


class scrapy.spiders.Spider

这是最简单的 spider,所有 spider 都必须继承它。(包括与 Scrapy 绑定的 spider和你自己编写的 spider)它不提供任何特定的函数。只是提供一个默认的 start_requests() 的实现,这个函数根据 start_urls 发送请求并为每个响应调用 parse 方法。

name

name 是一个字符串,代表 spider 的名称。也是 Scrapy 定位和实例化 spider 的方式,所以 name 必须保持唯一。然而,并没有要求你不能创建多个 spider 的实例。name 是 spider 最重要的属性而且是必须的。

如果 spider 仅抓取一个域名,通常做法是将该域名作为 spider 的名称。比如,爬取 'mywebsite.com' 就命名 spider 为 mywebsite。

allowed_domains

可选项,域名列表,表示当前 spider 允许爬取的域名。如果请求的 URL 不属于域名列表中的内容,那么该请求将不会被允许(offsiteMiddleware 默认已启用)。

以 'http://www.example.com/1.html' 来说,添加的域名为 'example.com'

start_urls

URL 的列表,是spider 开始爬取的位置,接下来的 Request 都会以此由该列表中的数据生成。

custom_settings

自定义配置,spider 运行时项目范围内的陪我之会覆盖它。它必须定义成类属性确保其在实例化之前更新。

crawler

这个属性在初始化类后通过 form_crawler() 类方法配置,并与 spider 实例绑定的 Crawler 对象关联。

Crawlers 在项目中封装了很多独立功能组件。

settings

配置 spider 运行时的设置,这是一个 settings 类的实例。

logger

Python 日志以 spider 名称作为 logger,你可以发送 log 消息,具体参考 Logging for Spiders

from_crawler(crawler, *args, **kwargs)

这是一个类方法,用于创建 spider。

你必须要直接重写这个方法,因为默认实现了 '__init__()' 的代理,给定'args' 和 'kwargs' 再调用该方法。

尽管做了上述处理,该方法中还暴露了 'crawler' 和 'settings' 属性,以便于实例化后能在后续的 spider 代码中使用这两个属性。

Parameters

  • crawler (Cralwer instance) - 绑定的 crawler 实例
  • arg (list) - 传递给'__init__()'的位置参数
  • kwargs (dict) - 传递给 '__init__()' 的关键字参数

start_requests()

这个方法必须返回可迭代对象,该对象中包含 spider 要爬取的请求。spider 开始抓取时 scrapy 会调用次方法,且只调用一次,所以该方法返回生成器也是可以的。

默认情况下,该方法为 start_urls 中每个 url 生成 'Request(ur, dont_filter=True)' 请求。

如果你的请求从某个域名开始抓取,重写此处即可。比如你需要POST请求登陆后开始发起请求,那么做如下修改:

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_request(self):
        return [scrapy.FromRequest("http://www.example.com/login", 
                    formdata={"user": "john", "pass": "secret"}, callback=self.logged_in)]
    
    def logged_in(self, response):
        pass

parse(response)

如果请求没有指定回调,parse 便作为默认回调。scrapy 中该回调用于传输下载的响应。
parse 方法控制着响应的传输,并返回抓取的数据或下一个URL。其他的请求回调也有同样的需求。
这个方法以及其他的请求回调,都必须返回请求、字典、Item对象的迭代。

Parameters:

response(Response) - 将要解析的请求

log(message[, level, component])

通过 spider 的 logger 封装发送日志消息,保持向后兼容。

closed(reason)

关闭 spider 时调用。

Generic Spiders 常规 spider

Scrapy 提供了多个常规的 spider,各自提供了方便的抓取功能,如根据规则跳转链接,解析 XML/CSV 提要等

CrawlSpider

爬取常规网站最常用的 spider,提供跳转链接的规则。
两个新的属性:

rules
如果有多个规则命中,则默认取第一个。

parse_start_url(response)
可重写,解析初始的响应

Crawling rules

参数:link_extractor,callback, cb_kwargs, follow, porcess_links, process_request

link_extractor

Link Extractor 对象,定义了获取链接的规则

callback
回调(可调用对象)

cb_kwargs
callback 的参数

follow
响应中的链接是否跳转。如果 callback 为 None,则默认 follow=True,否则默认为 False。

process_links
使用特定的 link_extractor 时,响应中的每个链接都调用 process_links()。主要用于过滤。

process_request
被规则提取的请求都会调用 process_request()

XMLFeedSpider

解析 XML 提要

iterator: 默认为 iternaodes
itertag:默认为 item,可以设置为需要迭代的 tag
namespaces:设置域名,可以与 itertag 一起使用

adapt_resonse(response)
在解析响应前对 response 做适度的修改

parse_node(response, selector)
必须重写的方法,用于对提供的 tag 进行节点匹配

process_reuslts(response, results)
spider 返回的每个结果都会调用这个方法,目的在于返回结果到核心框架前执行必要的处理。

CSVFeedSpider

与 XMLFeedSpider 类似,只不过把迭代节点node改成了迭代行。

delimiter 分隔符,默认为逗号
quotechar 引号,默认为双引号
headers CSV 文件列名
parse_row(response, row) 解析每一行

adapt_response() process_results() 重写 response 和 result 方法

SitemapSpider

网站地图,不做详解
[1] https://docs.scrapy.org/en/latest/topics/spiders.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335