Поиск селена и постоянное нажатие кнопки «Показать больше» в разделе :beforePython

Программы на Python
Ответить
Anonymous
 Поиск селена и постоянное нажатие кнопки «Показать больше» в разделе :before

Сообщение Anonymous »

Используя Python 3.12.3 и Selenium, я пытаюсь загрузить больше строк перед очисткой, и я очень новичок в этом процессе. В идеале все или хотя бы как можно больше, но в какой-то момент веб-сайт может автоматически ограничить общее количество отзывов на странице. Щелкнув вручную, я смог щелкнуть по нему еще как минимум 10 раз, и это не помогло. Любая помощь будет оценена по достоинству. Пожалуйста, дайте мне знать, если я могу предоставить какой-либо другой контекст.
Вот снимок экрана раздела, на который я хотел бы нажать: Кнопка «Показать больше»
Я постоянно не могу щелкните этот раздел, и я считаю, что это связано с псевдоэлементом :before, но, кроме того, существует несколько контейнеров div.Button__, из-за которых мои попытки щелкнуть обычно приводят к нажатию кнопок, которых я не хотел.
Вот скрипт, который я использую для получения отзывов, но он не может нажать кнопку «Загрузить больше строк», поэтому я надеюсь восполнить этот пробел с помощью селена:
import requests
import os
from bs4 import BeautifulSoup
import pandas as pd
import time
from selenium import webdriver
from IPython.display import display, Image

driver = webdriver.Chrome()
title = driver.title

for i in range(0,1000,100):
#McCurdy - I'm Glad my Mom Died
response = requests.get('https://www.goodreads.com/book/show/260 ... jE4NDI1%22}')
print(response.status_code)

time.sleep(6)

doc = BeautifulSoup(response.text, 'html.parser')

df = pd.DataFrame(columns=['ReviewDate','ReviewerName','Rating','ReviewText','ReviewerMeta'])

ratings = []

# Loop through all elements found
for tag in book_tags_:
# Get the aria-label attribute from the current element
aria_label = tag.get('aria-label')

# Check if aria-label is not None and contains the expected format
if aria_label and 'Rating ' in aria_label and ' out of 5' in aria_label:
# Split the aria-label to extract the desired text
rating_text = aria_label.split('Rating ')[1].split(' out of 5')[0]

# Append the rating_text to the list of ratings
ratings.append(rating_text)
else:
print(f"Skipping element with aria-label: {aria_label}")

# Create a dataframe from the list of ratings
df = pd.DataFrame({'Rating': ratings})

#This is repeated for additional fields

Вот мой код, который я использую для попытки нажатия кнопки:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, StaleElementReferenceException, ElementClickInterceptedException

# Initialize WebDriver
driver = webdriver.Chrome() # or another driver you're using

url = "https://www.goodreads.com/book/show/593 ... 5MjY2Mw%22}"

# Open the page
driver.get(url)
time.sleep(20)

def click_show_more():
while True:
try:
# Scroll to the bottom of the page to ensure button is in view
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Find the 'Show More' button
show_more_button = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.Divider.Divider--contents.Divider--largeMargin > div.Button__container'))
)

# Scroll the element into view
driver.execute_script("arguments[0].scrollIntoView(true);", show_more_button)

# Ensure the element is clickable
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.Divider.Divider--contents.Divider--largeMargin > div.Button__container')))

# Try to click the button using JavaScript if needed
driver.execute_script("arguments[0].click();", show_more_button)

# Optionally, wait for some condition after clicking, e.g., new content to load
WebDriverWait(driver, 10).until(EC.staleness_of(show_more_button))

except TimeoutException:
print("No more 'Show More' button found or timed out.")
break
except StaleElementReferenceException:
print("StaleElementReferenceException: Trying to find the button again.")
continue
except ElementClickInterceptedException:
print("ElementClickInterceptedException: Element is being obstructed.")
continue
except Exception as e:
print(f"Error clicking 'Show More' button: {e}")
break

# Remember to call your function
click_show_more()


Подробнее здесь: https://stackoverflow.com/questions/790 ... re-section
Ответить

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

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

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

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

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