DEV Community

destre
destre

Posted on

Web Scraping con scrapy y regex

Visión General

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

Requirements

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

Primero crearemos el código base de la Spider

  • 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"
    • callback = 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

Enter fullscreen mode Exit fullscreen mode

Generar 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) 
Enter fullscreen mode Exit fullscreen mode

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

Utilizar Regex

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 variable de clase a nuestra clase PaginaDoceSpider

p = re.compile(r'https:\/\/w{3}\.[a-r1-2\.\/]+secciones')
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode

filtramos los links con un if y el patron generado 'p', luego los agregamos a la lista links

Nuestra clase final

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}
Enter fullscreen mode Exit fullscreen mode

Agregando settings especificos para la Spider

instanciamos un objeto process

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

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 user agents de la libreria scrapy-user-agents

Iniciamos el Scraping

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

process.crawl(PaginaDoceSpider)
process.start()
Enter fullscreen mode Exit fullscreen mode

Top comments (0)