3

是我正在抓取的网站。起初我没有问题,但后来我遇到了这个错误。

[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_listordont_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,
}
4

3 回答 3

3

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

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

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

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

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

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

#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,我怀疑你会看到在很短的时间内它们都会被禁止。

于 2019-07-03T09:57:27.700 回答
1

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

METAREFRESH_ENABLED = False

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

于 2020-05-30T08:36:19.510 回答
1

要停止元刷新,在项目设置中禁用下载中间件 MetaRefreshMiddleware,方法是将其值设置为 None:

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

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

于 2019-12-31T08:41:49.197 回答