scrapy学习--Spiders

来源:互联网 发布:sql语句单引号转义 编辑:程序博客网 时间:2024/04/30 05:36

一、爬虫的工作流程

1.通过调用start_request()中的URL获取初始的request,并以parse为回调函数生成Request。

2.在parse方法中分析返回的内容,返回Item对象或者Request或者一个可迭代容器。

3.在parse内可以使用选择器分析网页内容,并生成item。

4.由pipeline将返回的item存储到数据库或者使用Feed exports存入到文件中。


二、Spider参数

1.crawl时添加-a传递参数:

scrapy crawl myspider -a category=electronics
2.在构造器中获取参数:

import scrapyclass MySpider(Spider):    name = 'myspider'    def __init__(self, category=None, *args, **kwargs):        super(MySpider, self).__init__(*args, **kwargs)        self.start_urls = ['http://www.example.com/categories/%s' % category]        # ..

三、内置Spider

Spider是最简单的spider。每个其他的spider必须继承自该类。

属性、方法

name定义了Scrapy如何定位Spider,因此是必须且唯一的。

allowed_domains 可选。包含了spider允许爬取的域名列表。当OffsiteMiddleware启用时,域名不在列表中的URL不会被跟进。

start_urls URL列表。spider从该列表中开始爬取。

custom_settings 当运行爬虫时,字典的设置将从项目广泛配置重写。它必须被定义为类属性,因为在实例化之前更新的设置。

crawler 这个属性被设置在类初始化并且链接到被爬虫初始化绑定的Crawler对象之后。

settings 爬虫运行的设置。

from_crawler(crawler , *args , **kwargs) 这个方法用于Scrapy创建你的爬虫。

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

make_requests_from_url(url) 返回一个request对象。该方法在初始化request时被start_request()调用。

parse(response) 用于分析response的主体方法。

log(message[,level,component])  log方法。

closed(reason)  spider关闭是被调用。

四、Spider实例

前面的三项实际上主要在描述Spider和它的方法是什么。下面以实例为例理解Spider怎么用。

# -*- coding: utf-8 -*-'''Created on 2015年8月25日@author: frozen cloud'''from _elementtree import parseimport scrapyfrom firstSpider.items import FirstspiderItemclass MultSpider(scrapy.Spider):    name = "multspider"    allowed_domains = ["zhihu.com"]    start_urls = (        'http://www.zhihu.com/question/31810474#answer-16771792',        'http://www.zhihu.com/question/22138966#answer-19540679',        'http://www.zhihu.com/question/22138958',    )    def parse(self, response):        self.log('A response from %s just arrived!' % response.url)        sel = scrapy.Selector(response)        for h3 in response.xpath('//h3').extract():            yield FirstspiderItem(name=h3)        for url in response.xpath('//a/@href').extract():            yield scrapy.Request(url,callback=self.parse)
这个例子演示了单个回调函数中返回多个Request和Item,以及log方法。

在尝试调试这个例子时,如果使用的是eclipse+pydev进行调试,还需要修改debug配置的,具体请查看

scrapy学习笔记——第一个项目,eclipse+pydev搭建scarpy项目

在这个例子中可以在debug中清晰的看到第一个item返回的结果,以及第二个所报的错误。


查看源码:

可以看出这里必须是绝对路径,否则不会出现冒号。但是a标签中提取的都是相对路径所以才有此从错误。

这里暂时不去管它,只要理解这个方法的本意即可。

CrawlSpider

这个是从Spider继承常用的spider,并提供了两个新的属性。

rules  一个包含n个Rule对象的list。每个Rule对爬取网站的动作定义了特定表现。如果多个rule匹配了相同的链接,则根据他们的本属性中定义的顺序,第一个会被使用。

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

爬取规则

class scrapy.contrib.spiders.Rule(link_extractor,callback=None, cb_kwargs=None, follow=None, process_links=None,process_request=None)

link_extractor 是一个 Link Extractor 对象。 其定义了如何从爬取到的页面提取链接。callback 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。cb_kwargs 包含传递给回调函数的参数(keyword argument)的字典。follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callback 为None, follow 默认设置为 True ,否则默认为 False 。process_links 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。process_request 是一个callable或string(该spider中同名的函数将会被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None。 (用来过滤request)

注意:当编写爬虫规则时,请避免使用parse作为回调函数。 由于CrawlSpider使用parse方法来实现其逻辑,如果您覆盖了parse 方法,crawl spider 将会运行失败。

这一段内容多为解释性的东西,所以就直接照搬了官文。


下一次学习CrawlSpider实例和其他一些Spider。



另外不得不吐槽,那么多写着scrapy教程,打开一看100%把官文直接搬过来的,既没有自己学习的心得体会,也没有自己学习时遇到的问题和解决的思路方法,真不知道写到博客里是为了什么,还不如直接看官文算了,点开都是浪费时间。

0 0