scrapy 2.3 scrapy.Spider

2021-06-09 10:06 更新

scrapy.Spider

classscrapy.spiders.Spider

這是最簡(jiǎn)單的蜘蛛,也是每個(gè)蜘蛛都必須繼承的蜘蛛(包括與碎屑捆綁在一起的蜘蛛,還有你自己寫的蜘蛛)。它不提供任何特殊功能。它只是提供了一個(gè)默認(rèn)值 ?start_requests()? 從發(fā)送請(qǐng)求的實(shí)現(xiàn) ?start_urls? spider屬性并調(diào)用spider的方法 parse 對(duì)于每個(gè)結(jié)果響應(yīng)。

name

定義此蜘蛛名稱的字符串。spider名稱是scrappy定位(和實(shí)例化)spider的方式,因此它必須是唯一的。但是,沒(méi)有什么可以阻止您實(shí)例化同一個(gè)蜘蛛的多個(gè)實(shí)例。這是最重要的蜘蛛屬性,也是必需的。

如果蜘蛛 爬取 一個(gè)域,通常的做法是在域后命名蜘蛛,無(wú)論有沒(méi)有 TLD . 例如,一只爬行的蜘蛛 mywebsite.com 經(jīng)常被稱為 mywebsite .

allowed_domains

包含允許此蜘蛛爬行的域的字符串的可選列表。對(duì)于不屬于此列表(或其子域)中指定的域名的URL請(qǐng)求,如果 ?OffsiteMiddleware? 啟用。

假設(shè)您的目標(biāo)URL是 https://www.example.com/1.html 然后添加 'example.com' 列在名單上。

start_urls

當(dāng)沒(méi)有指定特定的URL時(shí),蜘蛛將從中開(kāi)始爬行的URL列表。所以,下載的第一頁(yè)將是這里列出的那些。隨后 ?Request? 將從包含在起始URL中的數(shù)據(jù)依次生成。

custom_settings

運(yùn)行此spider時(shí),將從項(xiàng)目范圍配置中重寫的設(shè)置字典。它必須被定義為類屬性,因?yàn)樵趯?shí)例化之前更新了設(shè)置。

有關(guān)可用內(nèi)置設(shè)置的列表,請(qǐng)參閱: 內(nèi)置設(shè)置參考 .

crawler

此屬性由 ?from_crawler()? 初始化類后的類方法,并鏈接到 ?Crawler? 此蜘蛛實(shí)例綁定到的對(duì)象。

Crawler封裝了項(xiàng)目中的許多組件,用于它們的單入口訪問(wèn)(例如擴(kuò)展、中間件、信號(hào)管理器等)。見(jiàn) 爬蟲(chóng)API 了解更多。

settings

用于運(yùn)行此蜘蛛的配置。這是一個(gè) ?Settings? 實(shí)例,請(qǐng)參見(jiàn) 設(shè)置 有關(guān)此主題的詳細(xì)介紹。

logger

用蜘蛛創(chuàng)建的python記錄器 name . 您可以使用它通過(guò)它發(fā)送日志消息,如中所述 從蜘蛛記錄 .

from_crawler(crawler*args**kwargs)

這是Scrapy用來(lái)創(chuàng)建蜘蛛的類方法。

您可能不需要直接重寫它,因?yàn)槟J(rèn)實(shí)現(xiàn)充當(dāng) __init__() 方法,使用給定參數(shù)調(diào)用它 args 和命名參數(shù) kwargs .

盡管如此,此方法設(shè)置了 ?crawler? 和 ?settings? 新實(shí)例中的屬性,以便稍后在蜘蛛代碼中訪問(wèn)它們。

參數(shù)
  • crawler (?Crawler? instance) -- 蜘蛛將被綁到的爬行器

  • args (list) -- 傳遞給的參數(shù) __init__() 方法

  • kwargs (dict) -- 傳遞給的關(guān)鍵字參數(shù) __init__() 方法

start_requests()

此方法必須返回一個(gè)iterable,其中包含對(duì)此spider進(jìn)行爬網(wǎng)的第一個(gè)請(qǐng)求。當(dāng)蜘蛛被打開(kāi)爬取的時(shí)候,它被稱為 Scrapy。Scrapy只調(diào)用一次,因此可以安全地實(shí)現(xiàn) ?start_requests()? 作為發(fā)電機(jī)。

默認(rèn)實(shí)現(xiàn)生成 Request(url, dont_filter=True) 對(duì)于每個(gè)URL ?start_urls? .

如果要更改用于開(kāi)始抓取域的請(qǐng)求,這是要重寫的方法。例如,如果您需要從使用POST請(qǐng)求登錄開(kāi)始,可以執(zhí)行以下操作:

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在請(qǐng)求未指定回調(diào)時(shí)用來(lái)處理下載響應(yīng)的默認(rèn)回調(diào)。

這個(gè) parse 方法負(fù)責(zé)處理響應(yīng),并返回 爬取 的數(shù)據(jù)和/或更多的URL。其他請(qǐng)求回調(diào)與 ?Spider? 班級(jí)。

此方法以及任何其他請(qǐng)求回調(diào)都必須返回 ?Request? 和/或 item objects .

參數(shù)

response (?Response?) -- 解析的響應(yīng)

log(message[, levelcomponent])

通過(guò)Spider的 ?logger? ,保持向后兼容性。有關(guān)詳細(xì)信息,請(qǐng)參閱 從蜘蛛記錄 .

closed(reason)

蜘蛛關(guān)閉時(shí)調(diào)用。此方法為 ?spider_closed? 信號(hào)。

我們來(lái)看一個(gè)例子:

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)

從單個(gè)回調(diào)返回多個(gè)請(qǐng)求和項(xiàng)目:

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()? 直接;給數(shù)據(jù)更多的結(jié)構(gòu),你可以使用  ?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)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)