2011-07-13 42 views
25

Estoy usando Scrapy para rastrear una página web. Parte de la información que necesito solo aparece cuando hace clic en un botón determinado (por supuesto, también aparece en el código HTML después de hacer clic).Haga clic en un botón en Scrapy

Descubrí que Scrapy puede manejar formularios (como inicios de sesión) como se muestra en here. Pero el problema es que no hay forma de llenar, así que no es exactamente lo que necesito.

¿Cómo puedo simplemente hacer clic en un botón, que luego muestra la información que necesito?

¿Debo usar una biblioteca externa como mechanize o lxml?

Respuesta

27

Scrapy no puede interpretar javascript.

Si absolutamente debe interactuar con el javascript en la página, desea utilizar Selenium.

Si utiliza Scrapy, la solución al problema depende de lo que esté haciendo el botón.

Si solo muestra el contenido que estaba oculto anteriormente, puede eliminar los datos sin problemas, no importa que no aparezcan en el navegador, el HTML aún está allí.

Si está buscando el contenido dinámicamente mediante AJAX cuando se presiona el botón, lo mejor que puede hacer es ver la solicitud HTTP que se apaga al presionar el botón con una herramienta como Firebug. A continuación, puede solicitar los datos directamente desde esa URL.

¿Debo usar una biblioteca externa como mechanize o lxml?

Si desea interpretar javascript, sí necesita utilizar una biblioteca diferente, aunque ninguna de las dos se ajusta a la ley. Ninguno de ellos sabe nada sobre javascript. El selenio es el camino a seguir.

Si puede dar la URL de la página que está trabajando en el raspado puedo echarle un vistazo.

+2

No es una verdadera respuesta a mi pregunta real, sino que resuelve mi problema, no obstante. Seguí la solicitud del sitio en Chrome y encontré un enlace que muestra la información en una página separada. ¡Gracias! Pero no marcaré su respuesta como aceptada, porque otros realmente necesitarán hacer clic en un botón. – naeg

+0

@naeg Creo que la respuesta lo resume correctamente. No puede hacer clic en un botón con Scrapy. Puede enviar solicitudes y recibir una respuesta. Depende de usted interpretar la respuesta con un motor javascript por separado. – Medorator

+0

Como parece, Acorn editó su respuesta, y ahora es una respuesta completa y aceptada a mi pregunta :) – naeg

0

Para apropiada y completa el uso de JavaScript que necesita un motor de navegador completo y esto sólo es posible con Watir/WatiN/selenio, etc.

8

Selenium navegador proporcionar una solución muy agradable. Aquí hay un ejemplo (pip install -U selenium):

from selenium import webdriver 

class northshoreSpider(Spider): 
    name = 'xxx' 
    allowed_domains = ['www.example.org'] 
    start_urls = ['https://www.example.org'] 

    def __init__(self): 
     self.driver = webdriver.Firefox() 

    def parse(self,response): 
      self.driver.get('https://www.example.org/abc') 

      while True: 
       try: 
        next = self.driver.find_element_by_xpath('//*[@id="BTN_NEXT"]') 
        url = 'http://www.example.org/abcd' 
        yield Request(url,callback=self.parse2) 
        next.click() 
       except: 
        break 

      self.driver.close() 

    def parse2(self,response): 
     print 'you are here!' 
+0

Si cede la url después de hacer clic en el botón de selenio para parse2, ¿pasa el html con el contenido revelado por el clic? –

Cuestiones relacionadas