Подтвердить что ты не робот

Может ли сайт обнаруживаться, когда вы используете селен с хромированным ребером?

Я тестировал Selenium с Chromedriver, и я заметил, что некоторые страницы могут обнаружить, что вы используете Selenium, хотя автоматики вообще нет. Даже когда я просто просматриваю вручную, просто используя хром через Selenium и Xephyr, я часто получаю страницу с сообщением о подозрительной активности. Я проверил свой пользовательский агент и отпечаток пальца моего браузера, и все они точно совпадают с обычным браузером Chrome.

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

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

Если вы хотите, чтобы какой-либо тестовый код попробовал это:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

Если вы просматриваете stubhub, вы будете перенаправлены и заблокированы в течение одного или двух запросов. Я изучал это, и я не могу понять, как они могут сказать, что пользователь использует Selenium.

Как они это делают?

ИЗМЕНИТЬ ОБНОВЛЕНИЕ:

Я установил плагин Selenium IDE в Firefox, и мне запретили, когда я пошел на stubhub.com в обычном браузере Firefox с помощью только дополнительного плагина.

EDIT:

Когда я использую Fiddler для просмотра HTTP-запросов, отправляемых туда и обратно, я заметил, что запросы "поддельного браузера" часто имеют "no-cache" в заголовке ответа.

EDIT:

Результат выглядит следующим образом Есть ли способ обнаружить, что я на странице Selenium Webdriver из Javascript, говорит о том, что не должно быть способа обнаружить, когда вы используете webdriver. Но это свидетельствует о другом.

EDIT:

Сайт загружает отпечатки пальцев на свои серверы, но я проверил, и отпечаток пальца селена идентичен отпечатку пальца при использовании хрома.

EDIT:

Это одна из полезных данных отпечатка пальца, которые они отправляют на свои серверы.

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

Его идентичность в селене и в хроме

EDIT:

VPN работают для одного использования, но обнаруживаются после загрузки первой страницы. Очевидно, что некоторые javascript запускаются для обнаружения Selenium.

4b9b3361

Ответ 1

Для пользователей Mac

Замена переменной cdc_ с помощью Vim или Perl

Вы можете использовать vim, или как @Vic Seedoubleyew указал в ответ на @Erti-Крис Eelmaa, perl, чтобы заменить cdc_ переменную в chromedriver (см пост по @Erti-Крис Ээльмаа, чтобы узнать больше об этой переменной). Использование vim или perl позволяет вам перекомпилировать исходный код или использовать шестнадцатеричный редактор. chromedriver чем пытаться отредактировать его, сделайте копию оригинального chromedriver. Кроме того, приведенные ниже методы были протестированы на chromedriver version 2.41.578706 с chromedriver version 2.41.578706.


Использование Vim

vim /path/to/chromedriver

После выполнения строки выше, вы, вероятно, увидите кучу тарабарщины. Выполните следующие действия:

  1. Найдите cdc_, набрав /cdc_ и нажав return.
  2. Включите редактирование, нажав a.
  3. Удалите любую сумму $cdc_lasutopfhvcZLmcfl и замените то, что было удалено символами одинаковой суммы. Если вы этого не сделаете, chromedriver не chromedriver.
  4. После того, как вы закончите редактирование, нажмите esc.
  5. Чтобы сохранить изменения и выйти, введите :wq! и нажмите return.
  6. Если вы не хотите сохранять изменения, но хотите выйти, введите :q! и нажмите return.
  7. Все готово.

Перейдите в измененный chromedriver и дважды щелкните по нему. Откроется окно terminal. Если вы не видите killed на выходе, вы успешно изменили драйвер.


Использование Perl

cdc_ строка заменяет cdc_ на dog_:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

Убедитесь, что строка замены имеет такое же количество символов, что и строка поиска, иначе chromedriver будет работать.

Perl Explanation

s///g означает, что вы хотите найти строку и заменить ее глобально другой строкой (заменяет все вхождения).

например, s/string/replacment/g

Так,

s/// обозначает поиск и замену строки.

cdc_ - строка поиска.

dog_ является заменой строки.

g - глобальный ключ, который заменяет каждое вхождение строки.

Как проверить работу с Perl

Следующая строка выводит каждое вхождение строки поиска cdc_:

perl -ne 'while(/cdc_/g){print "$&\n";}'/path/to/chromedriver

Если это ничего не возвращает, то cdc_ был заменен.

И наоборот, вы можете использовать следующее:

perl -ne 'while(/dog_/g){print "$&\n";}'/path/to/chromedriver

