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:
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
ylxml
. 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