Scrapy - Как остановить перенаправление метаобновления? - PullRequest
0 голосов
/ 03 июля 2019

Это веб-сайт, который я сканирую. Сначала у меня не было проблем, но потом я столкнулся с этой ошибкой.

[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_list или dont_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,
}

1 Ответ

1 голос
/ 03 июля 2019

Этот сайт защищен Distil Networks. Они используют JavaScript, чтобы определить, что вы бот. Они пропускают некоторые запросы или вообще не пропускают? Возможно, вам удастся добиться успеха с Selenium, но, по моему опыту, они в конце концов приживутся. Решение включает в себя рандомизацию всего отпечатка браузера в зависимости от размера экрана и всего остального, что вы можете придумать. Если у кого-то есть дополнительная информация, мне было бы интересно узнать об этом. Я не уверен насчет SoF ToS на таких вещах.

Если вы загрузите прокси-сервер, такой как Charles Proxy или что-то еще, чтобы вы могли видеть все происходящее, вы можете посмотреть на все JS, на которых они работают.

Если они пропускают 0 запросов, я бы посоветовал использовать Selenium, чтобы увидеть вашу удачу.

Если они пропускают некоторых и перенаправляют других, мой опыт со временем закончится, они в конечном итоге перенаправят их всех. То, что я сделал бы, если бы они пропускали что-то, было установлено http_retry_codes = []

Просто, чтобы подробнее остановиться на этом, я сошлюсь на эту статью о том, как перебирать ваш объект навигатора с помощью Selenium, который содержит большую часть отпечатков вашего браузера. Это должно быть сделано в JS и при каждой загрузке страницы. Я не могу засвидетельствовать его эффективность против Distil. См. этот ответ

#settings.py

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

Затем вы можете повторить все из них, пока ваш ротатор не даст вам хороший IP-адрес, который, я подозреваю, вы увидите, что в течение короткого периода времени все они будут забанены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...