产生请求后如何解析紧急响应?

时间:2019-05-07 18:27:47

标签: python web-scraping scrapy web-crawler

比方说,我正在尝试抓取一个设计用于设计的网站,以便该网站收到的每个请求都必须包含有效的第三方字符串键。想象一下,如果您发送的请求不包含有效的密钥,则该网站将使用空字符串进行回复。 到目前为止,这就是我所拥有的:

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,而是在产生所有请求之后才调用parseItem。这就是为什么前n个项目生成成功而其余所有项目都不成功的原因。在我的钥匙开始被顽皮的网站拒绝后,它永远不会更新,并不断被拒绝。

我想做的是在产生每个请求后立即调用parseItem,这样就可以知道响应是否为空,如果是,请更新我的凭据。使用更新的凭据,后续请求不会有任何问题。 有人可以帮我做到这一点吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

在生成请求和实际发送较长时间的请求之间可以通过。请求存储在调度程序上,并根据CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN之类的设置进行使用。

您不应该在蜘蛛上包括钥匙。而是写一个custom downloader middleware,在发送请求之前立即将密钥添加到您的请求中。