我正在尝试使用scrapy来搜索具有搜索表单的网站,但考虑到它的工作方式很难做到并发请求: 当您执行搜索时,它会在搜索周围创建一个会话,您不能同时进行多次搜索,否则您将无法再访问先前搜索的结果。
例如:
使用条件A开始搜索,它会重定向到带有ID的页面,并且每个结果的详细信息都会重用此ID:
list.do?anchor=51edc79.0
details.do?anchor=51edc79.0.0
details.do?anchor=51edc79.0.1
如果我使用条件B开始新搜索,则它是一个新ID:
list.do?anchor=5200109.0
details.do?anchor=5200109.0.0
details.do?anchor=5200109.0.1
但是现在第一次搜索的结果不再可用了:
details.do?anchor=51edc79.0.2 => cannot find
details.do?anchor=51edc79.0.3 => cannot find
我一次只能做一个请求,以确保在第一次搜索的所有结果都被提取之前第二次搜索才会开始,但是我仍然希望同时发出请求以获得更多搜索结果很快。 所以我们的想法是在获取所有搜索结果之前不要开始第二次搜索。
你如何在scrapy中做到这一点?
当我允许多个请求( CONCURRENT_REQUESTS
)并使用优先级时,第二次搜索在第一次搜索的所有页面完成之前就开始了。
由于
答案 0 :(得分:1)
通常会话仅依赖于Cookie,因此您必须使用相同的蜘蛛管理多个Cookie,cookiejars
are the solution here
只使用不同的cookiejar进行每个搜索请求,记得继续传递带有所有相关请求的cookiejar。
要从蜘蛛的开头控制cookie,请尝试以下方法:
class MySpider(Spider):
name = "myspider"
number_of_sessions = 5
def start_requests(self):
for i in range(self.number_of_sessions):
yield Request(
'homepage.com',
meta={'cookiejar': i},
dont_filter=True,
callback=self.parse,
)
使用dont_filter
参数,以便scrapy不会将这些请求过滤为重复请求。