informatica:programacion:python:scrapy
Tabla de Contenidos
Scrapy
Framework para la extracción de datos de web utilizando Python.
Instalación
pip install scrapy
Ejemplos
""" Extracción de titulares y resumen de la página principal del periódico El Universo. """ from scrapy.item import Field from scrapy.item import Item from scrapy.spiders import Spider from scrapy.selector import Selector from scrapy.loader.processors import MapCompose from scrapy.loader import ItemLoader from bs4 import BeautifulSoup from scrapy.crawler import CrawlerProcess # Abstracción de datos a extraer # Determina qué datos vamos a llenar y estarán en el archivo resultante class Noticia(Item): id = Field() titular = Field() descripcion = Field() # La clase principal con la "araña" class ElUniversoSpider(Spider): name = "MiSpider" custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.80 Chrome/71.0.3578.80 Safari/537.36', # 'FEED_EXPORT_FIELDS': ['id', 'descripcion', 'titular'], # Como ordenar las columnas en el CSV? # 'CONCURRENT_REQUESTS': 1 # numero de requerimientos concurrentes #'FEED_EXPORT_ENCODING': 'utf-8' } start_urls = ['https://www.eluniverso.com/deportes'] def parse(self, response): sel = Selector(response) noticias = sel.xpath('//div[contains(@class, "content-feed")]/ul/li') for i, elem in enumerate(noticias): # PARA INVESTIGAR: Para que sirve enumerate? item = ItemLoader(Noticia(), elem) # Cargo mi item # Llenando mi item a traves de expresiones XPATH item.add_xpath('titular', './/h2/a/text()') item.add_xpath('descripcion', './/p/text()') item.add_value('id', i) yield item.load_item() # Retorno mi item lleno # METODO #2: UTILIZANDO BEAUTIFUL SOUP => En este caso aumenta un poco la complejidad # soup = BeautifulSoup(response.body) # contenedor_noticias=soup.find_all(class_="feed | divide-y relative") # id = 0 # for contenedor in contenedor_noticias: # noticias = contenedor.find_all(class_='relative', recursive = False) # for noticia in noticias: # item = ItemLoader(Noticia(), response.body) # titular = noticia.find('h2').text.replace('\n', '').replace('\r', '') # descripcion = noticia.find('p') # if (descripcion): # item.add_value('descripcion', descripcion.text.replace('\n', '').replace('\r', '')) # else: # item.add_value('descripcion', 'N/A') # item.add_value('titular', titular) # item.add_value('id', id) # id += 1 # yield item.load_item() # Ejecución: # scrapy runspider eluniverso.py -o resultados.csv # Ejecutando Scrapy sin el terminal: # process = CrawlerProcess({ # 'FEED_FORMAT': 'json', # 'FEED_URI': 'datos_de_salida.json' # }) # process.crawl(ElUniversoSpider) # process.start()
informatica/programacion/python/scrapy.txt · Última modificación: por tempwin
