我的代碼包含在下面,實際上並不比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