чтобы увидеть, если ваша строка замены, dog_, теперь находится в chromedriver коде chromedriver. Если это так, строка замены будет напечатана на консоли.

Перейдите в измененный chromedriver и дважды щелкните по нему. Откроется окно terminal. Если вы не видите killed на выходе, вы успешно изменили драйвер.


Завершение

После изменения chromedriver кода chromedriver убедитесь, что имя измененного двоичного chromedriver chromedriver - это chromedriver, а исходный двоичный файл либо перемещен из исходного местоположения, либо переименован.


Мой опыт с этим методом

Ранее я был обнаружен на веб-сайте при попытке входа в систему, но после замены cdc_ на строку с равным размером я смог войти. Как и другие, вы сказали, что если вы уже были обнаружены, вы можете быть заблокированы для множество других причин даже после использования этого метода. Поэтому вам, возможно, придется попробовать получить доступ к сайту, который обнаружил вас с помощью VPN, другой сети или того, что у вас есть.

Ответ 2

В основном, как работает обнаружение селена, заключается в том, что они проверяют заранее определенные переменные javascript, которые появляются при работе с селеном. Скрипты обнаружения бота обычно выглядят как-либо, содержащие слово "селен"/"webdriver" в любой из переменных (на объекте окна), а также переменные документа, называемые $cdc_ и $wdc_. Конечно, все это зависит от того, в каком браузере вы находитесь. Все разные браузеры раскрывают разные вещи.

Для меня я использовал хром, поэтому все, что мне нужно было сделать, это убедиться, что $cdc_ больше не существовал как переменная документа, и voila (скачать исходный код хромированного кода, изменить chromedriver и перекомпилировать $cdc_ под другим именем. )

это функция, которую я модифицировал в хромографе:

call_function.js:

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(обратите внимание на комментарий, все, что я сделал, я превратил $cdc_ в randomblabla_.

Вот псевдокод, который демонстрирует некоторые из методов, которые могут использовать бот-сети:

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

в соответствии с пользователем @szx, также можно просто открыть chromedriver.exe в шестнадцатеричном редакторе и просто выполнить замену вручную без фактического компиляции.

Ответ 3

Как мы уже выяснили в вопросе и опубликованных ответах, существует анти-веб-скребок и служба обнаружения ботов под названием "Distil Networks" в играйте здесь. И, по словам генерального директора компании :

Даже если они могут создавать новые боты, , мы выяснили способ идентификации Selenium - инструмент, который использует их, так что блокировали Selenium no сколько раз они повторяют этот бот. Делали это сейчас с Python и множеством различных технологий. Как только мы увидим шаблон выходят из одного типа бота, тогда мы работаем, чтобы технологии, которую они используют, и идентифицировать ее как злонамеренную.

Потребуется время и дополнительные проблемы, чтобы понять, как именно они обнаруживают Селен, но что мы можем сказать наверняка на данный момент:

  • это не связано с действиями, которые вы предпринимаете с селеном - после перехода на сайт вы сразу обнаруживаете и запрещаете. Я попытался добавить искусственные случайные задержки между действиями, сделать паузу после загрузки страницы - ничего не помогло
  • это не об отпечатках от браузера - попробовал это в нескольких браузерах с чистыми профилями, а не с режимами инкогнито - ничего не помогло
  • поскольку, согласно подсказке в интервью, это было "обратное проектирование", я подозреваю, что это делается с использованием некоторого кода JS в браузере, показывающего, что это браузер, автоматически через selenium webdriver.

Решено опубликовать его как ответ, так как ясно:

Может ли сайт обнаруживаться, когда вы используете селен с хромированным ребером?

Да.


Кроме того, я не экспериментировал с более старыми версиями селена и старых браузеров. Теоретически в какой-то момент может быть что-то реализовано/добавлено в селен в тот момент, когда в настоящее время используется детектор ботов Distil Networks. Затем, если это так, мы можем обнаружить (да, пусть детектор детектор), в какой точке/версии было внесено соответствующее изменение, посмотреть в журнал изменений и изменения и, возможно, это может дать нам больше информации о том, где искать и что они используют для обнаружения браузера с поддержкой webdriver. Это просто теория, которая нуждается в проверке.

Ответ 4

Пример того, как он реализован на wellsfargo.com:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

Ответ 5

Запутывающий результат JavaScripts

Я проверил исходный код chromedriver. Это добавляет некоторые файлы JavaScript в браузер.
Каждый файл JavaScript по этой ссылке добавляется на веб-страницы: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Таким образом, я использовал обратный инжиниринг и запутывание в JS файлов редактирования Hex. Теперь я был уверен, что никакие переменные javascript, имена функций и фиксированные строки не использовались для выявления активности селена. Но все же некоторые сайты и reCaptcha обнаруживают селен!
Возможно они проверяют модификации, которые вызваны выполнением chromedriver js :)


