#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 —Руководство по стилю для кода Python3. ты забыл
()
в прошломdriver.close()