2014-01-05 38 views
1

我的代碼包含在下面,實際上並不比example lifted from Scrapy's documentation稍微調整過的版本更多。代碼的工作原理,但我在邏輯上存在差距,我不理解登錄和請求如何通過後續請求傳遞。響應對象在Scrapy刮板中如何通過請求回調傳遞?

根據文檔,請求對象返回一個響應對象。此響應對象作爲第一個參數傳遞給回調函數。我得到了。這是使用用戶憑證可以處理認證和後續請求的方式。

我不理解的是響應對象如何使其在認證後進行下一次請求調用。在下面的代碼中,parse方法返回使用FormRequest方法進行身份驗證時創建的結果對象。由於FormRequest對after_login方法有一個回調,因此使用來自FormRequest的響應作爲第一個參數調用after_login方法。

after_login方法檢查以確保沒有錯誤,然後通過yield語句發出另一個請求。我不明白的是響應如何作爲after_login方法的參數傳遞給yield之後的Request。這是如何發生的?

我感興趣的主要原因是我需要在after_login方法中針對每個迭代值發出兩個請求,並且我無法弄清楚如何通過scraper處理響應,然後瞭解如何修改代碼。提前感謝您的時間和解釋。

# import Scrapy modules 
from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
from scrapy.http import Request 
from scrapy.http import FormRequest 
from scrapy import log 

# import custom item from item module 
from scrapy_spage.items import ReachItem 


class AwSpider(BaseSpider): 
    name = 'spage' 
    allowed_domains = ['webpage.org'] 
    start_urls = ('https://www.webpage.org/',) 

    def parse(self, response): 
     credentials = {'username': 'user', 
         'password': 'pass'} 
     return [FormRequest.from_response(response, 
              formdata=credentials, 
              callback=self.after_login)] 

    def after_login(self, response): 
     # check to ensure login succeeded 
     if 'Login failed' in response.body: 

      # log error 
      self.log('Login failed', level=log.ERROR) 

      # exit method 
      return 

     else: 
      # for every integer from one to 5000, 1100 to 1110 for testing... 
      for reach_id in xrange(1100, 1110): 

       # call make requests, use format to create four digit string for each reach 
       yield Request('https://www.webpage.org/content/River/detail/id/{0:0>4}/'.format(reach_id), 
           callback=self.scrape_page) 

    def scrape_page(self, response): 
     # create selector object instance to parse response 
     sel = Selector(response) 

     # create item object instance 
     reach_item = ReachItem() 

     # get attribute 
     reach_item['attribute'] = sel.xpath('//body/text()').extract() 

     # other selectors... 

     # return the reach item 
     return reach_item 

回答

1

如何傳遞作爲參數的after_login方法的響應能夠進入請求收率以下。

,如果我明白你的問題,得到的答案是,它

的原理很簡單:

for x in spider.function(): 
    if x is a request: 
     http call this request and wait for a response asynchronously 
    if x is an item: 
     send it to piplelines etc... 

upon getting a response: 
    request.callback(response) 

你可以看到,沒有數量上的限制的功能可以讓你可以讓你:

for reach_id in xrange(x, y): 
    yield Request(url=url1, callback=callback1) 
    yield Request(url=url2, callback=callback2) 

希望這可以幫助

相關問題