Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Scrapy

26/30
Recursos

Aportes 20

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Si no tienen Scrapy instalado pueden correr el siguiente comando en la consola para hacerlo:

pip install scrapy

Código de la clase + parse_nota

class Spider12(scrapy.Spider):
    name = 'spider12'
    # dominios a scrapear
    allowed_domains = ['pagina12.com.ar']  
    # formato de archivo de salida
    custom_settings = {'FEED_FORMAT':'json',   
                       'FEED_URI': 'resultados.json'}  
    
    # URLS a scrapear
    starts_urls = ['https://www.pagina12.com.ar/secciones/el-pais',
                  'https://www.pagina12.com.ar/secciones/economia',
                  'https://www.pagina12.com.ar/secciones/sociedad',
                  'https://www.pagina12.com.ar/suplementos/cultura-y-espectaculos',
                  'https://www.pagina12.com.ar/secciones/el-mundo',
                  'https://www.pagina12.com.ar/secciones/deportes',
                  'https://www.pagina12.com.ar/secciones/contratapa',
                  'https://www.pagina12.com.ar/secciones/audiovisuales']
    
    # Procesar la respuesta de cada solicitud
    def parse(self, response):
        
        # Articulo promocionado
        nota_promocionada = response.xpath('//div[@class="featured-article__container"]/h2/a/@href').get()
        if nota_promocionada is not None:
            # Pasar la respuesta a parse_nota
            yield response.follow(nota_promocionada, callback=self.parse_nota)
        
        # Listado de notas
        notas = response.path('//ul[@class="article-list"]//li//a/@href').getall()
        for nota in notas: 
            # Pasar la respuesta a parse_nota
            yield response.follow(nota, callback=self.parse_nota)
        
        
    def parse_nota(self, response):
        date = response.xpath('//div[@class="time"]/span/@datetime').get()
        prefix = response.xpath('//h2[@class="article-prefix"]/text()').get()
        title = response.xpath('//h1[@class="article-titles"]/text()').get()
        summary = response.xpath('//div[@class="article-summary"]/text()').get()
        content = response.xpath('//div[@class="article-text"]/text()').getall()
        image = response.xpath('//div[@class="article-main-media-image__container"]/img/@src').getall()[-1]

     

Pueden hacer un video explicando como usar Scrapy con web dinámicas, como el ej de Latam?

para instalar scrapy en anaconda o con pip

conda install -c conda-forge scrapy

pip install Scrapy

Como pagina12 ha cambiado un poco dejo lo que adicioné:

        # Artículo promocionado
        nota_promocionada = response.xpath('//section[@class="top-content"]//h2/a/@href').get()
        if nota_promocionada isnotNone:
            yield response.follow (nota_promocionada, callback=self.parse_nota)
        
        # notas secundarias
        notas_secundarias = response.xpath('//div[@class="articles-list is-grid-col2 grid-mobile-row"]//h3/a/@href').getall()
        for nota_sec in notas_secundarias:
            yield response.follow(nota_sec, callback=self.parse_nota)
        
        # Listado notas
        notas = response.xpath('//div[@class="article-list"]//h4/a/@href').getall()
        for nota in notas:
            yield response.follow(nota, callback=self.parse_nota)

Solucion reto:

        # Creamos un diccionario vacio para probarlo con la información
        ret_dict = {}
        
        titulo = response.xpath('//div[@class="article-titles"]/h1').get()
        if titulo:
            ret_dict['titulo'] = titulo.text
        else:
            ret_dict['titulo'] = None
        
        volanta = response.xpath('//div[@class="article-titles"]/h2').get()
        if volanta:
            ret_dict['volanta'] = volanta.text
        else:
            ret_dict['volanta'] = None
        
        fecha = response.xpath('//div[@class="time"]/span').get()
        if fecha:
            ret_dict['fecha'] = fecha.get('datetime')
        else:
            ret_dict['fecha'] = None
        
        copete = response.xpath('//div[@class="article-sumary"]').get()
        if copete:
            ret_dict['copete'] = copete.text
        else:
            ret_dict['copete'] = None
        
        autor = response.xpath('//div[@class="article-author"]').get()
        if author:
            ret_dict['author'] = author.a.get_text()
        else:
            ret_dict['author'] = None
        
        imagen = response.xpath('//div[@class="article-main-media-image"]').get()
        if media:
            imagenes = media.find_all('img')
            if len(imagenes) == 0:
                print('No se encontraron imagenes')
            else:
                img_src = imagenes[-1].get('data-src') 
                try:
                    img_req = requests.get(img_src)
                    if img_req.status_code == 200:
                        ret_dict['imagen'] = img_src
                        # ret_dict['imagen'] = img_req.content
                    else:
                        ret_dict['imagen'] = None
                except:
                    print('No se pudo obtener la imagen')
        else:
            print('No se encontró media')

        cuerpo = response.xpath('//div[@class="article-text"]').get()
        if cuerpo:
            ret_dict['cuerpo'] = cuerpo.get_text()
        else:
            ret_dict['cuerpo'] = None

        return ret_dict

