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