Запрос Selenium возвращает ошибку 400 — неверный запрос

Я пытаюсь получить данные из http://43.248.49.97/indexEn.

Обычно в браузере первый запрос к приведенному выше URL-адресу возвращает ошибку 412, второй — к файлу JS, а третий — к указанному выше URL-адресу и возвращает ok (200).

При использовании селена третий запрос вместо этого возвращает ошибку 400 - Bad request.

Я использую Python. Любые идеи о том, почему это происходит?]

Спасибо


person FF SS    schedule 08.06.2020    source источник
comment
Как вы получаете код-ответ с селеном?   -  person KunLun    schedule 08.06.2020
comment
Я вручную открываю консоль, захожу в Сеть и проверяю журнал сохранения, прежде чем дать команду перейти на сайт   -  person FF SS    schedule 09.06.2020
comment
Насколько я понимаю, возвращаемый JS-скрипт проверяет, используете ли вы селен и намеренно его блокируете. Я пробовал некоторые обходные пути, которые мы находим в сети (например, изменение двоичного файла веб-драйвера), но безуспешно. Я также пытался прочитать сценарий JS... но он кажется случайным. Если вы обнаружите способ обойти эту проблему и продолжить ее очистку, поделитесь :-)   -  person luis    schedule 25.09.2020


Ответы (1)


У меня была та же проблема, что и у вас, но я нашел решение, которое отлично решает мою проблему.

Возможно, ваша программа дает сбой, потому что вы обнаружены как робот, использующий селен. Итак, вот способ решить эту проблему или скрыть свою личность (window.navigator.webdriver) с помощью JavaScript:

С CDP (Chrome Devtools-Protocol) вы запускаете код до того, как фрейм загружается JS-файлом (детектором). Поэтому используйте эти коды для удаления свойства True веб-драйвера:

Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })

ключевые коды:

from selenium.webdriver import Chrome
driver = Chrome('D://chromedriver.exe')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
driver.get('http://pythonlearner.com')

Однако, если вы обновите свой Chrome до 88 прямо сейчас. Метод, упомянутый выше, будет бесполезен. К счастью, у нас все еще есть решение (добавьте этот код)

chrome_options.add_argument("--disable-blink-features=AutomationControlled")

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

person Curry_N    schedule 28.01.2021