Scraping de sitios web habilitados para Javascript usando Scrapy-Selenium

Scrapy-selenium es un middleware que se utiliza en web scraping. scrapy no admite el raspado de sitios modernos que usan marcos de javascript y esta es la razón por la que este middleware se usa con scrapy para raspar esos sitios modernos. Scrapy-selenium proporciona las funcionalidades de selenium que ayudan a trabajar con sitios web de javascript. Otras de las ventajas que ofrece este es el controlador por el cual también podemos ver lo que sucede detrás de escena. Como el selenium es una herramienta automatizada, también nos proporciona información sobre cómo tratar las etiquetas de entrada y raspar de acuerdo con lo que pasa en el campo de entrada. Pasar entradas en los campos de entrada se volvió más fácil al usar selenium. La primera vez que se introdujo scrapy-selenium fue en 2018 y es de código abierto. La alternativa a esto puede ser scrapy-splash

  • Instalar y configurar Scrapy –
    • Instalar scrapy
    • Correr
      scrapy startproject projectname  (projectname is name of project)
    • Ahora, vamos a correr,
      scrapy genspider spidername example.com

      (reemplace spidername con su nombre de araña preferido y example.com con el sitio web que desea raspar). Nota: Más tarde también se puede cambiar la URL, dentro de su araña scrapy.

      araña raspadora:

  • Integrando scrapy-selenium en proyecto scrapy:
    • Instale scrapy-selenium y agréguelo en su archivo settings.py

      # for firefox 
      from shutil import which
        
      SELENIUM_DRIVER_NAME = 'firefox'
      SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
      SELENIUM_DRIVER_ARGUMENTS=['-headless']  
        
      # for chrome driver 
      from shutil import which
        
      SELENIUM_DRIVER_NAME = 'chrome'
      SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
      SELENIUM_DRIVER_ARGUMENTS=['--headless']  
        
      DOWNLOADER_MIDDLEWARES = {
           'scrapy_selenium.SeleniumMiddleware': 800
           }
    • En este proyecto, se utiliza el controlador Chrome. El controlador Chrome debe descargarse de acuerdo con la versión del navegador Chrome. Vaya a la sección de ayuda en su navegador Chrome, luego haga clic en Google Chrome y verifique su versión. Descargue el controlador de Chrome del sitio web como se indica aquí Para descargar el controlador de Chrome
    • Dónde agregar chromedriver:
    • Adición en el archivo settings.py:
    • Cambio a realizar en el archivo spider:
    • Para ejecutar el proyecto:
      command- scrapy crawl spidername (scrapy crawl integratedspider in this project)
      
    • código de araña antes de scrapy-selenium:

      import scrapy
        
      class IntegratedspiderSpider(scrapy.Spider):
          name = 'integratedspider' # name of spider
          allowed_domains = ['example.com']
          start_urls = ['http://example.com/']
        
          def parse(self, response):
              pass
  • Campos importantes en scrapy-selenium:
    1. nombre- nombre es una variable donde se escribe el nombre de la araña y cada araña es reconocida
      por este nombre. El comando para ejecutar spider es scrapy crawl spidername (aquí spidername se
      refiere al nombre que se define en la araña).
    2. función start_requests- Las primeras requests a realizar se obtienen llamando al método start_requests() que genera Solicitud para la URL especificada en el campo url en yield SeleniumRequest y el método parse como función de devolución de llamada para las Requests
    3. url- Aquí se proporciona la url del sitio.
    4. captura de pantalla : puede tomar una captura de pantalla de una página web con el método get_screenshot_as_file() con como parámetro, el nombre del archivo y la captura de pantalla se guardarán en el proyecto.
    5. devolución de llamada : la función que se llamará con la respuesta de esta solicitud como su primer parámetro.
    6. dont_filter: indica que el planificador no debe filtrar esta solicitud. si se envía la misma URL para analizar, no dará excepción de la misma URL a la que ya se accedió. Lo que significa es que se puede acceder a la misma URL más de una vez. El valor predeterminado es falso.
    7. wait_time : Scrapy no espera una cantidad fija de tiempo entre requests. Pero por este campo podemos asignarlo durante la devolución de llamada.
  • Estructura general de la araña scrapy-selenium:

    import scrapy
    from scrapy_selenium import SeleniumRequest
      
    class IntegratedspiderSpider(scrapy.Spider):
        name = 'integratedspider'
        def start_requests(self):
            yield SeleniumRequest(
                url ="https://www.geeksforgeeks.org/",
                wait_time = 3,
                screenshot = True,
                callback = self.parse, 
                dont_filter = True    
            )
      
        def parse(self, response):
            pass
  • Proyecto de raspado con scrapy-selenium:
    raspado de nombres de cursos en línea del sitio geeksforgeeks usando scrapy-selenium

    Obteniendo la ruta X del elemento que necesitamos desechar:

    Código para desechar datos de cursos de Geeksforgeeks –

    import scrapy
    from scrapy_selenium import SeleniumRequest
       
    class IntegratedspiderSpider(scrapy.Spider):
        name = 'integratedspider'
        def start_requests(self):
            yield SeleniumRequest(
                url = "https://practice.geeksforgeeks.org/courses/online",
                wait_time = 3,
                screenshot = True,
                callback = self.parse,
                dont_filter = True
            )
       
        def parse(self, response):
            # courses make list of all items that came in this xpath
            # this xpath is of cards containing courses details
            courses = response.xpath('//*[@id ="active-courses-content"]/div/div/div')
       
            # course is each course in the courses list
            for course in courses:
                # xpath of course name is added in the course path
                # text() will scrape text from h4 tag that contains course name
                course_name = course.xpath('.//a/div[2]/div/div[2]/h4/text()').get()
       
                # course_name is a string containing \n and extra spaces
                # these \n and extra spaces are removed
       
                course_name = course_name.split('\n')[1]
                course_name = course_name.strip()
       
                   
                yield {
                    'course Name':course_name
                }

    Producción –

  • Enlace oficial repositorio de github

Publicación traducida automáticamente

Artículo escrito por Versus y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *