Scrapy-如何停止元刷新重定向?

时间:2019-07-03 09:12:43

标签: python http redirect web-scraping scrapy

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,
}

3 个答案:

答案 0 :(得分: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

然后,您可以重试所有它们,直到您的转子提供给您良好的IP,我怀疑您会在短时间内看到它们全部被禁止。

答案 1 :(得分:1)

要停止元刷新,只需在搜寻器settings.py文件中将其禁用:

METAREFRESH_ENABLED = False

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

答案 2 :(得分:0)

要停止元刷新,请通过将项目的值设置为“无”来禁用项目设置中的下载中间件MetaRefreshMiddleware:

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

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