У меня вопрос по поводу кнопки «Загрузить еще». На странице необходимо составить такую «дорожную карту»: перейти на страницу поиска, «посмотреть» товары один за другим, нажать на них и затем вернуться на страницу поиска. Мой подход заключался в том, чтобы нажимать кнопку «Загрузить еще», пока она больше не исчезнет, а затем удалить ее. Но когда мы переходим к Drive.back(), это уже не та же страница, и автоматическая прокрутка, которую я делал, потерялась, она вообще не отображает все продукты. Кроме того, при ручном подходе я увидел, что если я, например, нажму кнопку «Загрузить еще», выберу один продукт на этой «другой странице», нажму на него, то, когда я вернусь на страницу поиска, он не вернется. на предыдущую страницу, и мне нужно еще раз нажать кнопку «Загрузить еще». Я думал, что один из подходов заключался в том, чтобы получить его с помощью JSON, но проблема в том, что в моем коде пользователь будет настраивать поиск, поэтому это будут разные страницы, а не одинаковые. Таким образом, URL-адрес, указывающий на json, всегда будет меняться. Как это сделать? В любом случае, вот код:
def extrai_dados_prodirectsports():
print("entrou")
url_linha = "https://www.prodirectsport.com/soccer/l/adults/departments-boots/activity-football/brand-adidas/silo-predator/"
data_planilha = []
data_pdf = []
tamanhos = []
cotacao_libra() # Supondo que essa função já esteja definida
i = 0
driver.get(url_linha)
#Cookies
WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH,"//button[@title='Accept all cookies']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,"//div[@id='zonos']")))
botao_close = driver.find_element(By.XPATH, "//a[@class = 'z-close']")
driver.execute_script("arguments[0].click();",botao_close)
#WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='global-popup']")))
botao = driver.find_element(By.XPATH,"//button[@aria-label='Close']")
driver.execute_script("arguments[0].click();",botao)
#driver.implicitly_wait(500000)
df_planilha = pd.DataFrame(columns=COLUNAS_PLANILHA)
#pdf = FPDF()
#pdf.add_page()
#pdf.set_font('Arial', 'B', 12)
x = 0
driver.maximize_window()
produtos_lista = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class = 'product-listing__grid']//div[@class = '_root_129ai_6 product-listing__grid-item']/a")))
produtos_container = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@class = 'product-listing__grid']")))#driver.execute_script("arguments[0].scrollIntoView();", produtos_lista)
while True:
try:
# Reencontrar o botão dentro do loop para evitar stale element
botao_vermais = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, "//div[@class='product-listing__view-more']/button"))
)
if botao_vermais.is_displayed():
driver.execute_script("arguments[0].scrollIntoView();", botao_vermais)
driver.execute_script("arguments[0].click();", botao_vermais)
x += 1
print(x)
else:
driver.execute_script("arguments[0].scrollIntoView();", produto_container)
break # Sai do loop se o botão não for mais exibido
except StaleElementReferenceException:
print("Elemento 'Ver mais' tornou-se stale, reencontrando o botão...")
continue # Tenta novamente o loop
except TimeoutException:
print("Tempo esgotado esperando o botão 'Ver mais'.")
break
pagina_atual = driver.current_url
for index, value in enumerate(produtos_lista):
driver.get(pagina_atual)
produtos_lista = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class = 'product-listing__grid']//div[@class = '_root_129ai_6 product-listing__grid-item']/a")))
driver.execute_script("arguments[0].scrollIntoView();", produtos_lista[index])
time.sleep(10)
driver.save_screenshot("janela.png")
imagem_element = WebDriverWait(driver, 50).until(EC.presence_of_element_located((By.TAG_NAME, "img")))
imagem = imagem_element.get_attribute("src")
i += 1
print(i)
#actions.move_to_element(produtos_lista[index]).perform()
driver.execute_script("arguments[0].click();", produtos_lista[index])
time.sleep(10)
driver.save_screenshot("projetoecommerce/screenshots_produtos/prodirectsports/" + str(i) +".png")
nome_produto = WebDriverWait(driver, 1000).until(EC.visibility_of_element_located((By.CLASS_NAME, "ml-meta__title"))).text
print(nome_produto)
preco = WebDriverWait(driver, 1000).until(EC.visibility_of_element_located((By.CLASS_NAME, "ml-prices__price"))).text
preco = re.sub("£", "", preco)
preco_produto = float(preco)
print(preco_produto)
codigo_produto = driver.current_url.split('-')[-1]
print(codigo_produto)
lista_tamanhos = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CLASS_NAME, "ml-size__sizes")))
if lista_tamanhos:
driver.execute_script("arguments[0].scrollIntoView();", lista_tamanhos)
for tamanho in lista_tamanhos.find_elements(By.XPATH, "//button[@class='ml-size__size qa-size-item']"):
tamanho_produto = tamanho.text
tamanhos.append(tamanho_produto)
if "-" in tamanho.text:
tamanho_produto = tamanho.text.split('-')[0]
tamanhos.append(tamanho_produto)
elif "(" in tamanho.text:
tamanho_produto = tamanho.text.split('(')[0]
tamanhos.append(tamanho_produto)
else:
tamanho_produto = ""
tamanhos.append(tamanho_produto)
print(tamanhos)
preco_reais = calcula_preco_reais(preco_produto) # Função precisa estar definida
preco_venda = calcula_preco_venda(preco_produto) # Função precisa estar definida
data_planilha.append({
'Photo': imagem,
'Código': codigo_produto,
'Descrição': nome_produto,
'Compra': preco_reais,
'Venda': preco_venda,
'Tamanhos': tamanhos
})
driver.back()
#driver.execute_script("window.history.go(-1)")
time.sleep(5)
#driv
figura = gera_pdf(data_pdf)
df_planilha = pd.DataFrame(data_planilha)
df_planilha.to_excel(url_linha + "catalogo.xlsx")
Какой другой подход может быть для этого? Если я просматриваю продукт за продуктом, а затем нажимаю «Загрузить больше», когда возвращаюсь, все равно, если бы я вообще не нажимал на него, когда возвращаюсь на страницу поиска. Мне кажется, что очистка json будет лучшим подходом, но как я могу получить точный URL-адрес? на самом деле, url_line — это параметр метода, программа прочитает его из txt-файла. Я дал вам это проверить.
У меня вопрос по поводу кнопки «Загрузить еще». На странице необходимо составить такую «дорожную карту»: перейти на страницу поиска, «посмотреть» товары один за другим, нажать на них и затем вернуться на страницу поиска. Мой подход заключался в том, чтобы нажимать кнопку «Загрузить еще», пока она больше не исчезнет, а затем удалить ее. Но когда мы переходим к Drive.back(), это уже не та же страница, и автоматическая прокрутка, которую я делал, потерялась, она вообще не отображает все продукты. Кроме того, при ручном подходе я увидел, что если я, например, нажму кнопку «Загрузить еще», выберу один продукт на этой «другой странице», нажму на него, то, когда я вернусь на страницу поиска, он не вернется. на предыдущую страницу, и мне нужно еще раз нажать кнопку «Загрузить еще». Я думал, что один из подходов заключался в том, чтобы получить его с помощью JSON, но проблема в том, что в моем коде пользователь будет настраивать поиск, поэтому это будут разные страницы, а не одинаковые. Таким образом, URL-адрес, указывающий на json, всегда будет меняться. Как это сделать? В любом случае, вот код: [code] def extrai_dados_prodirectsports(): print("entrou") url_linha = "https://www.prodirectsport.com/soccer/l/adults/departments-boots/activity-football/brand-adidas/silo-predator/" data_planilha = [] data_pdf = [] tamanhos = []
cotacao_libra() # Supondo que essa função já esteja definida i = 0 driver.get(url_linha)
x = 0 driver.maximize_window() produtos_lista = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class = 'product-listing__grid']//div[@class = '_root_129ai_6 product-listing__grid-item']/a"))) produtos_container = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@class = 'product-listing__grid']")))#driver.execute_script("arguments[0].scrollIntoView();", produtos_lista) while True: try: # Reencontrar o botão dentro do loop para evitar stale element botao_vermais = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.XPATH, "//div[@class='product-listing__view-more']/button")) )
if botao_vermais.is_displayed(): driver.execute_script("arguments[0].scrollIntoView();", botao_vermais) driver.execute_script("arguments[0].click();", botao_vermais)
x += 1 print(x) else: driver.execute_script("arguments[0].scrollIntoView();", produto_container) break # Sai do loop se o botão não for mais exibido except StaleElementReferenceException: print("Elemento 'Ver mais' tornou-se stale, reencontrando o botão...") continue # Tenta novamente o loop except TimeoutException: print("Tempo esgotado esperando o botão 'Ver mais'.") break
#driv figura = gera_pdf(data_pdf) df_planilha = pd.DataFrame(data_planilha) df_planilha.to_excel(url_linha + "catalogo.xlsx")
[/code] Какой другой подход может быть для этого? Если я просматриваю продукт за продуктом, а затем нажимаю «Загрузить больше», когда возвращаюсь, все равно, если бы я вообще не нажимал на него, когда возвращаюсь на страницу поиска. Мне кажется, что очистка json будет лучшим подходом, но как я могу получить точный URL-адрес? на самом деле, url_line — это параметр метода, программа прочитает его из txt-файла. Я дал вам это проверить.