Scrapy学习笔记(4)—Spider

本笔记介绍几种spider,分别是basic(默认Spider)、CrawlSpider、XMLFeedSpder、CSVFeedSpider四种,以及另外一种SitemapSpider

Spider

Spiders这个类定义如何爬取网页,包括如何执行爬虫,比如说追踪链接(follow links),和如何提取网页结构数据(比如爬取items),换句话说,Spiders就是定义爬虫行为和解析特定网页(一堆网页)的类。对于爬虫来说,爬取步骤基本如下:

  1. 从初始的网页开始,到回调(callback)解析方法(parse),然后response就从这些请求中下载。第一个请求(或第一批)传入start_requests() 方法通过特定的start_urls 属性发出请求并且利用parse() 方法回调;
  2. 在callback方法中,你需要将从网页爬下来的数据Item对象Request对象、或者可迭代的(interable)这些对象之中的一个或多个以dict(字典)形式返回.然后这些请求可能也会包含callback并且也会被scrapy下载接着被回调。
  3. 在回调方法中,使用Selectors解析网页的内容,CSS、XPath、BeautifulSoup、正则表达式、lxml等等都可以选择
  4. 最后,items将从spider送到database(比如item pipelines)或者使用Feed exports输出到文件中

这种过程适用于所有爬虫,之后会介绍四种默认的爬虫basic、crawl、csvfeed、xmlfeed和一种基于sitemap的爬虫。

scrapy.Spider

class scrapy.spiders.Spider

这是最简单的爬虫basic,所有的爬虫类都必须继承(inherit)这个类。它不提供任何特殊的方法,它只提供默认的start_requests()start_urls这个属性发出请求并且调用parse方法获得响应(response)

  • name
    定义爬虫名称的字符串。name决定爬虫如何被scrapy部署(实例化),所以它必须是独一无二的,但是没有什么可以阻止你实例化多个相同的爬虫实例。name是最重要的爬虫属性
    如果一个爬虫爬取单独的domain(域名),这个爬虫的name最好和域名保持一致,比如说要爬取“baidu.com”这个域名,它的name应该被命名为baidu。

  • allowed_domains
    一个可选的字符串列表包含一些允许爬虫爬取的域名。不属于这些域名的url链接不会被爬虫爬取,除非OffsiteMiddleware被使用。
    比如说你打算爬取https://www.example.com/1.html,那么你就可以加上example.com到allowed_domain中,你的爬虫就只会爬取域名为example.com的链接。

  • start_urls
    当没有特定的url链接被指定时,一个爬虫爬取的初始URL列表就是start_urls。随后的url陆续地从这个列表中生成。

  • custom_settings
    自定义的设置属性,字典形式,执行该爬虫时它将会覆盖settings.py中的设置。在实例化之前它将被定义为类属性。具体定义等讲settings之后就明白了。

  • crawler
    这个属性从实例化该类后的from_crawler()类方法中设置,这个属性将会连接到Crawler对象然后绑定这个爬虫。
    Crawler在项目中封装了许多组件,用于它们的单个条目访问(例如extensions、middlewares、signals managers等等)。具体等讲到Crawler API。

  • settings
    用于设置爬虫

  • logger
    使用爬虫的name创建的Python日志记录器。你可以使用它来发送日志消息。

  • from_crawler(crawler, *args, **kwargs)
    用来创建爬虫的类方法。
    你可能不需要直接重写这个方法,因为默认的实现__init__()方法的代理,用给定的参数args和命名参数kwargs来调用它。尽管如此,这个方法在新实例中设置了crawler和settings属性,以便稍后在爬虫代码中访问它们。
    参数:

    • crawler(Crawler实例):绑定爬虫的crawler
    • args(list):传给__init__()方法的参数
    • kwargs(dict):传给__init__()方法的关键字参数
  • start_requests()
    这个方法必须返回一个可迭代的Requests。当爬虫执行时被Scrapy调用。Scrapy只调用一次,所以将这个方法作为生成器实现是很安全的。
    默认的实现对start_urls中的每个url链接生成Request(url, dont_filter=True)
    如果你想要更改用于开始抓取某个域名的请求,重写该方法即可。

例子:

import scrapy

class MaterialSpider(scrapy.Spider):
    name = 'material' # 一个项目中独一无二的爬虫名字

    def start_requests(self):
        urls = [
            'http://588ku.com/pt/chengshi.html',
            'http://588ku.com/pt/lvxing.html'
        ]

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split('/')[-1][:-5]
        filename = 'material-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)
  • parse(response)
    这是默认的回调方法,用来处理响应(response)。
    parse方法用来管理处理响应并且返回爬取到的数据或者更多的URL链接来follow,其中,数据必须以字典的形式返回,或者返回Item对象,返回的Request必须是可迭代的,可以在for循环中使用yield来返回。其他的Requests回调方法有同样的要求。
    参数:

    • response(Response对象):需要解析的响应
  • log(message[, component])
    通过爬虫的logger发送日志消息的包装器(Wrapper),保持向后兼容性。

  • closed(reason)
    当关闭爬虫时调用。这个方法提供一个捷径来作为spider_closed signal调用signals.connect()方法。
    例子1:

import scrapy

class BilibiliSpider(scrapy.Spider):
    name = 'bilibili.com'
    allowed_domains = ['bilibili.com']
    start_urls = [
        'https://www.bilibili.com/video/music.html',
        'https://www.bilibili.com/video/douga.html',
        'https://www.bilibili.com/video/game.html'
    ]

    def parse(self, response):
        self.logger.info('网页 %s 的内容提取成功!', response.url)

例子2,从一个callback返回多个Request和item:

import scrapy

class BilibiliSpider(scrapy.Spider):
    name = 'bilibili.com'
    allowed_domains = ['bilibili.co
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值