草庐IT

关于python:如何在scrapy中重新调度403 HTTP状态码以便稍后爬取?

codeneng 2023-03-28 原文

How to reschedule 403 HTTP status codes to be crawled later in scrapy?

根据这些说明,我可以看到 HTTP 500 错误、连接丢失错误等总是被重新安排,但如果 403 错误也被重新安排,或者它们被简单地视为有效响应或在之后被忽略,我无法找到任何地方达到重试限制。

同样来自同一条指令:

Failed pages are collected on the scraping process and rescheduled at
the end, once the spider has finished crawling all regular (non
failed) pages. Once there are no more failed pages to retry, this
middleware sends a signal (retry_complete), so other extensions could
connect to that signal.

这些 Failed Pages 指的是什么?它们是否包含 403 错误?

另外,当scrapy遇到HTTP 400状态时,我可以看到这个异常:

1
2015-12-07 12:33:42 [scrapy] DEBUG: Ignoring response <400 http://example.com/q?x=12>: HTTP status code is not handled or not allowed

从这个异常中,我认为很明显 HTTP 400 响应被忽略并且没有重新安排。

我不确定 403 HTTP 状态是被忽略还是重新安排在最后被抓取。
因此,我尝试根据这些文档重新安排所有具有 HTTP 状态 403 的响应。到目前为止,这是我尝试过的:

在 middlewares.py 文件中:

1
2
3
4
5
def process_response(self, request, response, spider):
    if response.status == 403:
        return request
    else:
        return response

在settings.py中:

1
2
RETRY_TIMES = 5
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408]

我的问题是:

  • 这些 Failed Pages 指的是什么?它们是否包含 403 错误?
  • 我是否需要编写 process_response 来重新安排 403 错误页面,或者它们是否会被 scrapy 自动重新安排?
  • scrapy 重新安排了哪些类型的异常和(HTTP 代码)?
  • 如果我重新安排 404 错误页面,我是否会进入无限循环,或者是否存在超时,之后重新安排将不再进行?

  • 您可以在此处找到要重试的默认状态。

  • 将 403 添加到 settings.py 文件中的 RETRY_HTTP_CODES 应该会处理该请求并重试。

  • RETRY_HTTP_CODES里面的,我们已经检查了默认的。

  • RETRY_TIMES 处理尝试错误页面的次数,默认设置为 2,您可以在 settings.py 文件上覆盖它。
    • 嘿,谢谢你的回复。我非常了解重试。我的主要问题是关于重新安排。重试的代码是否也会重新安排?
    • 我不太明白你的意思,但重试是再次启动 Request
    • Failed pages are collected on the scraping process and rescheduled at the end, once the spider has finished crawling all regular (non failed) pages. 我说的是重新安排。
    • 重试和重新调度在这里是一样的,它并没有真正等待所有请求完成,当重试scrapy会降低新请求的优先级,所以优先级更高的请求会尽可能早地执行。
    • 凉爽的。那么当重试限制超过时会发生什么?它是通过引发异常丢弃请求还是继续重试直到得到有效响应?
    • 它转到 Request 对象上指定的 errback 方法
    • 对。谢谢你的时间。必须使用 process_response 进行重试。


    一种方法是向你的 Spider 添加一个中间件(来源,链接):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # File: middlewares.py

    from twisted.internet import reactor
    from twisted.internet.defer import Deferred

    DEFAULT_DELAY = 5

    class DelayedRequestsMiddleware(object):
        def process_request(self, request, spider):
            delay_s = request.meta.get('delay_request_by', None)
            if not delay_s and response.status != 403:
                return
            delay_s = delay_s or DEFAULT_DELAY

            deferred = Deferred()
            reactor.callLater(delay_s, deferred.callback, None)
            return deferred

    在示例中,您可以使用元键调用延迟:

    1
    2
    3
    # This request will have itself delayed by 5 seconds
    yield scrapy.Request(url='http://quotes.toscrape.com/page/1/',
                         meta={'delay_request_by': 5})

    有关关于python:如何在scrapy中重新调度403 HTTP状态码以便稍后爬取?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    7. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    8. ruby - 如何模拟 Net::HTTP::Post? - 2

      是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

    9. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

      我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

    10. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    随机推荐