比方说,我正在尝试抓取一个设计用于设计的网站,以便该网站收到的每个请求都必须包含有效的第三方字符串键。想象一下,如果您发送的请求不包含有效的密钥,则该网站将使用空字符串进行回复。 到目前为止,这就是我所拥有的:
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,这样就可以知道响应是否为空,如果是,请更新我的凭据。使用更新的凭据,后续请求不会有任何问题。 有人可以帮我做到这一点吗? 谢谢。
答案 0 :(得分:1)
在生成请求和实际发送较长时间的请求之间可以通过。请求存储在调度程序上,并根据CONCURRENT_REQUESTS
和CONCURRENT_REQUESTS_PER_DOMAIN
之类的设置进行使用。
您不应该在蜘蛛上包括钥匙。而是写一个custom downloader middleware,在发送请求之前立即将密钥添加到您的请求中。