Я пытаюсь автоматизировать процесс, при котором я могу посетить веб-сайт, наведя указатель мыши на навигацию по меню. и нажмите на каждую опцию категории навигации в раскрывающемся списке уровня 1, посетите эту страницу, соберите подробную информацию о 20 лучших продуктах на этой странице и поместите ее в файл Excel. Если на этой странице нет какого-либо продукта, скрипт продолжит прокручиваться вниз, пока не достигнет конца страницы, и если элемент Product-div не найден, он вернется в начало страницы и щелкнет следующую категорию в списке. панель навигации
Для этого я работаю с Selenium (используя Python). Я прикрепил свой код ниже.
scroll_and_click_view_more функция предназначена для прокрутки страницы вниз, prod_vitals предназначена для сбора сведений о продукте, специфичных для каждой страницы, а функция prod_count предназначена для извлечения общего количества продуктов на каждой странице и создания сводной информации обо всех страниц.
Описание ошибки:
Когда я запускаю приведенный ниже код , все функции работают нормально, кроме одной. Первая страница, которую прокручивает этот код, не содержит никакой информации о продукте. Сценарий прокручивает всю страницу вниз, не печатает ни одной плитки продукта, найденной на этой странице, а затем должен щелкнуть следующую категорию, но по какой-то причине он не может щелкнуть следующую категорию на пути. Он выдает ошибку исключения тайм-аута и нажимает на следующую категорию, которая снова работает нормально. На этом веб-сайте есть две категории, в которых нет плитки продукта, и для обеих этих страниц сценарий не может щелкнуть следующую доступную категорию. Прикрепляю скриншот ошибки.
Вывод моего кода:
['/feature/unlock-your-courage.html', '/shop/new/women', '/shop/women', '/shop/men/bags', '/shop/collection', '/shop/gift/women/bestseller', '/shop/coachworld', '/shop/coachreloved/coach-reloved']
Reached the end of the page and no product tiles were found: /feature/unlock-your-courage.html
Element with href /shop/new/women not clickable
Link:
/shop/women
Link:
/shop/men/bags
Link:
/shop/collection
Link:
/shop/gift/women/bestseller
Reached the end of the page and no product tiles were found: /shop/coachworld
Element with href /shop/coachreloved/coach-reloved not clickable
Если вы посмотрите на выходные данные, то в первой строке выводятся все категории навигации, доступные на сайте. После этого скрипт посещает все URL-адреса в этом массиве и может щелкнуть все URL-адреса, кроме второго и восьмого.
К вашему сведению, первая и седьмая категории не содержат ни одной плитки продукта на этой странице. В остальном все ссылки доступны для кликов.
Нажатие на каждую категорию и перебор цикла осуществляется внутри класса WebScraper.
Шаги решения:
Я попробовал добавить time.sleep()< /strong> между действиями, но это все равно не работает. Я также добавил шаг, на котором он делает снимок экрана при возникновении исключения тайм-аута. Я вижу, что категория видна на экране, но по-прежнему недоступна для кликов.
Я прилагаю скриншот вывода на терминале.

Я прикрепляю свой код ниже:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import pandas as pd
import time
import re
import os
import shutil
import datetime
import openpyxl
import chromedriver_autoinstaller
from openpyxl import Workbook
from openpyxl.styles import PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows
#custom_path = r"c:\Users\DELL\Documents\Self_Project" # Define the custom path where you want ChromeDriver to be installed
#temp_path=chromedriver_autoinstaller.install() # Installs the ChromeDriver to a temporary directory and returns the path to that directory.
#print("Temporary path",temp_path)
#final_path = os.path.join(custom_path, "chromedriver.exe") # constructs and stores the full path to the ChromeDriver executable in the custom directory.
#shutil.move(temp_path, final_path) # Moves the ChromeDriver executable from the temporary directory to the custom directory.
#print("ChromeDriver installed at:", final_path)
date_time = datetime.datetime.now().strftime("%m%d%Y_%H%M%S")
file_name = f'CRTL_JP_staging_products_data_{date_time}.xlsx'
products_summary = []
max_count_of_products=20
def scroll_and_click_view_more(driver,href):
flag=False
last_height = driver.execute_script("return window.pageYOffset + window.innerHeight")
while True:
try:
driver.execute_script("window.scrollBy(0, 800);")
time.sleep(4)
new_height1 = driver.execute_script("return window.pageYOffset + window.innerHeight")
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.product-tile')))
except Exception as e:
new_height = driver.execute_script("return window.pageYOffset + window.innerHeight")
if new_height1 == last_height and flag==False:
print("Reached the end of the page and no product tiles were found: ",href)
return "No product tiles found"
else:
last_height = new_height
continue
div_count = 0
flag=True
#while div_count >= 0:
response = driver.page_source
soup = BeautifulSoup(response, 'html.parser')
div_elements = soup.find_all('div', class_ = 'product-tile')
div_count = len(div_elements)
if(div_count > max_count_of_products):
return(driver.page_source)
driver.execute_script("window.scrollBy(0, 300);")
time.sleep(3)
new_height = driver.execute_script("return window.pageYOffset + window.innerHeight")
#print(new_height)
if new_height == last_height:
print("Reached the end of the page: ",href)
return("Reached the end of the page.")
break
else:
last_height = new_height
except Exception as e:
print(e)
break
def prod_vitals(soup,title,url):
count_of_items=1
products_data = [] # Array to store all product data for our excel sheet
for div in soup.find_all('div', class_ = 'product-tile'): # Iterate over each individual product-tile div tag
if count_of_items
Подробнее здесь: https://stackoverflow.com/questions/790 ... ion-script