簡體   English   中英

如何在產生請求后立即解析scrapy響應?

[英]How can I parse a scrapy response immediately after yielding a request?

假設我正在嘗試抓取一個網站,該網站的設計使其收到的每個請求都必須包含有效的第三方字符串密鑰。 想象一下,如果您發送的請求不包含有效密鑰,網站將回復一個空字符串。 到目前為止,這就是我所擁有的:

class mySpider(Spider):

    #nicesite.com contains a list of items that are stored in my problematic website. It can be accessed without any key
    start_urls = ['http://www.nicesite.com']

    def __init__(self, *args, **kwargs):
        #Let's say that every time I get new credentials I'm billed $1. Also assume that getMyCredentials() will generate new credentials every time it is called 
        self.credentials = getMyCredentials()

    #parsing nicesite.com
    def parse(self, response):

        #imagine that myList contains 50000 items --> I can't get new credentials for each item. That would be very expensive
        myList = response.selector.xpath('xpath_that_yields_the_items_Im_interested')
        for i in myList:
            myKey = requestToAThirdPartyService(self.credentials)
            yield Request('http://naughtysite.com/items/' + i + '/?' + urlencode(myKey), callback=self.parseItem )

   #parsing naughtysite.com
   def parseItem(self, response):

       if(response.body == ''):
            print('Dang! We lost an item because our key isnt valid anymore.')

            #update our credentials so the next items wont be lost as well
            self.credentials = getMyCredentials() 
       else:
           #collect the relevant data and yield item:
           item = response.selector.xpath('relevant_xpath')
           yield item

我遇到的問題很明顯:在產生每個請求之后不會調用 parseItem,而是在產生所有請求之后。 這就是為什么前 n 個項目成功生成而其余所有項目都沒有成功的原因。 我的key開始被淘氣的網站拒絕后,一直沒有更新,一直被拒絕。

我想做的是在產生每個請求后立即調用 parseItem 以便可以知道響應是否為空,如果是,則更新我的憑據。 使用更新的憑據,我對后續請求不會有任何問題。 有人可以幫我完成這個嗎? 謝謝。

在生成請求和實際發送請求之間可以隔很長時間。 請求存儲在調度程序上,並根據CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN等設置使用。

你不應該在你的蜘蛛上包含鑰匙。 相反,編寫一個自定義下載器中間件,在您的請求發出之前為其添加一個密鑰。

暫無
暫無

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

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