Изменить 1:

Chrome 'навигатор' модификация параметров

Я обнаружил, что в "навигаторе" есть некоторые параметры, которые кратко раскрывают использование chromedriver. Это параметры:

  • "navigator.webdriver" В неавтоматизированном режиме это значение не определено. В автоматическом режиме это "правда".
  • "navigator.plugins" На безголовом хроме имеет длину 0. Поэтому я добавил несколько поддельных элементов, чтобы обмануть процесс проверки длины плагина.
  • " navigator.languages" был установлен в значение chrome по умолчанию '["en-US", "en", "es"]'.

Так что мне нужно было расширение Chrome для запуска JavaScript на веб-страницах. Я сделал расширение с помощью кода js, представленного в статье, и использовал другую статью, чтобы добавить расширение zip в свой проект. Я успешно изменил значения; Но все равно ничего не изменилось!

Я не нашел других переменных, подобных этим, но это не значит, что они не существуют. Тем не менее, reCaptcha обнаруживает chromedriver, поэтому должно быть больше переменных для изменения. Следующим шагом должно стать обратное проектирование служб детекторов, которое я не хочу делать.

Теперь я не уверен, стоит ли тратить больше времени на этот процесс автоматизации или поиск альтернативных методов!

Ответ 6

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

Например:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

Список хромовых тэгов здесь

Ответ 7

partial interface Navigator { readonly attribute boolean webdriver; };

Атрибут IDL webdriver интерфейса Navigator должен возвращать значение активного флага webdriver, который изначально ошибочен.

Это свойство позволяет веб-сайтам определять, что пользовательский агент находится под контролем WebDriver и может использоваться для смягчения атак типа "отказ в обслуживании".

Взято непосредственно из проекта редактора W3C в редакторе W3C 2017 года WebDriver. Это в значительной степени подразумевает, что, по крайней мере, будущие итерации драйверов селена будут идентифицированы для предотвращения неправильного использования. В конечном счете, трудно сказать без исходного кода, что именно заставляет драйвер хрома быть определенным.

Ответ 8

Похоже, что они находятся за брандмауэром веб-приложений. Взгляните на modsecurity и owasp, чтобы увидеть, как они работают. На самом деле вы спрашиваете, как сделать уклонение от обнаружения бота. Это не тот веб-драйвер селена. Он предназначен для тестирования вашего веб-приложения, не попадающего в другие веб-приложения. Это возможно, но в принципе, вам нужно будет посмотреть, что ищет WAF в своем наборе правил и, в случае необходимости, избегать селена. Даже тогда это может все еще не работать, потому что вы не знаете, что WAF они используют. Вы сделали правильный первый шаг, это подделка пользовательского агента. Если это не сработало, тогда существует WAF, и вам, вероятно, потребуется более сложная задача.

Изменить:  Точка взята из другого ответа. Прежде всего убедитесь, что ваш пользовательский агент настроен правильно. Возможно, он попал на локальный веб-сервер или обнюхивает трафик.

Ответ 9

Даже если вы отправляете все нужные данные (например, Selenium не отображается как расширение, у вас есть разумное разрешение/бит-глубина и т.д.), Существует ряд услуг и инструментов, которые определяют поведение посетителей, чтобы определить, актер - пользователь или автоматизированная система.

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

В качестве инструмента для отладки также может быть полезно использовать такой сайт, как https://panopticlick.eff.org/, чтобы проверить, насколько уникален ваш браузер; это также поможет вам проверить, есть ли какие-либо конкретные параметры, указывающие, что вы работаете в Selenium.

Ответ 10

Говорят, что Firefox устанавливает window.navigator.webdriver === true при работе с веб-драйвером. Это соответствовало одной из более старых спецификаций (например, archive.org), но я не смог найти ее в новой, за исключением некоторой очень расплывчатой формулировки в приложениях.

Тест для этого находится в коде селена в файле fingerprint_test.js, где в конце комментария написано "В настоящее время реализовано только в Firefox", но я не смог идентифицировать какой-либо код в этом направлении с помощью некоторого простого grep, ни в текущее (41.0.2) дерево релизов Firefox, ни в дереве Chromium.

Я также нашел комментарий для старого коммита по дактилоскопии в драйвере firefox b82512999938 от января 2015 года. Этот код все еще находится в GIT-мастере Selenium, загруженном вчера по адресу javascript/firefox-driver/extension/content/server.js с комментарием, javascript/firefox-driver/extension/content/server.js на приложение, слегка отличающееся от другого, в текущей спецификации веб-драйвера w3c.

