def __init__(self, anio=None, mes=None, dia=None, strFile=None, fechaIni=None, fechaFin=None, *args, **kwargs): flgParametrosMal = True # Con esto nos aseguramos que estamos metiendo bien los parámetros y no los mezclamos if ((anio != None and mes != None and fechaIni == None and fechaFin == None) or (anio == None and mes == None and dia == None and fechaIni != None and fechaFin != None)): flgParametrosMal = False if flgParametrosMal == True: self.logger.error( "\x1b[1;31m" + "\nError en los parámetros, pruebe: \n\t" + "scrapy crawl <SPIDER> -a anio=YYYY -a mes=MM [dia=dd strFile=str]\n" + "o bien: \n\t" + 'scrapy crawl <SPIDER> -a fechaIni="dd-MM-YYYY" -a fechaFin="dd-MM-YYYY"' + "\033[0;m") self.start_urls = [] self.strFile = "" else: self.periodico = Periodico(periodico="EL_MUNDO", anio=anio, mes=mes, dia=dia, fechaIni=fechaIni, fechaFin=fechaFin) if strFile == None: self.start_urls, self.strFile = self.periodico.crea_StartUrls() else: self.start_urls, _ = self.periodico.crea_StartUrls() self.strFile = strFile super(Spider_ElMundo, self).__init__(*args, **kwargs)
class Spider_ElMundo(CrawlSpider): name = 'Spider_ElMundo' newsCount = 0 allowed_domains = ['www.elmundo.es'] rules = (Rule(LinkExtractor( allow=(), restrict_xpaths='//header[contains(@class,"head")]/a', deny=([ "[A-Za-z-0-9]*/en-directo", "papel", "album", "loc", "metropoli", "blogs" ])), callback='parse_item', follow=False), ) def __init__(self, anio=None, mes=None, dia=None, strFile=None, fechaIni=None, fechaFin=None, *args, **kwargs): flgParametrosMal = True # Con esto nos aseguramos que estamos metiendo bien los parámetros y no los mezclamos if ((anio != None and mes != None and fechaIni == None and fechaFin == None) or (anio == None and mes == None and dia == None and fechaIni != None and fechaFin != None)): flgParametrosMal = False if flgParametrosMal == True: self.logger.error( "\x1b[1;31m" + "\nError en los parámetros, pruebe: \n\t" + "scrapy crawl <SPIDER> -a anio=YYYY -a mes=MM [dia=dd strFile=str]\n" + "o bien: \n\t" + 'scrapy crawl <SPIDER> -a fechaIni="dd-MM-YYYY" -a fechaFin="dd-MM-YYYY"' + "\033[0;m") self.start_urls = [] self.strFile = "" else: self.periodico = Periodico(periodico="EL_MUNDO", anio=anio, mes=mes, dia=dia, fechaIni=fechaIni, fechaFin=fechaFin) if strFile == None: self.start_urls, self.strFile = self.periodico.crea_StartUrls() else: self.start_urls, _ = self.periodico.crea_StartUrls() self.strFile = strFile super(Spider_ElMundo, self).__init__(*args, **kwargs) def parse_item(self, response): # Comprobamos que la noticia esté entera y no tengamos # que estar registrados para verla completa if len(response.xpath(XPATH_NOTICIAS_REGISTRO).extract()) != 0: return item = item_Noticia() # TITULAR item['titularNoticia'] = response.xpath( XPATH_NOTICIA_TITULO).extract()[0] # LINK item['linkNoticia'] = response.url # KEYWORDS # Las keywords se ponen con el formato "A, B, C" # Keywords del tipo "A/B" -> ["A", "B"] # Keywords del tipo "A - B" -> ["A", "B"] # Keywords del tipo "A y B" -> ["A", "B"] item['keywordsNoticia'] = [] keywords = response.xpath(XPATH_NOTICIA_KEYWORDS).extract()[0].split( ",") for keyword in keywords: if keyword == "": continue elif "/" not in keyword and " - " not in keyword and " y " not in keyword: item['keywordsNoticia'].append(keyword.strip()) else: if "/" in keyword: lkeyword = keyword.split("/") elif " - " in keyword: lkeyword = keyword.split(" - ") elif " y " in keyword: lkeyword = keyword.split(" y ") for k in lkeyword: item['keywordsNoticia'].append(k.strip()) # DESCRIPCIÓN # Alguna noticia puede no tener resumen item['resumenNoticia'] = response.xpath( XPATH_NOTICIA_RESUMEN).extract() if not item['resumenNoticia']: item['resumenNoticia'] = "" # AUTORES # Lo obtenemos del <body> y si hay, está en tags separados # Si no hay autor, ponemos EL_MUNDO como default item['autorNoticia'] = [] autores = response.xpath(XPATH_NOTICIA_AUTORES).extract() if not autores: item['autorNoticia'] = ["EL_MUNDO"] else: for autor in autores: item['autorNoticia'].append(autor) # LOCALIZACIONES # Lo obtenemos del <body> y si hay, está en tags separados item['localizacionNoticia'] = [] localizaciones = response.xpath(XPATH_NOTICIA_LOCALIZACIONES).extract() for localizacion in localizaciones: item['localizacionNoticia'].append(localizacion) # FECHA # Se encuentra en el interior de la noticia como "YYYY-MM-ddThh:mm:ssZ" item['fechaPublicacionNoticia'] = response.xpath( XPATH_NOTICIA_FECHA_PUBLICACION).extract()[0] # PIE DE FOTO # Algunas noticias no tienen foto listPartesPie = response.xpath(XPATH_NOTICIA_FOTO_PIE).extract() pieDeFoto = "".join(listPartesPie) pieDeFoto = TAG_RE.sub('', pieDeFoto) pieDeFoto = pieDeFoto.replace("\n", "") item['pieDeFotoNoticia'] = pieDeFoto # FIRMA DE FOTO # Algunas fotos no tienen firma try: item['firmaDeFotoNoticia'] = response.xpath( XPATH_NOTICIA_FOTO_FIRMA).extract()[0].strip() except: item['firmaDeFotoNoticia'] = "" # CUERPO listPartesCuerpo = response.xpath(XPATH_NOTICIA_CUERPO).extract() cuerpoNoticia = "".join(listPartesCuerpo) cuerpoNoticia = TAG_RE.sub('', cuerpoNoticia) item['cuerpoNoticia'] = cuerpoNoticia # TAGS item['tagsNoticia'] = [] tagsNoticia = response.xpath(XPATH_NOTICIA_TAGS).extract() for tag in tagsNoticia: item['tagsNoticia'].append(tag) # ZONA DE TEST #self.newsCount+=1 if self.newsCount > 10: raise CloseSpider("\x1b[1;33m" + "Noticias de test recogidas" + "\033[0;m") yield item
class Spider_ElPais(CrawlSpider): name = 'Spider_ElPais' newsCount = 0 allowed_domains = ['elpais.com'] rules = (Rule(LinkExtractor( allow=(), restrict_xpaths='//h2[@class="articulo-titulo"]/a', deny_domains=[ 'motor.elpais.com', 'verne.elpais.com', 'colecciones.elpais.com', 'aprendemosjuntos.elpais.com', 'librotea.elpais.com', 'descuentos.elpais.com', 'elcomidista.elpais.com', 'smoda.elpais.com', 'suscripciones.elpais.com', 'elfuturoesapasionante.elpais.com', 'escuela.elpais.com', 'cat.elpais.com', 'plus.elpais.com', 'elviajero.elpais.com', 'retina.elpais.com', 'cincodias.elpais.com' ], deny=["especiales", "tematicos"]), callback='parse_item', follow=False), ) def __init__(self, anio=None, mes=None, dia=None, strFile=None, fechaIni=None, fechaFin=None, *args, **kwargs): flgParametrosMal = True # Con esto nos aseguramos que estamos metiendo bien los parámetros y no los mezclamos if ((anio != None and mes != None and fechaIni == None and fechaFin == None) or (anio == None and mes == None and dia == None and fechaIni != None and fechaFin != None)): flgParametrosMal = False if flgParametrosMal == True: self.logger.error( "\x1b[1;31m" + "\nError en los parámetros, pruebe: \n\t" + "scrapy crawl <SPIDER> -a anio=YYYY -a mes=MM [dia=dd strFile=str]\n" + "o bien: \n\t" + 'scrapy crawl <SPIDER> -a fechaIni="dd-MM-YYYY" -a fechaFin="dd-MM-YYYY"' + "\033[0;m") self.start_urls = [] self.strFile = "" else: self.periodico = Periodico(periodico="EL_PAIS", anio=anio, mes=mes, dia=dia, fechaIni=fechaIni, fechaFin=fechaFin) if strFile == None: self.start_urls, self.strFile = self.periodico.crea_StartUrls() else: self.start_urls, _ = self.periodico.crea_StartUrls() self.strFile = strFile super(Spider_ElPais, self).__init__(*args, **kwargs) def parse_item(self, response): # Comprobamos que la noticia esté entera y no tengamos # que estar registrados para verla completa if len(response.xpath(XPATH_NOTICIAS_REGISTRO).extract()) != 0: return item = item_Noticia() # TITULAR item['titularNoticia'] = response.xpath( XPATH_NOTICIA_TITULO).extract()[0] # LINK item['linkNoticia'] = response.url # KEYWORDS # Las keywords se ponen con el formato "A, B, C" item['keywordsNoticia'] = [] keywords = response.xpath(XPATH_NOTICIA_KEYWORDS).extract()[0].split( ",") for keyword in keywords: item['keywordsNoticia'].append(keyword.strip()) # DESCRIPCIÓN item['resumenNoticia'] = response.xpath( XPATH_NOTICIA_RESUMEN).extract()[0] # AUTORES # Los autores se muestran como "A, B, C" item['autorNoticia'] = [] autores = response.xpath(XPATH_NOTICIA_AUTORES).extract()[0].split(",") for autor in autores: item['autorNoticia'].append(autor.strip()) # LOCALIZACIONES # Se muestran en el formato "Madrid\n/ \nFrancia" try: strLocalizacion = response.xpath( XPATH_NOTICIA_LOCALIZACIONES).extract()[0] strLocalizacion = strLocalizacion.replace("\n", "") localizaciones = strLocalizacion.split("/ ") item['localizacionNoticia'] = [] for localizacion in localizaciones: item['localizacionNoticia'].append(localizacion) except: item['localizacionNoticia'] = [] # FECHA # Se encuentra en el interior de la noticia como "YYYY-MM-ddThh:mm:ss+01:00" # Tenemos que pasar de la fecha en ISO 8601 a RFC 3339 strFecha = response.xpath(XPATH_NOTICIA_FECHA_PUBLICACION).extract()[0] datetime = dateutil.parser.parse(strFecha).astimezone( pytz.timezone('UTC')) item['fechaPublicacionNoticia'] = datetime.strftime( "%Y-%m-%dT%H:%M:%SZ") # PIE DE FOTO try: item['pieDeFotoNoticia'] = response.xpath( XPATH_NOTICIA_FOTO_PIE).extract()[0] except: item['pieDeFotoNoticia'] = "" # FIRMA DE FOTO try: item['firmaDeFotoNoticia'] = response.xpath( XPATH_NOTICIA_FOTO_FIRMA).extract()[0] except: item['firmaDeFotoNoticia'] = "" # CUERPO listPartesCuerpo = response.xpath(XPATH_NOTICIA_CUERPO).extract() cuerpoNoticia = "".join(listPartesCuerpo) cuerpoNoticia = TAG_RE.sub('', cuerpoNoticia) item['cuerpoNoticia'] = cuerpoNoticia # TAGS item['tagsNoticia'] = [] tagsNoticia = response.xpath(XPATH_NOTICIA_TAGS).extract() for tag in tagsNoticia: item['tagsNoticia'].append(tag) # ZONA DE TEST #self.newsCount+=1 if self.newsCount > 10: raise CloseSpider("\x1b[1;33m" + "Noticias de test recogidas" + "\033[0;m") yield item
class Spider_ElConfidencial(CrawlSpider): name = 'Spider_ElConfidencial' newsCount = 0 allowed_domains = ['www.elconfidencial.com'] rules = (Rule(LinkExtractor( allow=(), restrict_xpaths='//h3[@typetitle="tsmall" or @typetitle="tnormal"]/a', deny=(["fichas"])), callback='parse_item', follow=False), ) def __init__(self, anio=None, mes=None, dia=None, strFile=None, fechaIni=None, fechaFin=None, *args, **kwargs): flgParametrosMal = True # Con esto nos aseguramos que estamos metiendo bien los parámetros y no los mezclamos if ((anio != None and mes != None and fechaIni == None and fechaFin == None) or (anio == None and mes == None and dia == None and fechaIni != None and fechaFin != None)): flgParametrosMal = False if flgParametrosMal == True: self.logger.error( "\x1b[1;31m" + "\nError en los parámetros, pruebe: \n\t" + "scrapy crawl <SPIDER> -a anio=YYYY -a mes=MM [dia=dd strFile=str]\n" + "o bien: \n\t" + 'scrapy crawl <SPIDER> -a fechaIni="dd-MM-YYYY" -a fechaFin="dd-MM-YYYY"' + "\033[0;m") self.start_urls = [] self.strFile = "" else: self.periodico = Periodico(periodico="EL_CONFIDENCIAL", anio=anio, mes=mes, dia=dia, fechaIni=fechaIni, fechaFin=fechaFin) if strFile == None: self.start_urls, self.strFile = self.periodico.crea_StartUrls() else: self.start_urls, _ = self.periodico.crea_StartUrls() self.strFile = strFile super(Spider_ElConfidencial, self).__init__(*args, **kwargs) def parse_item(self, response): item = item_Noticia() # TITULAR item['titularNoticia'] = response.xpath( XPATH_NOTICIA_TITULO).extract()[0] # LINK item['linkNoticia'] = response.url # KEYWORDS # Las keywords se ponen con el formato "A,B,C" item['keywordsNoticia'] = [] try: keywords = response.xpath( XPATH_NOTICIA_KEYWORDS).extract()[0].split(",") for keyword in keywords: item['keywordsNoticia'].append(keyword.strip()) except: item['keywordsNoticia'] = [] # DESCRIPCIÓN item['resumenNoticia'] = response.xpath( XPATH_NOTICIA_RESUMEN).extract() # AUTORES # Los autores, en el caso de haber más de uno, se posicionan en tags diferentes item['autorNoticia'] = [] autores = response.xpath(XPATH_NOTICIA_AUTORES).extract() for autor in autores: item['autorNoticia'].append(autor.strip()) # LOCALIZACIONES # No se muestran en la noticia. Hay veces que aparece con el autor, pero aparecen de esta manera: # Juan Pérez. Barcelona # Lo cuál interfiere con los nombres de autores los cuales firmán con las iniciales de su nombre y apellidos. # Ejemplo: J. P. item['localizacionNoticia'] = [] # FECHA # Se encuentra en el interior de la noticia como "YYYY-MM-ddThh:mm:ssZ" try: item['fechaPublicacionNoticia'] = response.xpath( XPATH_NOTICIA_FECHA_PUBLICACION).extract()[0] except: return # PIE DE FOTO # 3 casos: 1) No foto. 2) Pie de foto pero NO firma. 3) Pie y firma de foto try: pieDeFoto = response.xpath( XPATH_NOTICIA_FOTO_PIE).extract()[0].strip() item['pieDeFotoNoticia'] = pieDeFoto.split("(")[0].strip() except: item['pieDeFotoNoticia'] = "" item['firmaDeFotoNoticia'] = "" # FIRMA DE FOTO try: item['firmaDeFotoNoticia'] = pieDeFoto.split("(")[1].split( ")")[0].strip() except: item['firmaDeFotoNoticia'] = "" # CUERPO listPartesCuerpo = response.xpath(XPATH_NOTICIA_CUERPO).extract() cuerpoNoticia = "".join(listPartesCuerpo) cuerpoNoticia = TAG_RE.sub('', cuerpoNoticia) item['cuerpoNoticia'] = cuerpoNoticia # TAGS item['tagsNoticia'] = [] tagsNoticia = response.xpath(XPATH_NOTICIA_TAGS).extract() for tag in tagsNoticia: item['tagsNoticia'].append(tag) # ZONA DE TEST #self.newsCount+=1 if self.newsCount > 10: raise CloseSpider("\x1b[1;33m" + "Noticias de test recogidas" + "\033[0;m") yield item
class Spider_Marca(CrawlSpider): name = 'Spider_Marca' newsCount = 0 allowed_domains = ['marca.com'] rules = (Rule(LinkExtractor(allow=(), restrict_xpaths='//h2/a', deny_domains=[ 'videos.marca.com', 'plus.marca.com', 'noesfutboleslaliga.marca.com', 'cuidateplus.marca.com', 'haranhistoria.marca.com', 'youtube.com' ], deny=["directo", "marcador", "album", "blogs"]), callback='parse_item', follow=False), ) def __init__(self, anio=None, mes=None, dia=None, strFile=None, fechaIni=None, fechaFin=None, *args, **kwargs): flgParametrosMal = True # Con esto nos aseguramos que estamos metiendo bien los parámetros y no los mezclamos if ((anio != None and mes != None and fechaIni == None and fechaFin == None) or (anio == None and mes == None and dia == None and fechaIni != None and fechaFin != None)): flgParametrosMal = False if flgParametrosMal == True: self.logger.error( "\x1b[1;31m" + "\nError en los parámetros, pruebe: \n\t" + "scrapy crawl <SPIDER> -a anio=YYYY -a mes=MM [dia=dd strFile=str]\n" + "o bien: \n\t" + 'scrapy crawl <SPIDER> -a fechaIni="dd-MM-YYYY" -a fechaFin="dd-MM-YYYY"' + "\033[0;m") self.start_urls = [] self.strFile = "" else: self.periodico = Periodico(periodico="MARCA", anio=anio, mes=mes, dia=dia, fechaIni=fechaIni, fechaFin=fechaFin) if strFile == None: self.start_urls, self.strFile = self.periodico.crea_StartUrls() else: self.start_urls, _ = self.periodico.crea_StartUrls() self.strFile = strFile super(Spider_Marca, self).__init__(*args, **kwargs) def parse_item(self, response): item = item_Noticia() # TITULAR item['titularNoticia'] = response.xpath( XPATH_NOTICIA_TITULO).extract()[0] # LINK item['linkNoticia'] = response.url # KEYWORDS # Las keywords se ponen con el formato ",A,B,C" try: keywords = response.xpath( XPATH_NOTICIA_KEYWORDS).extract()[0].split(",") for keyword in keywords: item['keywordsNoticia'].append( keyword.strip()) if keyword != "" else None except: item['keywordsNoticia'] = [] # DESCRIPCIÓN # Puede no haber un resumen de la noticia try: item['resumenNoticia'] = response.xpath( XPATH_NOTICIA_RESUMEN).extract()[0] except: item['resumenNoticia'] = "" # AUTORES # Los autores se muestran como "A, B, C" item['autorNoticia'] = [] autores = response.xpath(XPATH_NOTICIA_AUTORES).extract() if not autores: item['autorNoticia'] = [] else: for autor in autores: item['autorNoticia'].append(autor.strip()) # LOCALIZACIONES # No siempre está la localización de la noticia try: item['localizacionNoticia'] = response.xpath( XPATH_NOTICIA_LOCALIZACIONES).extract()[0] except: item['localizacionNoticia'] = "" # FECHA # Se encuentra en el interior de la noticia como "YYYY-MM-ddThh:mm:ssZ" item['fechaPublicacionNoticia'] = response.xpath( XPATH_NOTICIA_FECHA_PUBLICACION).extract()[0] # PIE DE FOTO try: item['pieDeFotoNoticia'] = response.xpath( XPATH_NOTICIA_FOTO_PIE).extract()[0].strip().replace("\n", "") except: item['pieDeFotoNoticia'] = "" # FIRMA DE FOTO try: item['firmaDeFotoNoticia'] = response.xpath( XPATH_NOTICIA_FOTO_FIRMA).extract()[0].strip().replace( "\n", "") except: item['firmaDeFotoNoticia'] = "" # CUERPO # Perdemos los entre títulos pero así queda de mejor manera la información listPartesCuerpo = response.xpath(XPATH_NOTICIA_CUERPO).extract() cuerpoNoticia = "".join(listPartesCuerpo) cuerpoNoticia = TAG_RE.sub('', cuerpoNoticia) item['cuerpoNoticia'] = cuerpoNoticia # TAGS item['tagsNoticia'] = [] tagsNoticia = response.xpath(XPATH_NOTICIA_TAGS).extract() for tag in tagsNoticia: item['tagsNoticia'].append(tag) # ZONA DE TEST #self.newsCount+=1 if self.newsCount > 10: raise CloseSpider("\x1b[1;33m" + "Noticias de test recogidas" + "\033[0;m") yield item