Я просматриваю Google: «gasbuddy + «адреса во входном файле», нажимаю первую ссылку и перенаправляюсь на эту веб-страницу. После успешной отправки ключей он сообщает «устаревший элемент не найден», и я вижу результаты, загруженные в драйвер. Тестовый скрипт работает и сообщает об ошибке «устаревший элемент не найден» после того, как я скопировал и вставил его в функцию в более крупном скрипте с многопроцессорной ротацией прокси. Я прикрепил сюда оба скрипта, что происходит с этой оболочкой
. есть все результаты Google, почему он исчез из DOM?
Вот проблемная часть скрипта внутри цикла: (он сообщает код ошибки после того, как строка отправила ключи) п>
[code]try:
# Loop through each address
for index, row in address_chunk.iterrows():
address = row['Address']
proxy_success = False
driver = None
for _ in range(len(proxies)):
proxy = next(proxy_cycle)
try:
if driver is not None:
driver.close()
driver.quit()
# Open the website using the current proxy
chrome_options = Options()
#chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument(f'--proxy-server={proxy}')
driver = webdriver.Chrome(service=service, options=chrome_options)
# Open the website
driver.get('https://www.google.com/')
wait = WebDriverWait(driver, 5)
search_box = wait.until(EC.presence_of_element_located((By.NAME, "q")))
proxy_success = True
break # exit the proxy lop
except Exception as e:
logging.error(f"Failed to open google for Address: {address} with proxy {proxy}- {str(e)}")
continue
if not proxy_success:
logging.error(f"All proxies failed for Address: {address}")
if driver is not None:
driver.close()
driver.quit()
continue #skip to the next address
found_results = False
results = []
try:
search_query = f"gasbuddy {address}"
logging.info(f'Searching for: {search_query} using proxy {proxy}')
# search address in Google
#search_box = driver.find_element(By.NAME, "q")
search_box.send_keys(search_query)
search_box.send_keys(Keys.RETURN)
# Use WebDriverWait instead of time.sleep
#wait.until(EC.presence_of_element_located((By.XPATH, "//a[h3]")))
wait = WebDriverWait(driver, 8)
wait.until(lambda driver: len(driver.find_elements(By.XPATH, "//a[h3]")) >= 10)
logging.info(f'Found search links for: {search_query} using proxy {proxy}')
#time.sleep(5) # Wait for search results to load
# Find GasBuddy link in search results
links = driver.find_elements(By.XPATH, "//a[h3]")
[/code]
Ниже приведен тестовый сценарий, который работает отлично. Вы можете просто скопировать и вставить, чтобы попробовать сами. Я вообще не вижу никаких изменений в структуре, кроме того, что это помещено в функцию с мультипроцессом с ротацией прокси:
[code]from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import re
from selenium.webdriver.chrome.service import Service
# Setup Selenium WebDriver
service = Service("your web driver path")
driver = webdriver.Chrome(service=service)
# Ensure the chromedriver is in your PATH or specify the path to it
# List of gas stations
gas_stations = [
{"1037 SAINT JAMES AVE SPRINGFIELD, MA 01104-1309"
},
# Add more gas stations here
]
# Loop through each gas station
for station in gas_stations:
search_query = f"gasbuddy {station}"
# Open Google
driver.get("https://www.google.com")
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys(search_query)
search_box.send_keys(Keys.RETURN)
wait = WebDriverWait(driver, 8)
wait.until(EC.presence_of_element_located((By.XPATH, "//a[h3]")))
#time.sleep(5) # Wait for search results to load
# Find GasBuddy link in search results
links = driver.find_elements(By.XPATH, "//a[h3]") #finds all anchor () elements on the Google search results page that contain a child element. These are typically the clickable titles of the search results.
gasbuddy_link = None
for link in links:
if "gasbuddy.com" in link.get_attribute("href"):
gasbuddy_link = link.get_attribute("href")
break
if gasbuddy_link:
driver.get(gasbuddy_link)
time.sleep(3) # Wait for the GasBuddy page to load
# Extract station ID from the URL
station_id_match = re.search(r'/station/(\d+)', gasbuddy_link)
station_id = station_id_match.group(1) if station_id_match else 'N/A'
# Scrape ratings (this part will depend on the structure of the GasBuddy page)
try:
rating = driver.find_element(By.XPATH, ".//span[contains(@class, 'Station-module__ratingAverage')]").text
ratingcount = driver.find_element(By.XPATH, "//span[contains(@class, 'StationInfoBox-module__ratings___1O33R')]").text.strip("()")
amenities_elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'amenitiesPanel')]//span[contains(@class, 'text__left___1iOw3')]")
amenities = [element.text.strip() for element in amenities_elements if element.text.strip()]
#amenities = [element.text for element in amenities_elements]
num_amenities = len(amenities)
amenities_str = ', '.join(amenities)
except Exception as e:
print(f"Failed to get rating for {station['name']}: {e}")
print(f"GasBuddy Link: {gasbuddy_link}")
print(f"Station ID: {station_id}")
print(f"Station Rating: {rating}")
print(f"Amount of Ratings: {ratingcount}")
# Print or process the list of amenities
print(f"Number of amenities: {num_amenities}")
print(f"Amenities: {amenities_str}")
else:
print(f"No GasBuddy link found for {station['name']}")
time.sleep(2) # Small delay before the next iteration
# Close the driver
driver.quit()
[/code]
Я не могу использовать time.sleep, иначе подозреваю, что это может сработать. Я использовал wait.until(driver.find_elements(By.XPATH, "//a[h3]")) и использовал wait.until(лямбда-драйвер: len(driver.find_elements(By.XPATH, "/ /a[h3]")) >= 10) и отрегулировал количество доступных ссылок для управления временем ожидания.
Я предполагаю, что когда Google загружает все результаты/ссылки, элементы постоянно меняются. Поэтому, пока я не дам странице полностью загрузиться и остановиться, будет появляться эта ошибка?
Как решить эту проблему?
Добавить: неважно, я дождался завершения загрузки страницы: wait.until(lambda driver: driver.execute_script('return document.readyState') == 'complete'), ошибка все та же.
Устаревший элемент кода ошибки не найден, выбрасывается до того, как скрипт попытается полностью загрузить страницу (в противном случае у меня будет информация файла журнала для «Найдена ссылка для поиска») и сразу после того, как скрипт отправит ключи для поиска в Google, и я может визуально видеть драйвер с головой для загрузки результатов на странице, а затем драйвер сразу закрывается сразу после загрузки страницы (или, возможно, все еще загружается, я не знаю).
Обновление: я выделил конкретную строку у которого возникла эта проблема: search_box.send_keys(Keys.RETURN), код ошибки выдается сразу после выполнения поиска по щелчку, повторная попытка поймать что-либо или любые обычные способы здесь не могут помочь, потому что я не могу понять, почему после нажал на поиск, скрипт по-прежнему взаимодействует с элементом search.box. Согласно сценарию, сценарий уже продвинулся дальше и больше никогда не будет ссылаться на элемент поля поиска, не имеет значения, устарели эти элементы или нет, сценарий продолжил работу. Почему?
Обновление: после удаления всех функций и восстановления тестового сценария я обнаружил, что проблема связана с входным адресом, у меня есть файл csv в качестве входных данных и строка анализа. форматирует адреса, это отображает устаревший элемент, не найденный код, но адреса, указанные непосредственно в скрипте, работают нормально. В чем причина?
Я просматриваю Google: «gasbuddy + «адреса во входном файле», нажимаю первую ссылку и перенаправляюсь на эту веб-страницу. После успешной отправки ключей он сообщает «устаревший элемент не найден», и я вижу результаты, загруженные в драйвер. Тестовый скрипт работает и сообщает об ошибке «устаревший элемент не найден» после того, как я скопировал и вставил его в функцию в более крупном скрипте с многопроцессорной ротацией прокси. Я прикрепил сюда оба скрипта, что происходит с этой оболочкой [h3]. есть все результаты Google, почему он исчез из DOM? Вот проблемная часть скрипта внутри цикла: (он сообщает код ошибки после того, как строка отправила ключи) п> [code]try: # Loop through each address for index, row in address_chunk.iterrows(): address = row['Address'] proxy_success = False driver = None
for _ in range(len(proxies)): proxy = next(proxy_cycle) try: if driver is not None: driver.close() driver.quit() # Open the website using the current proxy chrome_options = Options() #chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument(f'--proxy-server={proxy}') driver = webdriver.Chrome(service=service, options=chrome_options)
# Open the website driver.get('https://www.google.com/') wait = WebDriverWait(driver, 5) search_box = wait.until(EC.presence_of_element_located((By.NAME, "q"))) proxy_success = True break # exit the proxy lop except Exception as e: logging.error(f"Failed to open google for Address: {address} with proxy {proxy}- {str(e)}") continue if not proxy_success: logging.error(f"All proxies failed for Address: {address}") if driver is not None: driver.close() driver.quit() continue #skip to the next address
found_results = False results = []
try: search_query = f"gasbuddy {address}" logging.info(f'Searching for: {search_query} using proxy {proxy}') # search address in Google #search_box = driver.find_element(By.NAME, "q") search_box.send_keys(search_query) search_box.send_keys(Keys.RETURN)
# Use WebDriverWait instead of time.sleep #wait.until(EC.presence_of_element_located((By.XPATH, "//a[h3]"))) wait = WebDriverWait(driver, 8) wait.until(lambda driver: len(driver.find_elements(By.XPATH, "//a[h3]")) >= 10) logging.info(f'Found search links for: {search_query} using proxy {proxy}')
#time.sleep(5) # Wait for search results to load
# Find GasBuddy link in search results links = driver.find_elements(By.XPATH, "//a[h3]") [/code] Ниже приведен тестовый сценарий, который работает отлично. Вы можете просто скопировать и вставить, чтобы попробовать сами. Я вообще не вижу никаких изменений в структуре, кроме того, что это помещено в функцию с мультипроцессом с ротацией прокси: [code]from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time import re from selenium.webdriver.chrome.service import Service
# Setup Selenium WebDriver service = Service("your web driver path") driver = webdriver.Chrome(service=service) # Ensure the chromedriver is in your PATH or specify the path to it
# List of gas stations gas_stations = [ {"1037 SAINT JAMES AVE SPRINGFIELD, MA 01104-1309" }, # Add more gas stations here ]
# Loop through each gas station for station in gas_stations: search_query = f"gasbuddy {station}"
# Open Google driver.get("https://www.google.com") search_box = driver.find_element(By.NAME, "q") search_box.send_keys(search_query) search_box.send_keys(Keys.RETURN)
wait = WebDriverWait(driver, 8) wait.until(EC.presence_of_element_located((By.XPATH, "//a[h3]"))) #time.sleep(5) # Wait for search results to load
# Find GasBuddy link in search results links = driver.find_elements(By.XPATH, "//a[h3]") #finds all anchor () elements on the Google search results page that contain a child element. These are typically the clickable titles of the search results. gasbuddy_link = None for link in links: if "gasbuddy.com" in link.get_attribute("href"): gasbuddy_link = link.get_attribute("href") break
if gasbuddy_link: driver.get(gasbuddy_link) time.sleep(3) # Wait for the GasBuddy page to load
# Extract station ID from the URL station_id_match = re.search(r'/station/(\d+)', gasbuddy_link) station_id = station_id_match.group(1) if station_id_match else 'N/A' # Scrape ratings (this part will depend on the structure of the GasBuddy page) try: rating = driver.find_element(By.XPATH, ".//span[contains(@class, 'Station-module__ratingAverage')]").text ratingcount = driver.find_element(By.XPATH, "//span[contains(@class, 'StationInfoBox-module__ratings___1O33R')]").text.strip("()") amenities_elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'amenitiesPanel')]//span[contains(@class, 'text__left___1iOw3')]") amenities = [element.text.strip() for element in amenities_elements if element.text.strip()] #amenities = [element.text for element in amenities_elements] num_amenities = len(amenities) amenities_str = ', '.join(amenities) except Exception as e: print(f"Failed to get rating for {station['name']}: {e}")
print(f"GasBuddy Link: {gasbuddy_link}") print(f"Station ID: {station_id}") print(f"Station Rating: {rating}") print(f"Amount of Ratings: {ratingcount}") # Print or process the list of amenities print(f"Number of amenities: {num_amenities}") print(f"Amenities: {amenities_str}") else: print(f"No GasBuddy link found for {station['name']}")
time.sleep(2) # Small delay before the next iteration
# Close the driver driver.quit()
[/code] Я не могу использовать time.sleep, иначе подозреваю, что это может сработать. Я использовал wait.until(driver.find_elements(By.XPATH, "//a[h3]")) и использовал wait.until(лямбда-драйвер: len(driver.find_elements(By.XPATH, "/ /a[h3]")) >= 10) и отрегулировал количество доступных ссылок для управления временем ожидания. Я предполагаю, что когда Google загружает все результаты/ссылки, элементы постоянно меняются. Поэтому, пока я не дам странице полностью загрузиться и остановиться, будет появляться эта ошибка? Как решить эту проблему? Добавить: неважно, я дождался завершения загрузки страницы: wait.until(lambda driver: driver.execute_script('return document.readyState') == 'complete'), ошибка все та же. Устаревший элемент кода ошибки не найден, выбрасывается до того, как скрипт попытается полностью загрузить страницу (в противном случае у меня будет информация файла журнала для «Найдена ссылка для поиска») и сразу после того, как скрипт отправит ключи для поиска в Google, и я может визуально видеть драйвер с головой для загрузки результатов на странице, а затем драйвер сразу закрывается сразу после загрузки страницы (или, возможно, все еще загружается, я не знаю). Обновление: я выделил конкретную строку у которого возникла эта проблема: search_box.send_keys(Keys.RETURN), код ошибки выдается сразу после выполнения поиска по щелчку, повторная попытка поймать что-либо или любые обычные способы здесь не могут помочь, потому что я не могу понять, почему после нажал на поиск, скрипт по-прежнему взаимодействует с элементом search.box. Согласно сценарию, сценарий уже продвинулся дальше и больше никогда не будет ссылаться на элемент поля поиска, не имеет значения, устарели эти элементы или нет, сценарий продолжил работу. Почему? Обновление: после удаления всех функций и восстановления тестового сценария я обнаружил, что проблема связана с входным адресом, у меня есть файл csv в качестве входных данных и строка анализа. форматирует адреса, это отображает устаревший элемент, не найденный код, но адреса, указанные непосредственно в скрипте, работают нормально. В чем причина?
cookie = driver.find_element(By.ID, bigCookie ) действия = ActionChains (драйвер) действия.клик(cookie) действия.выполнить() Когда я запускаю этот код, .
Я имею в виду, что не могу выполнить действие щелчка на веб-странице.