如何与具有不同请求参数值的页面并行执行多个请求?

时间:2016-04-06 06:08:20

标签: python cookies scrapy scrapy-spider scrapyd

我必须在我必须发布参数的网站中废弃一个页面,但是我有一个值数组来请求同一页面。我不想按顺序废弃数组中每个值的页面。我想并行废弃它(这意味着搜索" google.com/query=a"以及搜索" google.com/query=b"我想并行运行这两个请求(因为网站登录限制,我现在无法运行,如下所示。 问题是网站一次只允许每个帐户登录会话,这意味着如果帐户通过浏览器登录,那么如果我们尝试使用任何其他浏览器再次登录(隐身模式),登录的会话将被注销

现在,我猜有两种可能性,首先,我应该能够在登录后将cookie值保存在文件中,以便当同一个蜘蛛以不同的参数运行时我可以使用相同的cookie。但是我试图设置Cookie,但cookie没有正确设置请求。所以请求失败。(如果我可以保存cookie并且可以手动设置为请求,那么我想使用 scrapyd 运行蜘蛛并使用不同的参数值)

第二个:当我请求该页面时,我必须通过多处理并行使用python默认库来并行删除页面。

但正如我看到一些帖子多处理并不好,而他们建议刮擦。

有没有人有任何与此相关的想法,或者可以保存cookie以将其用于下一个蜘蛛实例?我可以更新所有尝试的代码,但它会如此巨大,所以等待某人的帮助,我可以根据我的尝试进行更新。

1 个答案:

答案 0 :(得分:0)

默认情况下,Scrapy会同时执行请求。默认情况下有8个并发请求,您可以通过操纵setting key CONCURRENT_REQUESTS_PER_DOMAIN将此值提高到更高级别。

Cookie由默认的Cookie中间件管理,很少需要在抓取之间存储Cookie。只需登录每次抓取,它应该没问题。您可以在蜘蛛启动时登录并同时处理所有请求,重复使用一个蜘蛛会话。

class SomeSpider(Spider)
    def start_requests(self):
        yield FormRequest("http://login.here.com", formdata={"user": "foo", "password": "bar"}, callback=self.logged_in)

    def logged_in(self, response):
        # check if login went fine
        # make all requests you need
        for url in self.list_of_urls_to_start_with:
            yield Request(url, callback=self.process_data)

   def process_data(self, response):
       # extract things, yield items
       pass

默认情况下,目前不支持在不同抓取之间保留Cookie。如果您想在不同的蜘蛛运行之间存储Cookie,则必须添加序列化cookielib.Cookiecookielib.CookieJar对象的方法,例如到json或pickle或其他什么,将它们存储在某处并将它们加载到spider(可能是一些小型数据库,最好的东西是一些键值存储,redis?anydbm?)。它可以在cookie中间件中完成,加载cookie可以在spider_opened上完成并保存在spider_closed上。如果您确实需要此功能,则可以继承默认cookie middleware并添加所需的功能。