2012-09-20 12 views
25

He escrito muchos raspadores, pero no estoy muy seguro de cómo manejar infinitos desplazadores. En estos días, la mayoría del sitio web, etc., Facebook, Pinterest tiene infinitos desplazadores.raspar sitios web con desplazamiento infinito

+2

Su mejor opción aquí es utilizar las API de ese sitio, que será, con mucho, la opción más fácil y confiable. Aparte de eso, vas a tener que procesar JavaScript, lo que básicamente significa ejecutar un navegador completo, tales bibliotecas sí existen. –

+0

suena como una simulación, ¿puede señalar algunos ejemplos de manejo de jscript –

Respuesta

24

Puede usar selenio para eliminar el infinito sitio web de desplazamiento como Twitter o Facebook.

Paso 1: Instalar selenio usando pip

pip install selenium 

Paso 2: usar el siguiente código para automatizar 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 + "https://stackoverflow.com/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: imprimir los datos si es necesario.

+0

¿El ciclo significa que nos desplazamos hacia abajo 100 veces? donde 100 es un número elegido al azar. ¿Está bien? –

+0

@satarupa Tiene razón el ciclo es desplazarse hacia abajo 100 veces –

20

La mayoría de los sitios que tienen desplazamiento infinito (como notas de Lattyware) también tienen una API adecuada, y es probable que te sirva mejor al usar esto en lugar de raspar.

Pero si debe raspar ...

Estos sitios están utilizando JavaScript para solicitar contenido adicional desde el sitio cuando llegue a la parte inferior 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 realizar inspeccionando la secuencia de comandos, utilizando la consola web de Firefox o usando un debug proxy.

Por ejemplo, abra la consola web de Firefox, apague todos los botones de filtro, excepto Net, y cargue el sitio que desea raspar. Verá todos los archivos a medida que se carguen. 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 obtenerla en su secuencia de comandos de Python.

+0

¿Podría dar un ejemplo concreto de cómo hacerlo? – tatsuhirosatou

+0

He agregado más detalles, ¡espero que ayude! – kindall

1

Encontrar la URL de la fuente Ajax será la mejor opción, pero puede ser engorroso para ciertos sitios. Alternativamente, puede usar un navegador sin cabeza como QWebKit desde PyQt y enviar eventos de teclado mientras lee los datos del árbol DOM. QWebKit tiene una API agradable y simple.

Cuestiones relacionadas