Могу ли я запустить свой код selenium, чтобы он не запускал cloudflare?

#python #selenium #selenium-webdriver #cloudflare

Вопрос:

Я пишу код, который может помочь моему отцу выиграть время для своего поля для гольфа. В данный момент он просматривает серию из n вкладок в поисках кнопки, чтобы забронировать время в тройник, но если он не может ее найти, он обновляет страницу. Проблема возникает, когда он обновляется, так как страница защищена cloudflare, и поэтому мой код блокируется в десять раз чаще, чем он может проверить фактическое время выполнения. Есть ли лучший способ запустить мой код, чтобы он не блокировался так часто?

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

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pyautogui as pag

date = "2021-09-19"
st = "08"
et = "09"
golfers = "4"
tabs_opened = 10
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

for _ in range(tabs_opened):
    driver.execute_script(f"window.open('about:blank', 'tab{_ 1}');")
    driver.switch_to.window(f"tab{_ 1}")
    driver.get(f"https://city-of-burnaby-golf.book.teeitup.com/?course=5fc6afcfd62a025a3123401aamp;date={date}amp;end={et}amp;golfers={golfers}amp;holes=18amp;start={st}") #loads the website

driver.switch_to.window(driver.window_handles[0]) #assuming new tab is at index 1
driver.close()

tcgbbc = 0 #tracks number of times cloudflare blocks me
wt = 0 #tracks actual times the website has been checked for button
i = 0
_ = 0
starttest = time.perf_counter()
while i < 100: 
    driver.switch_to.window(driver.window_handles[_%tabs_opened]) #switch to next tab        
    try:
        driver.find_element_by_xpath('/html/body/table/tbody/tr/td/div[2]/span/code') #checks if the cloudflare ray id text is there
        print("whoops got blocked by cloudflare")
        tcgbbc =1
    except:
        print("no cloudflare yay") #it wasn't. yay
        elem = driver.find_elements_by_xpath('//*[@id="app-container"]/div/div[2]/div/div[2]/div[2]/div[2]/div[1]/div/button') #checks golf burnaby website to see if the button is there
        if len(elem) > 0:
            elem[0].click()
            print("page found")
            break
        else: 
            if len(driver.find_elements_by_xpath('//*[@id="header"]/div/div[1]')) > 0: #if the website's title is there (sometimes it checks and can't find the button, but the page wasn't even loaded)
                print("didn't work") 
                wt =1
                i =1   
                driver.refresh() #refreshes the page. seems to be the most time consuming.    
    _ =1  
                         
print(time.perf_counter() - starttest)
time.sleep(1)
driver.close
print(f"Cloudflare blocks: {tcgbbc}, actual checks: {wt}")
 

Комментарии:

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

2. переменная _ часто используется для значения, которое вы не используете, поэтому использование _ = 0 может быть ошибочным и нечитаемым для других. Переменные должны иметь имена, которые что-то значат. Подробнее см. в PEP 8 —Руководство по стилю для кода Python

3. ты забыл () в прошлом driver.close()