【问题标题】:Scrapy - How to stop meta refresh redirect?Scrapy - 如何停止元刷新重定向?
【发布时间】:2019-11-13 22:36:38
【问题描述】:

This 是我正在抓取的网站。一开始没问题,后来就遇到了这个错误。

[scrapy] DEBUG: Redirecting (meta refresh) to <GET https://www.propertyguru.com.my/distil_r_captcha.html?requestId=9f8ba25c-3673-40d3-bfe2-6e01460be915&httpReferrer=%2Fproperty-for-rent%2F1> from <GET https://www.propertyguru.com.my/property-for-rent/1>

网站知道我是机器人并将我重定向到带有验证码的页面。我认为handle_httpstatus_listdont_redirect 不起作用,因为重定向不是使用http 状态代码完成的。这是我的爬虫代码。有什么办法可以阻止这种重定向?

class MySpider(CrawlSpider):

    name = 'myspider'

    start_urls = [
        'https://www.propertyguru.com.my/property-for-rent/1',
    ]

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
    }
    meta = {
        'dont_redirect': True
    }


    def parse(self, response):    
        items = response.css('div.header-container h3.ellipsis a.nav-link::attr(href)').getall()

        if items:
            for item in items:
                if item.startswith('/property-listing/'):
                    yield scrapy.Request(
                        url='https://www.propertyguru.com.my{}'.format(item),
                        method='GET',
                        headers=self.headers,
                        meta=self.meta,
                        callback=self.parse_items
                    )

    def parse_items(self, response):
        from scrapy.shell import inspect_response
        inspect_response(response, self)

更新:我尝试了这些设置,但它们也不起作用。

custom_settings = {
    'DOWNLOAD_DELAY': 5,
    'DOWNLOAD_TIMEOUT': 360,
    'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
    'CONCURRENT_ITEMS': 1,
    'REDIRECT_MAX_METAREFRESH_DELAY': 200,
    'REDIRECT_MAX_TIMES': 40,
}

【问题讨论】:

  • 您的问题比关闭 302 重定向更严重。他们拥有顶级反抓取技术 Distil Networks 之一。有一次,我用 Selenium 解决了一段时间,但最终还是结束了,我猜尽管进行了随机化努力,他们还是以某种方式发现了我。

标签: python http redirect web-scraping scrapy


【解决方案1】:

本网站受 Distil Networks 保护。他们正在使用 JavaScript 来确定您是机器人。他们是让一些请求通过还是根本不通过?你可能会在 Selenium 上取得一些成功,但根据我的经验,它们最终会流行起来。该解决方案涉及从屏幕尺寸和您能想到的所有其他内容中随机化整个浏览器指纹。如果其他人有其他信息,我很想听听。我不确定 SoF ToS 在这样的事情上。

如果你加载一个像 charles proxy 之类的代理,这样你就可以看到正在发生的一切,你可以查看它们在你身上运行的所有 JS。

如果他们允许 0 个请求通过,我建议使用 Selenium 来看看你的运气。

如果他们让一些人通过并重定向其他人,我的经验是随着时间的推移,他们最终会将他们全部重定向。如果他们让一些人通过,我会怎么做设置 http_retry_codes = []

为了进一步扩展这一点,我将链接到这篇关于使用 Selenium 覆盖导航器对象的帖子,其中包含大部分浏览器指纹。它必须在 JS 中和每次页面加载时完成。我无法证明它对 Distil 的有效性。见this answer

感谢其他回答完成我的回答,直接回答您的问题。

#settings.py

HTTP_RETRY_CODES = [404, 303, 304, ???]
RETRY_TIMES = 20

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': None,
}

在特定请求的蜘蛛元属性中:

meta={'dont_redirect': True}

另外值得注意的是,您可以在中间件的 process_response 方法下捕获 302 并让它抛出另一个请求。如果您有良好的 UA 列表和 IP 源,这与 HTTP RETRY CODES 结合使用是蛮力的好方法。

我建议你试试https://scrapinghub.com/crawlera。他们最近提高了价格,但他们提供了良好的 IP 并检测禁令。如果您需要获取某些信息,这确实是值得的。与大多数便宜得多的 IP 轮换网络不同,他们的网络很智能。他们正在进行试用,因此您可以验证它是否有效以及它是否由 scrapy 的开发人员制作,因此请按照文档进行轻松安装

pip install scrapy_crawlera

然后您可以重试所有这些,直到您的 rotator 为您提供一个好的 IP,我怀疑您会在短时间内看到它们都将被禁止。

【讨论】:

  • 起初,我收到回复没有任何问题。几分钟后,该网站检测到我是一个机器人,尽管我没有像疯了一样发送垃圾邮件请求。当网站开始重定向我时,我正在测试我的选择器。一个小时过去了,我再次收到回复没有任何问题,但我很确定这不会停留更长时间,我会再次被重定向。
  • 我很感兴趣,如果你发现了什么,请告诉我。我曾经在一个项目上工作了很长时间,并且能够使用 selenium 获得 40k 条记录,但是一旦他们确定了我的 Selenium 方法,就无法完成该项目。我现在尽量远离这种工作。公共数据只有在他们使用 Distil 时才有可能他们不希望你拥有这些数据,而且这会让你头疼,因为你开发 AI 的任何东西最终都会看到一个模式。如果有人打败它,请联系我哈哈。
  • 我还有最后一个想法。机器学习可以使用任意数量的元数据,但如果我在下载和请求之间使用随机延迟,分类器可能会认为我是人。不过,在网站上花费的时间可能不值得。如果我发现任何关于此的信息,我会告诉你的:D
  • 试试看——我做了指纹随机化和浏览器随机化我还在每个页面上花费了随机时间
【解决方案2】:

在项目设置中通过将其值设置为 None 来停止元刷新禁用下载中间件 MetaRefreshMiddleware:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': None,
}

https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#activating-a-downloader-middleware

【讨论】:

  • 这是对直接问题的回答,但深入挖掘 Distil 的实际问题并不能解决他的问题。
【解决方案3】:

要停止元刷新,只需在爬虫 settings.py 文件中禁用它:

METAREFRESH_ENABLED = False

https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#metarefreshmiddleware-settings

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2011-04-02
    • 2013-03-17
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多