【问题标题】:How to perform multiple request parallely to a page with different request parameter value?如何对具有不同请求参数值的页面并行执行多个请求?
【发布时间】:2016-07-26 08:49:33
【问题描述】:

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

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

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

但正如我看到的一些帖子,在他们建议的抓取时,多处理并不好。

有没有人对此有任何想法或者可以保存一个 cookie 以将其用于下一个蜘蛛实例?我可以更新所有尝试过的代码,但它会非常庞大​​,所以等待有人帮助我可以更新我尝试过的代码。

【问题讨论】:

    标签: python cookies scrapy scrapy-spider scrapyd


    【解决方案1】:

    Scrapy 默认并发执行请求。默认有8个并发请求,您可以通过操作setting keyCONCURRENT_REQUESTS_PER_DOMAIN将该值增加到更高的级别。

    Cookies 由默认的 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 或其他任何东西,将它们存储在某个地方并将它们加载到蜘蛛中(可能是一些小型数据库,最好的事情是一些键值存储,redis?anydbm?)。它可以在 cookie 中间件中完成,加载 cookie 可以在 spider_opened 上完成,并将它们保存在 spider_closed 上。如果你真的需要这个功能,你可以继承默认 cookie middleware 并添加你需要的功能。

    【讨论】:

    • 我在使用 yield 时遇到了这个错误。过滤的重复请求: - 不再显示重复项(请参阅 DUPEFILTER_DEBUG 以显示所有重复项)
    • 如果您发出重复的请求,它们会被过滤掉。你为什么要向同一个 url 发出两次请求?如果您有充分的理由使用 dont_filter=True Request() 参数禁用重复过滤器
    • 我需要用不同的参数请求相同的url才能发布。
    • 查询字符串参数不被重复过滤器过滤,例如foo.com?a=b;和foo.com?a=alfa 都不会被过滤。不同正文的 POST 请求默认也不会被过滤掉。
    • 好的,现在我没有遇到任何问题,但我的请求没有同时执行。我怎样才能同时请求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2015-11-25
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多