Skip to content

Instantly share code, notes, and snippets.

@Wesitos
Last active November 3, 2018 23:19
Show Gist options
  • Save Wesitos/056eec7a71ed41c48a755ed10fe844d0 to your computer and use it in GitHub Desktop.
Save Wesitos/056eec7a71ed41c48a755ed10fe844d0 to your computer and use it in GitHub Desktop.
Taller scraping
# -*- coding: utf-8 -*-
import scrapy
class PostulanteSpider(scrapy.Spider):
# El nombre del spider
# Es el nombre con el cual llamaremos a `scrapy crawl`
name = 'postulante'
# Las urls de inicio
start_urls = [
'http://unmsm.claro.net.pe/WebResultados20181Sab/A.html',
'http://unmsm.claro.net.pe/WebResultados20181Dom/A.html',
]
def parse(self, response):
'''Parsea la tabla de especialidades
La única data que recolectamos de esta pagina son los nombres de las
carreras (la cual la guardamos como metadata del spider)
'''
for link in response.css('table a'):
link_text = link.css('::text').extract_first()
link_url = link.css('::attr(href)').extract_first()
# response.follow permite construir una petición a partir de un
# link relativo
yield response.follow(
link_url,
# `meta` es un diccionario de metadata que el spider
# va a recordar cuando scrapee otras paginas
meta={'carrera': link_text},
# `callback` es la función que se encargará de parsear esta
# pagina
callback=self.parse_list
)
def parse_list(self, response):
'''Parsea una tabla de postulantes
Cada fila de la tabla es un postulante. Ademas, debemos
incluir la carrera (que guardamos previamente en la metadata del
spider)
'''
for row in response.css('tr')[1:]:
celdas = row.css("td::text").extract()
# Devolvemos el diccionario con la data de esta fila
yield {
'codigo': celdas[0],
'nombre': celdas[1],
'eap': celdas[2],
'puntaje': celdas[3],
'merito_eap': celdas[4],
'observacion': celdas[5],
# Agregamos el nombre de la carrera
'carrera': response.meta['carrera']
}
# Tambien extraemos los links de paginación
for link in response.css('center>a::attr(href)').extract():
# El spider conserva la metadata que le asignamos al inicio
yield response.follow(link)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment