Exemple #1
0
    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)
Exemple #2
0
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
Exemple #5
0
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