scrapy 2.3 scrapy.Spider

2021-06-09 10:06 更新

scrapy.Spider

classscrapy.spiders.Spider

这是最简单的蜘蛛,也是每个蜘蛛都必须继承的蜘蛛(包括与碎屑捆绑在一起的蜘蛛,还有你自己写的蜘蛛)。它不提供任何特殊功能。它只是提供了一个默认值 ​start_requests()​ 从发送请求的实现 ​start_urls​ spider属性并调用spider的方法 parse 对于每个结果响应。

name

定义此蜘蛛名称的字符串。spider名称是scrappy定位(和实例化)spider的方式,因此它必须是唯一的。但是,没有什么可以阻止您实例化同一个蜘蛛的多个实例。这是最重要的蜘蛛属性,也是必需的。

如果蜘蛛 爬取 一个域,通常的做法是在域后命名蜘蛛,无论有没有 TLD . 例如,一只爬行的蜘蛛 mywebsite.com 经常被称为 mywebsite .

allowed_domains

包含允许此蜘蛛爬行的域的字符串的可选列表。对于不属于此列表(或其子域)中指定的域名的URL请求,如果 ​OffsiteMiddleware​ 启用。

假设您的目标URL是 https://www.example.com/1.html 然后添加 'example.com' 列在名单上。

start_urls

当没有指定特定的URL时,蜘蛛将从中开始爬行的URL列表。所以,下载的第一页将是这里列出的那些。随后 ​Request​ 将从包含在起始URL中的数据依次生成。

custom_settings

运行此spider时,将从项目范围配置中重写的设置字典。它必须被定义为类属性,因为在实例化之前更新了设置。

有关可用内置设置的列表,请参阅: 内置设置参考 .

crawler

此属性由 ​from_crawler()​ 初始化类后的类方法,并链接到 ​Crawler​ 此蜘蛛实例绑定到的对象。

Crawler封装了项目中的许多组件,用于它们的单入口访问(例如扩展、中间件、信号管理器等)。见 爬虫API 了解更多。

settings

用于运行此蜘蛛的配置。这是一个 ​Settings​ 实例,请参见 设置 有关此主题的详细介绍。

logger

用蜘蛛创建的python记录器 name . 您可以使用它通过它发送日志消息,如中所述 从蜘蛛记录 .

from_crawler(crawler*args**kwargs)

这是Scrapy用来创建蜘蛛的类方法。

您可能不需要直接重写它,因为默认实现充当 __init__() 方法,使用给定参数调用它 args 和命名参数 kwargs .

尽管如此,此方法设置了 ​crawler​ 和 ​settings​ 新实例中的属性,以便稍后在蜘蛛代码中访问它们。

参数
  • crawler (​Crawler​ instance) -- 蜘蛛将被绑到的爬行器

  • args (list) -- 传递给的参数 __init__() 方法

  • kwargs (dict) -- 传递给的关键字参数 __init__() 方法

start_requests()

此方法必须返回一个iterable,其中包含对此spider进行爬网的第一个请求。当蜘蛛被打开爬取的时候,它被称为 Scrapy。Scrapy只调用一次,因此可以安全地实现 ​start_requests()​ 作为发电机。

默认实现生成 Request(url, dont_filter=True) 对于每个URL ​start_urls​ .

如果要更改用于开始抓取域的请求,这是要重写的方法。例如,如果您需要从使用POST请求登录开始,可以执行以下操作:

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

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

    def logged_in(self, response):
        # here you would extract links to follow and return Requests for
        # each of them, with another callback
        pass
parse(response)

这是Scrapy在请求未指定回调时用来处理下载响应的默认回调。

这个 parse 方法负责处理响应,并返回 爬取 的数据和/或更多的URL。其他请求回调与 ​Spider​ 班级。

此方法以及任何其他请求回调都必须返回 ​Request​ 和/或 item objects .

参数

response (​Response​) -- 解析的响应

log(message[, levelcomponent])

通过Spider的 ​logger​ ,保持向后兼容性。有关详细信息,请参阅 从蜘蛛记录 .

closed(reason)

蜘蛛关闭时调用。此方法为 ​spider_closed​ 信号。

我们来看一个例子:

import scrapy


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):
        self.logger.info('A response from %s just arrived!', response.url)

从单个回调返回多个请求和项目:

import scrapy

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):
        for h3 in response.xpath('//h3').getall():
            yield {"title": h3}

        for href in response.xpath('//a/@href').getall():
            yield scrapy.Request(response.urljoin(href), self.parse)

而不是 ​start_urls​ 你可以用 ​start_requests()​ 直接;给数据更多的结构,你可以使用  ​Item​ 物体::

import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']

    def start_requests(self):
        yield scrapy.Request('http://www.example.com/1.html', self.parse)
        yield scrapy.Request('http://www.example.com/2.html', self.parse)
        yield scrapy.Request('http://www.example.com/3.html', self.parse)

    def parse(self, response):
        for h3 in response.xpath('//h3').getall():
            yield MyItem(title=h3)

        for href in response.xpath('//a/@href').getall():
            yield scrapy.Request(response.urljoin(href), self.parse)


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号