簡體   English   中英

如何理解 scrapy.Request 中的回調 function?

[英]How to understand callback function in scrapy.Request?

我正在閱讀 Web Scraping with Python 2nd Ed,並想使用 Scrapy 模塊從網頁中抓取信息。

我從文檔中獲得了以下信息: https://docs.scrapy.org/en/latest/topics/request-response.html

callback (callable) – function 將調用此請求的響應(一旦下載)作為其第一個參數。 有關更多信息,請參閱下面的將附加數據傳遞給回調函數。 如果請求沒有指定回調,則將使用蜘蛛的 parse() 方法。 請注意,如果在處理過程中引發異常,則會調用 errback。

我的理解是:

  1. 傳入 url 並像我們在請求模塊中一樣獲得響應

    resp = requests.get(url)

  2. 傳入resp進行數據解析

    解析(響應)

問題是:

  1. 我沒有看到 resp 在哪里傳遞
  2. 為什么需要在參數中解析之前放置 self 關鍵字
  3. 解析 function 時從未使用 self 關鍵字,為什么要把它作為第一個參數?
  4. can we extract url from response parameter like this: url = response.url or should be url = self.url
class ArticleSpider(scrapy.Spider):
    name='article'
    
    def start_requests(self):
        urls = [
        'http://en.wikipedia.org/wiki/Python_'
        '%28programming_language%29',
        'https://en.wikipedia.org/wiki/Functional_programming',
        'https://en.wikipedia.org/wiki/Monty_Python']

        return [scrapy.Request(url=url, callback=self.parse) for url in urls]
    

    def parse(self, response):
        url = response.url
        title = response.css('h1::text').extract_first()
        print('URL is: {}'.format(url))
        print('Title is: {}'.format(title))

您可以在此處找到有關self的信息 - https://docs.python.org/3/tutorial/classes.html


關於這個問題:

can we extract URL from response parameter like this: url = response.url or should be url = self.url

您應該使用response.url來獲取您當前抓取/解析的頁面的 URL

似乎您缺少一些與 python 類和 OOP 相關的概念。 閱讀 python文檔或至少閱讀這個問題是個好主意。

下面是 Scrapy 的工作原理,您實例化一個請求 object 並將其交給 Scrapy 調度程序。

yield scrapy.Request(url=url) #or use return like you did

Scrapy 將處理請求,下載 html 並將它返回的所有請求返回給回調 function。 如果您沒有在請求中設置回調 function (如我上面的示例),它將調用默認的 function 稱為parse

Parse 是 object 的一種方法(又名函數)。 您在上面的代碼中編寫了它,即使您沒有它仍然存在,因為您的 class 繼承了它的父 class 的所有功能

class ArticleSpider(scrapy.Spider): # <<<<<<<< here
    name='article'

所以一個TL; 您的問題博士:

1-您沒有看到它,因為它發生在父 class 中。

2-你需要使用self. 所以 python 知道您正在引用蜘蛛實例的方法。

3- self參數是它自己的實例,它被python使用。

4-Response 是一個獨立的 object,您的 parse 方法作為參數接收,因此您可以訪問它的屬性,如response.urlresponse.headers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM