No se puede raspar la etiqueta del lazo dinámico sin selenio

Así que quiero raspar un portal de noticias (enlace en mi código), pero no sólo estoy raspando el título y el artículo allí, quiero raspar el autor del artículo, fecha, etc. La mayoría funciona solo BeautifulSoup, pero no el comentario total dentro del artículo.

Así que este es mi código. La cadena que añadí en el enlace es hacer que la página muestre el artículo completo (si no me enfrentaré a la paginación, que es más tiempo consumido al raspar):

lnk = ('https://news.detik.com/berita/d-5297980/pemprov-dki-tegaskan-aturan-wfh-75-juga-berlaku-untuk-perusahaan-swasta')
lnk2 = lnk + '?single=1'
soup2 = BeautifulSoup(resp2, 'lxml')
element = soup2.find('span', text=re.compile('komentar')).text
print(element)
comment = element.text.rstrip(' komentar')

Y esto es parte de la página html Quiero raspar: enter image description here

Con mi código arriba puedo rasparlo, pero siempre resulta '0' incluso como la imagen anterior muestra '25'. Hasta ahora el problema que encontré es que debe estar usando el método 'espera' para que la página pueda cargar y el número verdadero puede ser raspado.

Ya he intentado usar Selenium WebDriverWait, este es el código:

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)
driver.get(lnk2)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")

html = driver.page_source
beau = BeautifulSoup(html.content, 'lxml')
element = beau.find_element_by_css_selector('a.komentar > span')
WebDriverWait(soup2, 10).until(lambda driver: element.text != '0 komentar')
comment = element.text.rstrip(' komentar')

Pero tal vez todos ustedes ya saben, Selenium la debilidad es realmente consumir tiempo. Mi rascador puede raspar alrededor de 200 página de artículo de noticias en portal de noticias arriba (con datos como la fecha, etc pero sin comentario total) con aproximadamente 0.25 sec/page, o 3 min/200 página. Pero si agrego eso WebDriverWait Para obtener el comentario total, necesitará aproximadamente 15 sec/page, o 49 min/200 página. Muy diferente.

Así que mi pregunta es que hay alguna manera de conseguir esa etiqueta dinámica sin Selenium, y no hacer que el tiempo de chatarra sea menos eficiente (quizás costará más tiempo, pero no como 0,25 segundos a 15 segundos)? O tal vez usar Selenium Pero ustedes saben cómo hacerlo más eficiente.

Cualquier ayuda sería apreciada.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarybard


2 Respuestas:

  • Parece que estás tratando de raspar el número de comentarios en un artículo de noticias, pero estás teniendo dificultades para obtener el número correcto sin usar Selenium. Una posible solución podría ser realizar una solicitud adicional al servidor para obtener la información de los comentarios de forma directa, en lugar de depender de la carga dinámica en la página.

    Aquí te dejo un ejemplo de cómo podrías hacerlo utilizando la biblioteca requests en lugar de Selenium:

    python
    import requests
    from bs4 import BeautifulSoup
    
    lnk = 'https://news.detik.com/berita/d-5297980/pemprov-dki-tegaskan-aturan-wfh-75-juga-berlaku-untuk-perusahaan-swasta'
    lnk2 = lnk + '?single=1'
    
    resp = requests.get(lnk2)
    soup = BeautifulSoup(resp.text, 'html.parser')
    comment_section = soup.find('div', class_='detail')
    
    

    Aquí debes inspeccionar el sitio web para encontrar la URL que devuelve la información de los comentarios

    Reemplaza 'URL_COMENTARIOS' con la URL correcta

    comentarios_resp = requests.get('URL_COMENTARIOS') comentarios_soup = BeautifulSoup(comentarios_resp.text, 'html.parser') cantidad_comentarios = comentarios_soup.find('span', class_='numero_comentarios').text print(cantidad_comentarios)

    En este ejemplo, necesitas inspeccionar el sitio web para encontrar la URL que devuelve la información de los comentarios y reemplazar 'URL_COMENTARIOS' con esa dirección. Esto puede ayudarte a obtener la información de los comentarios de forma más directa y sin depender de la carga dinámica en la página.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si necesitas más asistencia!

    Respondida el Dec 17, 2020 a las 16:32 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Obtener la etiqueta dinámica sin Selenium

    Es posible obtener la etiqueta dinámica sin Selenium utilizando bibliotecas como requests y lxml. Aquí tienes un ejemplo de cómo hacerlo:

    python
    import requests
    from lxml import html
    
    

    URL de la página web

    url = 'https://news.detik.com/berita/d-5297980/pemprov-dki-tegaskan-aturan-wfh-75-juga-berlaku-untuk-perusahaan-swasta'

    Enviar una solicitud GET a la URL

    response = requests.get(url)

    Analizar el HTML de la página

    tree = html.fromstring(response.content)

    Buscar el elemento que contiene el número de comentarios

    element = tree.xpath('//span[contains(@class, "komentar")]/text()')[0]

    Extraer el número de comentarios

    number_of_comments = element.strip(' komentar') print(number_of_comments)

    Este código envía una solicitud GET a la URL especificada y analiza el HTML de la página web. Luego, utiliza XPath para localizar el elemento que contiene el número de comentarios y extrae el valor del texto.

    Usar Selenium de manera más eficiente

    Si necesitas utilizar Selenium, hay varias formas de hacerlo más eficiente:

    Reduce el alcance de la búsqueda: Limita la búsqueda de elementos solo a las partes necesarias de la página. Esto reducirá el tiempo de carga y procesamiento. Usa el modo sin cabeza: Ejecuta el navegador Chrome sin una interfaz gráfica de usuario (GUI). Esto mejora significativamente la velocidad. Paraleliza las tareas: Utiliza múltiples instancias de Selenium para raspar diferentes páginas web simultáneamente. Optimiza el código: Asegúrate de que tu código esté bien escrito y evite cuellos de botella innecesarios.

    Ejemplo de uso de Selenium optimizado

    python
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    

    Configurar opciones de Chrome

    chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage')

    Crear un controlador de Chrome

    driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)

    Cargar la página web

    driver.get(url)

    Esperar a que se cargue la página

    wait = WebDriverWait(driver, 10) wait.until(lambda driver: driver.execute_script("return document.readyState") == "complete")

    Buscar el elemento que contiene el número de comentarios

    element = driver.find_element_by_css_selector('a.komentar > span')

    Extraer el número de comentarios

    number_of_comments = element.text.strip(' komentar')

    Cerrar el controlador de Chrome

    driver.quit() print(number_of_comments)

    Este código configura las opciones de Chrome para ejecutarse en modo sin cabeza y deshabilitar las funciones innecesarias. Utiliza WebDriverWait para esperar a que se cargue la página y luego localiza el elemento que contiene el número de comentarios. Finalmente, cierra el controlador de Chrome para liberar recursos.

    Respondida el Dec 17, 2020 a las 16:45 - por Gemini

    Votos positivos: 0 | Votos negativos: 0