Изменить прокси в chromedriver для очистки - PullRequest
0 голосов
/ 01 июня 2019

Я перебираю Bet365, вероятно, один из самых хитрых сайтов, с которыми мне приходилось сталкиваться, с селеном и Chrome. Проблема с этой страницей в том, что, хотя мой скребок спит так, что никоим образом не работает быстрее, чем человек может, в какой-то момент, иногда, он блокирует мой ip со случайного количества времени (между половиной и 2 часами) .

Итак, я просматриваю прокси, чтобы сменить IP и возобновить очистку. И вот тут я застрял, пытаясь решить, как подойти к этому

Я использовал 2 разных бесплатных провайдеров ip следующим образом

https://gimmeproxy.com

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

import requests

api="MY_API_KEY"  #with the free plan I can ask 240 times a day for an IP
adder="&post=true&supportsHttps=true&maxCheckPeriod=3600"

url="https://gimmeproxy.com/api/getProxy?"
r=requests.get(url=url,params=adder)

THIS IS EDITED
apik="api_key={}".format(api)
r=requests.get(url=url,params=apik+adder)

а я не получаю ответа. Ошибка 404 не найдена. СЕЙЧАС РАБОТАЕТ, МОЙ ПЛОХОЙ

Мой второй подход - через этот другой сайт sslproxy

С этим вы очищаете страницу и получаете список из 100 IP-адресов, теоретически проверенных и работающих. Итак, я настроил цикл, в котором я пробую случайный IP-адрес из этого списка, и если он не работает, удаляет его из списка и пытается снова. Этот подход работает при попытке открыть Bet365.

for n in range(1, 100):
  proxy_index=random.randint(0, len(proxies) - 1)
  proxi=proxies[proxy_index]

  PROXY=proxi['ip']+':'+proxi['port']
  chrome_options = webdriver.ChromeOptions()
  chrome_options.add_argument('--proxy-server={}'.format(PROXY))

  url="https://www.bet365.es"

  try:    
     browser=webdriver.Chrome(path,options=chrome_options)
     browser.get(url)
     WebDriverWait(browser,10)..... #no need to post the whole condition
     break

  except:
     del proxies[proxy_index]
     browser.quit()

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

Итак, мой вопрос: ожидается ли, что с использованием прокси очистка будет происходить намного медленнее, или это зависит от используемого прокси? Если да, то рекомендует ли кто-нибудь другой (или лучше, конечно) подход?

1 Ответ

0 голосов
/ 09 июня 2019

Я не вижу существенной проблемы ни в вашем подходе, ни в вашем блоке кода.Однако другой подход заключается в использовании всех прокси, отмеченных в столбце Последняя проверка , который обновляется в списке Free Proxy List .

В качестве решения вы можете написать скрипт для захвата всех доступных прокси-серверов и динамически создавать Список при каждой инициализации вашей программы.Следующая программа будет вызывать прокси из списка прокси один за другим, пока не будет установлено успешное прокси-соединение и не проверено через Page Title из https://www.bet365.es для содержания bet365 .Исключение может возникнуть из-за того, что свободный прокси, который захватила ваша программа, был перегружен пользователями, пытающимися пропустить свой прокси-трафик.

  • Кодовый блок:

    driver.get("https://sslproxies.org/")
    driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//th[contains(., 'IP Address')]"))))
    ips = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 1]")))]
    ports = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 2]")))]
    driver.quit()
    proxies = []
    for i in range(0, len(ips)):
        proxies.append(ips[i]+':'+ports[i])
    print(proxies)
    for i in range(0, len(proxies)):
        try:
            print("Proxy selected: {}".format(proxies[i]))
            options = webdriver.ChromeOptions()
            options.add_argument('--proxy-server={}'.format(proxies[i]))
            driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
            driver.get("https://www.bet365.es")
            if "Proxy Type" in WebDriverWait(driver, 20).until(EC.title_contains("bet365")):
                # Do your scrapping here
                break
        except Exception:
            driver.quit()
    print("Proxy was Invoked")
    
  • Консольный вывод:

    ['190.7.158.58:39871', '175.139.179.65:54980', '186.225.45.146:45672', '185.41.99.100:41258', '43.230.157.153:52986', '182.23.32.66:30898', '36.37.160.253:31450', '93.170.15.214:56305', '36.67.223.67:43628', '78.26.172.44:52490', '36.83.135.183:3128', '34.74.180.144:3128', '206.189.122.177:3128', '103.194.192.42:55546', '70.102.86.204:8080', '117.254.216.97:23500', '171.100.221.137:8080', '125.166.176.153:8080', '185.146.112.24:8080', '35.237.104.97:3128']
    
    Proxy selected: 190.7.158.58:39871
    
    Proxy selected: 175.139.179.65:54980
    
    Proxy selected: 186.225.45.146:45672
    
    Proxy selected: 185.41.99.100:41258
    
...