tutorial - web scraping python examples
raspar sitios web con desplazamiento infinito (3)
He escrito muchos raspadores, pero no estoy realmente seguro de cómo manejar infinitos scrollers. En estos días la mayoría de sitios web, etc, Facebook, Pinterest tiene infinitos scrollers.
Encontrar la url de la fuente ajax será la mejor opción, pero puede ser complicado para ciertos sitios. Alternativamente, puede usar un navegador sin cabeza como QWebKit
de PyQt
y enviar eventos de teclado mientras lee los datos del árbol DOM. QWebKit
tiene una api agradable y simple.
La mayoría de los sitios que tienen desplazamiento infinito (como señala Lattyware) también tienen una API adecuada, y es probable que se te ofrezca un mejor servicio al usar esto en lugar de raspar.
Pero si tienes que raspar ...
Dichos sitios utilizan JavaScript para solicitar contenido adicional del sitio cuando llega al final de la página. Todo lo que necesita hacer es averiguar la URL de ese contenido adicional y puede recuperarlo. La identificación de la URL requerida se puede hacer inspeccionando el script, utilizando la consola web de Firefox o utilizando un proxy de depuración .
Por ejemplo, abra la consola web de Firefox, desactive todos los botones de filtro excepto Net y cargue el sitio que desea raspar. Verás todos los archivos a medida que se cargan. Desplácese por la página mientras ve la Consola web y verá las URL que se utilizan para las solicitudes adicionales. Luego, puede solicitar esa URL usted mismo y ver en qué formato están los datos (probablemente JSON) y obtenerlos en su script de Python.
Puede utilizar selenio para desechar el sitio web de desplazamiento infinito como twitter o facebook.
Paso 1: Instale Selenium usando pip
pip install selenium
Paso 2: use el siguiente código para automatizar el desplazamiento infinito y extraer el código fuente
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import sys
import unittest, time, re
class Sel(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "https://twitter.com"
self.verificationErrors = []
self.accept_next_alert = True
def test_sel(self):
driver = self.driver
delay = 3
driver.get(self.base_url + "/search?q=stckoverflow&src=typd")
driver.find_element_by_link_text("All").click()
for i in range(1,100):
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(4)
html_source = driver.page_source
data = html_source.encode(''utf-8'')
if __name__ == "__main__":
unittest.main()
Paso 3: Imprima los datos si es necesario.