Как перенаправить на страницу результатов и очистить оттуда с помощью scrapy? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь очистить некоторые данные о рейсах с kayak.com, но если я добавлю URL страницы результатов, она будет перенаправлять меня на страницу с бот-капчей.

Я пытался с помощью scrapy-user-agent и scrapy-fake-useragent-fix каким-то образом все равно получить тот же результат

import scrapy

class FlightSpider(scrapy.Spider):
    name  = 'kayak'
    allowed_domains = 'www.kayak.com/'

    start_urls = [
        'https://www.kayak.com.au/flights/PER-MEL/2019-05-01?sort=price_a'
    ]

    handle_httpstatus_list = [302]

    def parse(self, response):
        #test to save the result page in HTML
        filename = 'test-1.html'
        with open(filename, 'wb') as f:
            f.write(response.body)

        #extract the departure time
        for flights_time in response.xpath("//div[@class='resultWrapper']"):
            yield {
                'dep_time' : flights_time.xpath(".//span[@class='depart-time base-time']").extract_first()
            }

И это ошибка, которую я получаю

2019-04-16 18:28:48 [scrapy.core.engine] DEBUG: Crawled (302) <GET https://www.kayak.com.au/flights/PER-MEL/2019-05-01?sort=price_a> (referer: https://www.kayak.com)

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Попробуйте эти настройки в settings.py {только для лечения}:

USER_AGENT  = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) ChromePlus/4.0.222.3 Chrome/4.0.222.3 Safari/532.2'
DEFAULT_REQUEST_HEADERS = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'cookie': 'Apache=; kykprf=158; cluster=5; kayak=; p1.med.sid=; NSC_q5-tqbslmf=; xp-session-seg=; kayak.mc=; _pxhd=""; G_ENABLED_IDPS=; NSC_q5-lbqj=;',
    'pragma': 'no-cache',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}

позже используйте throttle и proxy_rotation для поддержания стабильности.

0 голосов
/ 18 апреля 2019

он продолжает перенаправлять меня на страницу с бот-капчей.

Потому что они знают, что вы бот.Вы можете сделать три вещи, чтобы предотвратить это:

  1. В settings.py настройте следующие переменные.С этим вы можете сделать ваши звонки более случайными.Это самый простой способ улучшить свой скребок.Тем не менее, я думаю, что недостаточно обойти безопасность каяка.

Пример кода:

DOWNLOAD_DELAY=0.75                                                        
RANDOMIZE_DOWNLOAD_DELAY=True                             
AUTOTHROTTLE_ENABLED=True
AUTOTHROTTLE_MAX_DELAY=4
AUTOTHROTTLE_START_DELAY=1.25
AUTOTHROTTLE_DEBUG=False
AUTOTHROTTLE_TARGET_CONCURRENCY=1.5        
# The download delay setting will honor only one of:
CONCURRENT_REQUESTS_PER_DOMAIN=1
CONCURRENT_REQUESTS_PER_IP=1 #Default 4

User-Agent, вы уже упоминали об этом.В settings.py вы можете установить DOWNLOADER_MIDDLEWARES.
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'scraper1.middlewares.randomproxy.RandomProxyMiddleware': 100,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scraper1.middlewares.randomuseragent.RandomUserAgentMiddleware': 400,
}

Здесь вы можете добавить некоторые промежуточные программы для ваших целей.Попробуйте получить простой список 100/200 пользовательских агентов: https://developers.whatismybrowser.com/useragents/explore/


То же самое относится к прокси.Вам понадобятся разные прокси, чтобы сделать ваши запросы как можно более случайными.

Примерно так в промежуточном ПО:

class RandomProxyMiddleware(object):
    def __init__(self, settings):
        super(RandomProxyMiddleware, self).__init__()

        # Get proxies from DB
        try:
            proxy_list = ProxyService.get_proxies()
        except:
            logging.critical('Failed to get proxies')

        self.proxies = []

        for proxy in proxy_list:
            self.proxies.append('http://' + str(proxy[0]) + ':' + str(proxy[1]))

Отредактированный пример прокси промежуточного ПО.

class RandomProxyMiddleware(object):
    def __init__(self, settings):
        super(RandomProxyMiddleware, self).__init__()

        self.proxies = [
            'proxy1.com:8000',
            'proxy2.com:8031'
        ]

Выможно также взглянуть на эту библиотеку: https://pypi.org/project/scrapy-rotating-proxies/

Что на самом деле будет делать то же самое с некоторыми дополнительными вещами, такими как проверка, действительны ли прокси.

...