Como puedo conseguir el archivo robots.txt en la pagina que deseo escrapear?

🤓 🚀

def parse_nota(self, response):
        nota = scrapy.Item()
        nota['title'] = response.xpath('//div[@class="article-title"]/text()').ipynb_checkpoints/get()
        nota['date'] = response.xpath('//span[@pubdate="pubdate"]/@datetime').get()
        nota['v_'] = response.xpath('//div[@class="article-prefix"]/text()').get()
        nota['sum_'] = response.xpath('//div[@class="article-summary"]/text()').get()
        nota['body'] = response.xpath('//div[@class="article-text"]/p/text()').getall()
        nota['author'] = response.xpath('//div[@class="article-author"]/text()').get()
        nota['media'] = response.xpath('//div[@class="article-main-media-image"]//img/@src').getall()[-1]
        return nota

Reto completado, función parse_nota:

def parse_nota(self, response):
        """Función que extrae la información de cada nota"""

        # Parseo de la nota
        title = response.xpath('//div[@class="article-title"]/text()').get()
        date = response.xpath('//span[@pubdate="pubdate"]/@datetime').get()
        summary = response.xpath('//div[@class="article-summary"]/text()').get()
        prefix = response.xpath('//div[@class="article-prefix"]/text()').get()
        media = response.xpath('//div[@class="article-main-media-image"]/@data-src').getall()[-1]
        body = "\n\n".join(
            response.xpath('//div[@class="article-body"]//@div[@class="article-text"//p/text()]').get_all()
        )
        author = response.xpath('//div[@class="article-author"]//span//a/text()').get()
start_urls = ['https://www.pagina12.com.ar/secciones/el-pais',
                  'https://www.pagina12.com.ar/secciones/economia',
                  'https://www.pagina12.com.ar/secciones/sociedad',
                  'https://www.pagina12.com.ar/suplementos/cultura-y-espectaculos',
                  'https://www.pagina12.com.ar/secciones/deportes',
                  'https://www.pagina12.com.ar/secciones/el-mundo',
                  'https://www.pagina12.com.ar/secciones/contratapa']

cual es la finalidad de esta clase ?

Se pude utilizar el siguiente comando para instalar scrapy

conda install -c conda-forge scrapy

YEah!!!, Amo este curso!!!

Como instalo scrapy en Google Colab?

si alguien tiene problemas ala instalar Scrapy es por que ocupan Microsoft Visual C++ Build Tools
aqui les dejo el link de descarga
https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019
Cuando inicie el instalador, tendrá varias “opciones” habilitadas que aumentarán el tamaño de instalación a 5 GB. Si tiene Windows 10, deberá dejar seleccionada la opción “Windows 10 SDK”

y luego instalar el Scrapy

def parse_nota(self, response):
        date = response.xpath('//div[@class="time"]/span/@datetime').get()
        prefix = response.xpath('//h2[@class="article-prefix"]/text()').get()
        title = response.xpath('//h1[@class="article-titles"]/text()').get()
        summary = response.xpath('//div[@class="article-summary"]/text()').get()
        content = response.xpath('//div[@class="article-text"]/text()').getall()
        image = response.xpath('//div[@class="article-main-media-image__container"]/img/@src').getall()[-1]

def parse_article(self, response):
        title = response.xpath('/html/body//h1[@class="article-title"]/text()').get()
        summary = response.xpath('/html/body//div[@class="article-summary"]/text()').get()
        body = response.xpath('/html/body//div[@class="article-text"]/p//text()').get()
        prefix = response.xpath('/html/body//h2[@class="article-prefix"]/text()').get()
        date = response.xpath('/html/body//span[@pubdate="pubdate"]/text()').get()
        author = response.xpath('/html/body//div[@class="article-main-media-header"]/div[@class="article-author"]/span/a/text()').get()

Mi respuesta al reto:

El código que me funcionó para instalar Scrapy en Anaconda en MacOS

conda install -c conda-forge scrapy

tanto pip como !pip, me marcaron error.

pip install scrapy