scrapy学习--Spiders

一、爬虫的工作流程

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 scrapy

class 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 parse
import scrapy
from firstSpider.items import FirstspiderItem

class 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值