идентичный запрос обнаружен как автоматический - PullRequest
0 голосов
/ 21 июня 2020

Как сервер может обнаружить бота из одного HTML запроса, идентичного запросу, сделанному из интерактивного сеанса? Например, я могу открыть новый частный браузер в Firefox, ввести URL-адрес и вернуть все 200. Однако, когда я копирую начальный запрос HTML, который загружал страницу - URL-адрес, заголовки и все остальное - и сделайте это с помощью инструмента со сценарием, такого как requests_html на том же устройстве, я получаю 403. Какую еще информацию сервер использует для различения этих двух запросов? Есть ли что-то, что делает Firefox или requests_html, что не видно из инструментов разработчика и python кода?

Пример кода (домен заменен):

from request_html import HTMLSession

url = 'https://www.example.com'
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive',
    'DNT': '1',
    'Host': 'www.example.com',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8'
}
session = HTMLSession()
response = session.get(url, headers=headers)

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Я бы очень рекомендовал использовать пакет selenium. запросы действительно плохо справляются с динамической загрузкой c и отображением asyn c. Он отлично подходит для взаимодействия с API, но если вы работаете с парсингом, селен - это инструмент.

0 голосов
/ 21 июня 2020

requests_http использует браузер Chrome / Chromium без головы, поэтому, если вы действительно отправляете идентичный запрос, он не должен быть различим.

Обычно HTTP-запросы содержат только протокол http, метод, заголовки

Так что, если оба идентичны, это странно, что разница может быть обнаружена веб-сервером.

Серверы могут определять время, но я предполагаю, что это самый первый запрос, и вы опробуете оба с одного и того же IP-адреса.

Серверы могут обнаружить запрос, если он на 100% идентичен ранее выполненному запросу, но я предполагаю, что вы уже протестировали это, сначала попробовав свой скрипт и затем с помощью вашего анонимного браузера.

Я предполагаю, что вы также посмотрели в свой браузер и не обнаружили никаких перенаправлений.

Некоторые другие различия, которые могут возникнуть во время согласования SSL (порядок ключей предлагается / принято.

Возможно, ваш браузер также пытается получить доступ к 'favicon.ico' и только затем страница и что requests_http этого не делает.

Я предлагаю сначала убедиться, что вы можете воспроизвести запрос из своего браузера с помощью requests_http.

I Предлагаю следующее. попробуйте настроить свой собственный веб-сервер на локальном компьютере, на виртуальной машине, в контейнере на одном из удаленных серверов. настройте nginx для ведения журнала ошибок на уровне отладки. Затем выполните доступ с помощью своего частного браузера, а затем с помощью сценария, используя request_http и go, через сгенерированный файл журнала и найдите любую разницу.

...