Web Scraping con scrapy y regex

10458 단어 regexscrapyjsonspanish

비전 일반



En este post mostrare una manera de usar regex en un proyecto de scrapy coon CrawlerProcess, tomando como ejemplo el sitio web pagina12.com.ar

요구 사항



las librerias utilizadas en este proyecto son las siguientesScrapy==2.6.1
scrappy-user-agents=0.1.1

Primero crearemos el código 베이스 드 라 스파이더


  • empezamos creando la clase de nuestra spider llamada PaginaDoceSpider que hereda de scrapy.Spider
  • le damos el nombre 'pagina_doce'

  • como solo tenemos un url se la pasamos directamente a scrapy.Request como string y el callback lo dirigimos a nuestro segundo metodo parse_frontpage donde parseamos la pagina
  • URL = "https://www.pagina12.com.ar "
  • 콜백 = self.parse_frontpage
    por ahora en el metodo parse_frontpage que recibe una response solo creamos una lista vacia y con el cual generaremos un json con los valores de esa lista


  • #importamos los modulos necesarios
    import scrapy
    from scrapy.crawler import CrawlerProcess
    
    #creamos la clase de nuestra spider
    class PaginaDoceSpider(scrapy.Spider):
        name = 'pagina_doce'
        def start_requests(self):
            yield scrapy.Request(url="https://pagina12.com.ar",callback=self.parse_front_page)
        def parse_frontpage(self, response):
            links = []#aqui almacenaremos los selectores que agregaremos al json
            yield{'links': links} #generamos el json
    
    

    일반 Lista de Selectores



    con xpath hago scraping del sitio web y con la función extract() extraigo una lista de selectores para almacenarlos en la variable hrefs

    hrefs = response.xpath('//a[@class="p12-dropdown-item"]/@href').extract()
    for link in hrefs:
        print(link) 
    


    imprimo los 링크 del hrefs para ver que tengo mas anchors de los que queria y bueno como yo se la url de los 링크 que necesito puedo crear una expresión regular para filtrar los hrefs.

    활용 정규식



    Creamos una expresión regular, para utilizar en nuestra araña, a la funcion compile le pasamos una string con el regex anteponiendole una 'r', para indicar que es de forma recursiva.
    Dado que el url en el que necesitamos hacer match es https://www.pagina12.com.ar/secciones nos quedaría la expresion regular r'https:\/\/w{3}.[a-r1-2.\/]+secciones'
    generamos el patron y lo agregamos como 변수 de clase a nuestra clase PaginaDoceSpider

    p = re.compile(r'https:\/\/w{3}\.[a-r1-2\.\/]+secciones')
    


  • como los hrefs obtenidos son mas de los que queremos podemos especificar mas nuestro xpath o aplicar nuestra espresión regular

  • links = []
    for link in hrefs: # Parsear cada seccion
        if self.p.match(link):
            links.append(link)
    


    filtramos los 링크 con un if y el 후원자 'p', luego los agregamos a la lista 링크

    누에스트라 클라세 결승전




    class PaginaDoceSpider(scrapy.Spider):
        name = 'pagina_doce' # Nombre del spider
        p = re.compile(r'https:\/\/w{3}\.[a-r1-2\.\/]+secciones')
        def start_requests(self):
            yield scrapy.Request(url=get_proxy_url("https://pagina12.com.ar"), callback=self.parse_frontpage)
    
        def parse_frontpage(self, response):
            links = []
            hrefs = response.xpath('//a[@class="p12-dropdown-item"]/@href').extract()
            for link in hrefs: # Parsear cada seccion 
                if self.p.match(link):
                    links.append(link)
            yield{'links': links}
    


    Agregando settings especificos para la Spider



    instanciamos un objeto 프로세스

    process = CrawlerProcess(settings={
            'FEED_URI': 'pagina_doce.json',
            'FEED_FORMAT': 'json',
            'DOWNLOADER_MIDDLEWARES': {
                'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
                'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
            }
        })
    


    con FEED_URI especificamos ej archivo output que tendra nuestra araña, con FEED_FORMAT el tipo del archivo y DOWNLOADER_MIDDLEWARES es la configuración que tenemos que poner para nuestros 사용자 에이전트 de la libreria scrapy-user-agents

    이니시아모스 엘 스크래핑



    Tenemos que pasarle el nombre de nuestra clase Spider a la funcion crawl

    process.crawl(PaginaDoceSpider)
    process.start()
    

    좋은 웹페이지 즐겨찾기