Ответ 11

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

ЭКСПЕРИМЕНТ 1:

  1. Я открываю браузер и веб-страницу с Selenium с консоли Python.
  2. Мышь уже находится в определенном месте, где я знаю, что ссылка появится после загрузки страницы. Я никогда не двигаю мышью.
  3. Я нажимаю левую кнопку мыши один раз (это необходимо, чтобы сфокусироваться на консоли, где Python работает в браузере).
  4. Я снова нажимаю левую кнопку мыши (помните, курсор находится выше заданной ссылки).
  5. Ссылка открывается нормально, как и должно быть.

ЭКСПЕРИМЕНТ 2:

  1. Как и прежде, я открываю браузер и веб-страницу с Selenium с консоли Python.

  2. На этот раз вместо щелчка мышью я использую Selenium (в консоли Python), чтобы щелкнуть тот же элемент со случайным смещением.

  3. Ссылка не открывается, но я попал на страницу регистрации.

ПОСЛЕДСТВИЯ:

  • открытие веб-браузера через Selenium не мешает мне появляться
  • перемещение мыши, как человека, не нужно классифицировать как человека
  • щелчок что-то через Selenium со смещением все еще вызывает тревогу

Кажется загадочным, но я думаю, они могут просто определить, происходит ли действие из Селена или нет, в то время как им все равно, был ли сам браузер открыт через Selenium или нет. Или они могут определить, имеет ли окно фокус? Было бы интересно услышать, есть ли у кого-нибудь идеи.

Ответ 12

Некоторые сайты обнаруживают это:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

Ответ 13

Еще одна вещь, которую я обнаружил, заключается в том, что некоторые веб-сайты используют платформу, которая проверяет пользовательский агент. Если значение содержит: "HeadlessChrome", поведение может быть странным при использовании режима без головы.

Обходной путь для этого будет переопределить значение пользовательского агента, например в Java:

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

Ответ 14

Напишите html-страницу со следующим кодом. Вы увидите, что в селе DOM применяется атрибут webdriver в outerHTML

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

Ответ 15

В дополнение к великолепному ответу @Erti-Chris Eelmaa - там надоедливый window.navigator.webdriver и он window.navigator.webdriver только для чтения. Событие, если вы измените его значение на false оно все равно будет иметь значение true. Вот почему браузер, управляемый автоматизированным программным обеспечением, все еще может быть обнаружен. MDN

Переменная управляется флагом --enable-automation в Chrome. Хромедрайвер запускает Chrome с этим флагом, и Chrome устанавливает для window.navigator.webdriver значение true. Вы можете найти это здесь. Вы должны добавить флаг "исключить переключатели". Например (Голанг):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}

Ответ 16

Мне кажется, что самый простой способ сделать это с Selenium - перехватить XHR, который отправляет отпечаток от браузера.

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

Ответ 17

Я нашел изменение javascript-переменной "key" следующим образом:

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

работает на некоторых веб-сайтах при использовании Selenium Webdriver вместе с Google Chrome, поскольку многие сайты проверяют эту переменную, чтобы избежать ее удаления из-за Selenium.

Ответ 18

Вы можете обойти проблему безопасности сайта, добавив расширение chrome vpn, которое сделает ваш браузер более безопасным. Я пробовал его с помощью ZenMate Security VPN. Я видел, что если вы настроите страну как США, она будет работать. Чтобы активировать расширение, вы добавляете chrome extension в chrome browser, затем найдите путь, который должен выглядеть как /Users/mesutgunes/Library/Application Support/Google/Chrome/Default/Extensions/fdcgdnkidjaadafnichfpabhfomcebme/5.3.1_0.

Задайте опционную переменную с расширением пути и создайте хром-драйвер с этой опцией и перемещайтесь по URL-адресу, активируйте VPN, затем переходите к stubhub. Я бы хотел, чтобы это помогло.

>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>> opt = Options()
>>> opt.add_argument("load-extension=/Users/mesutgunes/Library/Application Support/Google/Chrome/Default/Extensions/fdcgdnkidjaadafnichfpabhfomcebme/5.3.1_0")
>>> dr = webdriver.Chrome(chrome_options=opt)
>>> dr.get("http://www.stubhub.com/") #activate the vpn with US then get the url again
>>> dr.get("http://www.stubhub.com/")
>>> dr.title
u'Buy sports, concert and theater tickets on StubHub!'
>>>

введите описание изображения здесь