Как я могу разобрать ответ на терапию сразу после получения запроса? - PullRequest
0 голосов
/ 07 мая 2019

Допустим, я пытаюсь очистить веб-сайт, который разработан таким образом, чтобы каждый полученный запрос содержал действительный сторонний строковый ключ. Представьте, что если вы отправите запрос, который не содержит действительный ключ, веб-сайт ответит пустой строкой. Пока что вот что у меня есть:

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 элементов генерируются успешно, а все остальные нет. После того, как мой ключ начинает отклоняться непослушным сайтом, он никогда не обновляется и продолжает отклоняться.

Что я хотел бы сделать - это вызвать parseItem сразу после выдачи каждого запроса, чтобы можно было узнать, был ли ответ пустым, и если да, обновить мои учетные данные. С обновленными учетными данными у меня не было бы проблем с последующими запросами. Может кто-нибудь, пожалуйста, помогите мне сделать это? Спасибо.

1 Ответ

1 голос
/ 08 мая 2019

Между генерацией запроса и фактически отправленным запросом может пройти много времени.Запросы хранятся в планировщике и потребляются в соответствии с настройками, такими как CONCURRENT_REQUESTS и CONCURRENT_REQUESTS_PER_DOMAIN.

Вы не должны включать ключи на своем пауке.Вместо этого напишите пользовательское промежуточное ПО для загрузчика , которое добавляет ключ к вашим запросам непосредственно перед их отправкой.

...