Как быть с кнопкой «Загрузить еще»?Python

Программы на Python
Ответить
Anonymous
 Как быть с кнопкой «Загрузить еще»?

Сообщение Anonymous »

У меня вопрос по поводу кнопки «Загрузить еще». На странице необходимо составить такую ​​«дорожную карту»: перейти на страницу поиска, «посмотреть» товары один за другим, нажать на них и затем вернуться на страницу поиска. Мой подход заключался в том, чтобы нажимать кнопку «Загрузить еще», пока она больше не исчезнет, ​​а затем удалить ее. Но когда мы переходим к 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-файла. Я дал вам это проверить.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ore-button
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»