transeunte y sinembargo

parent abad6379
[
]
\ No newline at end of file
[
{"date": "2021-07-15T23:19:23", "title": "UPTREP signa convenio de colaboración con la CMIC Tlaxcala.", "text": "La Universidad Politécnica de Tlaxcala Región Poniente (Uptrep) y la Cámara Mexicana de la Industria de la Construcción (CMIC) Tlaxcala signaron un convenio de colaboración para fortalecer la enseñanza-aprendizaje de alumnos y desarrollar proyectos tecnológicos, productivos y de investigación.\n\n\n\nLa Uptrep destacó que el convenio permitirá a los alumnos ampliar sus opciones para realizar sus prácticas profesionales e intercambiar experiencias en materia de investigación, desarrollo de proyectos, capacitación, estancias y estadías enfocadas en el área de la construcción.\n\n\n\nCabe señalar que, con este documento los estudiantes de la de la Licenciatura en Arquitectura Bioclimática podrán fortalecer su aprendizaje a través del desarrollo de prácticas profesionales.\n\n\n\nEn tanto, la Delegación de la CMIC en Tlaxcala reconoció el interés por la vinculación académica de jóvenes con la iniciativa privada.", "topic": null, "url": "https://diariolanoticia.com.mx/?p=78084"},
{"date": "2021-07-15T21:24:47", "title": "#Entérate | Hasta ocho años de cárcel y cancelación de licencia", "text": "Para conductores que manejen ebrios o bajo influjos de estupefacientes\n\n\n\nPuebla.- El Pleno de la LX Legislatura del Congreso del Estrado de Puebla, en Sesión Ordinaria, aprobó por unanimidad de votos, reformas al Código Penal y a la Ley de Vialidad para el Estado, enviadas por el Ejecutivo estatal, para sancionar con la suspensión o cancelación definitiva de la licencia para conducir, a quien maneje un vehículo bajo los efectos de estupefacientes y al que al operar un automóvil en este mismo estado cause homicidio, imponerle de tres a ocho años de prisión.\n\n\n\nLa reforma al artículo 85 Bis del Código Penal establece que la duración de la suspensión podrá ser de uno a 10 años, mientras que la adición del artículo 323 propone que al que al conducir vehículo de motor cause homicidio o lesiones, hallándose en estado de embriaguez superior al primer grado o bajo el efecto de estupefacientes, enervantes, psicotrópicos o cualquier otra sustancia que produzca un efecto similar, se sancionará de tres a ocho años de prisión.\n\n\n\nEn tanto que el artículo 51 de la Ley de Vialidad para el Estado establece la cancelación de la licencia en los supuestos previstos por las leyes, que podrá ser definitiva o por tiempo determinado.\n\n\n\nAl hacer uso de la palabra la diputada Guadalupe Esquitín Lastiri expuso que manejar un vehículo en estado de ebriedad pone en riesgo el patrimonio de otras personas, pero, también su vida, por lo que se deben tomar las medidas necesarias para inhibir estas conductas; mientras que el diputado Héctor Alonso Granados se pronunció para que, además de estas reformas, se impulsen campañas preventivas.\n\n\n\nPor su parte la diputada Mónica Rodríguez Della Vecchia sostuvo que la aplicación de sanciones no debe ser la única medida por la que se prevengan accidentes a causa de bebidas embriagantes y estupefacientes, sino también, que se implementen campañas de concientización; en tanto que el diputado Gerardo Islas Maldonado, secundó esta postura al señalar que se debe de ir más allá de las reformas a la Ley; asimismo, el diputado Jonathan Collantes Cabañas refirió que conducir bajo los influjos del alcohol es la principal causa de accidentes viales, de tal forma que tiene que prevenirse.\n\n\n\n", "topic": null, "url": "https://diariolanoticia.com.mx/?p=78081"},
{"date": "2021-07-15T20:28:31", "title": "Concluyen estudios de posgrado en la UATx", "text": "De la Maestría en Administración y del Doctorado en Ciencias Administrativas\n\n\n\nContribuir al crecimiento y transformación del estado y del país, es una tarea constante que la Universidad Autónoma de Tlaxcala (UATx) realiza al entregar a la sociedad profesionales que se han formado en programas educativos de calidad, por lo tanto, a través de la Facultad de Ciencias Económico Administrativas, llevó a cabo la ceremonia de graduación de la Maestría en Administración y del Doctorado en Ciencias Administrativas.\n\n\n\nEn esta ceremonia, organizada por el Centro de Investigación en Ciencias Administrativas (CICA), la Mtra. Alejandra Velázquez Orozco, Coordinadora de la División de Ciencias Sociales y Administrativas, en representación del Dr. Luis González Placencia, Rector de la UATx, puntualizó que, la preparación que se brinda, es de vanguardia y con un sentido humano, lo que conlleva a un ejercicio ético en la práctica de estas disciplinas.\n\n\n\nEn tanto, el Dr. Juan George Zecua, Director de la Facultad de Ciencias Económico Administrativas, mencionó que, los 12 egresados de la Maestría y los dos del Doctorado, deben sentirse satisfechos, ya que a pesar de los momentos difíciles y de incertidumbre ocasionados por la Covid-19, que pusieron a prueba sus capacidades y talentos, pudieron superarlos para consolidar estos proyectos de vida.\n\n\n\nEn representación de los graduandos, Lorena Sánchez Flores y Jorge Cruz Morales Carpinteyro respectivamente, destacaron que, gracias a la cátedra de los docentes de esta alma máter, se llevan experiencias y conocimientos que pondrán en práctica en el ámbito laboral para abonar al crecimiento de nuestra entidad.\n\n\n\nEste acto protocolario, contó con la presencia de la Mtra. Rosalinda Armas Gómez, Coordinadora del CICA, así como integrantes de la estructura directiva de dicha Facultad.", "topic": null, "url": "https://diariolanoticia.com.mx/?p=78078"},
{"date": "2021-07-15T20:26:11", "title": "Sostiene Alcalde Electo de Tlaxcala reuniones temáticas de turismo en Querétaro", "text": "Una de las experiencias más exitosas para impulsar el turismo en el país fue desde su creación en el 2001  el programa federal “Pueblos Mágicos”,  tendiente a revalorar a un conjunto de poblaciones con atributos únicos desde el punto de vista simbólico, histórico y natural, y que desde su cotidianidad representan alternativas para el turismo nacional y extranjero.\n\n\n\nPara conocer los pormenores de la estructura e implementación de este programa, el presidente municipal electo de Tlaxcala Jorge Corichi Fragoso se reunió con Heriberto Hermosillo, ex director general adjunto de desarrollo regional y de fomento turístico de la secretaría de turismo del gobierno federal, quien también detalló los programas turísticos en el poblado de Bernal, Querétaro y en Tequila, Jalisco.\n\n\n\nLa reunión celebrada este miércoles en la ciudad de Santiago de Querétaro se enmarca en el compromiso de desarrollar el eje central que guiará a la administración municipal 2021-2024 hacia la transformación de Tlaxcala capital en un polo de desarrollo turístico regional.\n\n\n\nJorge Corichi sostuvo también reuniones por separado con el alcalde de Querétaro, Miguel Parrodi Espinosa, el secretario de turismo municipal, Raúl Parissi Arau y el secretario del ramo en aquella entidad, Hugo Burgos García, a quienes expuso que “Tlaxcala tiene mucho que ofrecer al visitante nacional y extranjero porque posee una vocación eminentemente turística y cultural, aquí se dio el encuentro de dos culturas la española y la tlaxcalteca, y con ello la posibilidad de la posibilidad de poblar el norte del país y llevar un bagaje importante de nuestra cultura”.\n\n\n\nEl presidente municipal electo subrayó que su administración sentará las bases de un nuevo Tlaxcala con la concurrencia de todos los sectores sociales “para que en conjunto  construyamos un Proyecto de Gran Visión, donde los ciudadanos definamos cómo queremos ver a nuestra Ciudad en 20, 30 o 50 años”.\n\n\n\nEl eje central de turismo forma parte del proyecto integral de  desarrollo que prevé un mejoramiento en la calidad de vida de los pobladores del municipio de Tlaxcala.", "topic": null, "url": "https://diariolanoticia.com.mx/?p=78075"},
{"date": "2021-07-15T20:21:19", "title": "Juntos, escribiremos la nueva historia de Tlaxcala: Lorena Cuéllar", "text": "Inicia su gira de agradecimiento en los distritos III y IV, con sede en Terrenate y Apizaco, donde llamó al trabajo conjunto y coordinado para impulsar el desarrollo de la entidad.\n\n\n\nEn lo que fue el inicio de su gira de agradecimiento, este día la gobernadora electa de Tlaxcala, Lorena Cuéllar Cisneros, agradeció a los ciudadanos por el respaldo que le brindaron el pasado 6 de junio, cuyos resultados la convirtieron en la gobernadora con el mayor nivel de votación en la República Mexicana, por lo que los invitó a continuar con ese apoyo y que, juntos, escriban la nueva historia del estado.\n\n\n\nAnte cientos de ciudadanos de las cabeceras distritales de Terrenate y Apizaco, los conminó a continuar trabajando de forma conjunta y coordinada para impulsar el desarrollo que requiere la entidad y colocarla en los primeros lugares a nivel nacional en materia de desarrollo y crecimiento económico, pues esto será lo que permitirá a los tlaxcaltecas mejorar su nivel de vida.\n\n\n\nPara ello, dijo que desde el momento en que le entregaron de constancia de mayoría, inició de inmediato una serie de reuniones con los titulares de diferentes dependencias federales y con el propio presidente de México, Andrés Manuel López Obrador, para lograr que le vaya bien a Tlaxcala, siempre basados en los principios de la Cuarta Transformación, que son “no mentir, no robar y no traicionar”.\n\n\n\nCuéllar Cisneros precisó que los ejes prioritarios de su gobierno son claros y estarán sometidos a una evaluación permanente con la participación pública, por lo que pidió a los ciudadanos ayudarle a vigilar el desempeño de los servidores públicos que la van a acompañar en su administración, los cuales, estarán obligados a ser hombres y mujeres comprometidos, honestos, serios y de tiempo completo para sacar adelante a Tlaxcala.\n\n\n\n“La campaña electoral ya terminó y mi compromiso es con todos los ciudadanos que me apoyaron…mi reto será conquistar con hechos y trabajo a quienes no confiaron en nuestro proyecto y con resultados diarios lo lograremos porque trabajaré de manera cercana con ustedes y las autoridades federales”.\n\n\n\nLa gobernadora electa anunció que una de las primeras acciones de su gobierno será la instalación de Consejos Municipales de Participación Social en Educación, con el objetivo de estar preparados para el regreso a clases presenciales, pero con las medidas sanitarias necesarias y con una organización ejemplar en el contexto de cada comunidad, cuidando a niños, maestros y padres de familia.\n\n\n\nManifestó que, para garantizar un regreso a clases seguro, se contará con equipos interdisciplinarios de especialistas para atender a los menores y todos los sectores, por lo que de forma inmediata se iniciara con la rehabilitación de los 279 centros de alud existentes en la entidad, mismos que tendrán médicos de tiempo completo con el equipo necesario para brindar un servicio de calidad.\n\n\n\nLa gobernadora electa, Lorena Cuéllar Cisneros, dijo que en materia económica su gobierno va a reactivar todos los sectores para generar un incremento de empleos de la mano con el fortalecimiento de la seguridad y la eliminación de la corrupción en todos los niveles del Estado.\n\n\n\nDe entrada, aseveró que tanto para la integración de su gabinete como en todas las estructuras gubernamentales, garantizará que el 50 por ciento de los espacios sean para mujeres, con el objetivo de respaldarlas, “voy a representar a todas las mujeres y habrá paridad en los cargos públicos, pero también para discapacitados y jóvenes”.\n\n\n\n", "topic": null, "url": "https://diariolanoticia.com.mx/?p=78071"}
]
\ No newline at end of file
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = sinEmbargo.settings
[deploy]
#url = http://localhost:6800/
project = sinEmbargo
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SinembargoItem(scrapy.Item):
date = scrapy.Field()
title = scrapy.Field()
text = scrapy.Field()
location = scrapy.Field()
author = scrapy.Field()
topic = scrapy.Field()
url = scrapy.Field()
# define the fields for your item here like:
# name = scrapy.Field()
pass
# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
from scrapy import signals
# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter
class SinembargoSpiderMiddleware:
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the spider middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_spider_input(self, response, spider):
# Called for each response that goes through the spider
# middleware and into the spider.
# Should return None or raise an exception.
return None
def process_spider_output(self, response, result, spider):
# Called with the results returned from the Spider, after
# it has processed the response.
# Must return an iterable of Request, or item objects.
for i in result:
yield i
def process_spider_exception(self, response, exception, spider):
# Called when a spider or process_spider_input() method
# (from other spider middleware) raises an exception.
# Should return either None or an iterable of Request or item objects.
pass
def process_start_requests(self, start_requests, spider):
# Called with the start requests of the spider, and works
# similarly to the process_spider_output() method, except
# that it doesn’t have a response associated.
# Must return only requests (not items).
for r in start_requests:
yield r
def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)
class SinembargoDownloaderMiddleware:
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the downloader middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
# Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
return None
def process_response(self, request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response
def process_exception(self, request, exception, spider):
# Called when a download handler or a process_request()
# (from other downloader middleware) raises an exception.
# Must either:
# - return None: continue processing this exception
# - return a Response object: stops process_exception() chain
# - return a Request object: stops process_exception() chain
pass
def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class SinembargoPipeline:
def process_item(self, item, spider):
return item
# Scrapy settings for sinEmbargo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
BOT_NAME = "sinEmbargo"
SPIDER_MODULES = ["sinEmbargo.spiders"]
NEWSPIDER_MODULE = "sinEmbargo.spiders"
FEED_EXPORT_ENCODING="utf-8"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "planaMayor (+http://www.yourdomain.com)"
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
#COOKIES_ENABLED = False
# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
# "Accept-Language": "en",
#}
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
# "sinEmbargo.middlewares.SinembargoSpiderMiddleware": 543,
#}
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
# "sinEmbargo.middlewares.SinembargoDownloaderMiddleware": 543,
#}
# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
# "scrapy.extensions.telnet.TelnetConsole": None,
#}
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# "sinEmbargo.pipelines.SinembargoPipeline": 300,
#}
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False
# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = "httpcache"
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage"
# Set settings whose default value is deprecated to a future-proof value
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
# This package will contain the spiders of your Scrapy project
#
# Please refer to the documentation for information on how to create and manage
# your spiders.
import scrapy
import json
import re
from sinEmbargo.items import SinembargoItem
# Expresión regular para eliminar etiquetas HTML
TAG_RE = re.compile(r'<[^>]+>')
def remove_tags(text):
if not isinstance(text, str):
return text # Devuelve el valor original si no es una cadena
return TAG_RE.sub('', text)
class NoticiasSpider(scrapy.Spider):
name = "noticias"
allowed_domains = ["www.sinembargo.mx"]
start_urls = ["https://www.sinembargo.mx/"]
def __init__(self, year=None, month=None, day=None, *args, **kwargs):
super(NoticiasSpider, self).__init__(*args, **kwargs)
self.year = year
self.month = month.zfill(2) if month else None
self.day = day.zfill(2) if day else None
if self.year and self.month and self.day:
self.start_urls = [
f"https://www.sinembargo.mx/wp-json/wp/v2/posts?after={self.year}-{self.month}-{self.day}T00:00:00&before={self.year}-{self.month}-{self.day}T23:59:59&per_page=100"
]
print(self.start_urls[0])
def parse(self, response):
try:
# Intenta decodificar el JSON de la respuesta
data = json.loads(response.text)
self.logger.info(f"Received {len(data)} posts from API.")
except json.JSONDecodeError as e:
# Si hay un error al decodificar el JSON, registra el error y detén el procesamiento
self.logger.error(f"Failed to parse JSON: {e}")
self.logger.error(f"Response content: {response.text[:500]}...") # Logea los primeros 500 caracteres de la respuesta
return
for post in data:
try:
content = post.get('content', {}).get('rendered', '').strip()
if content:
class_list = post.get('class_list', {})
topic = None
if isinstance(class_list, dict):
topic = class_list.get('7', '').split("category-")[1] if '7' in class_list else None
# Preparar item
item = SinembargoItem()
item['date'] = post.get('date')
item['title'] = remove_tags(post.get('title', {}).get('rendered', ''))
item['text'] = remove_tags(content)
item['topic'] = topic
item['url'] = post.get('link')
print(item['title'])
yield item
except Exception as e:
# Si hay un error al procesar un post, registra el error y continúa con el siguiente
self.logger.error(f"Error processing post {post.get('id')}: {e}")
continue
\ No newline at end of file
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = transeunte.settings
[deploy]
#url = http://localhost:6800/
project = transeunte
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class TranseunteItem(scrapy.Item):
date = scrapy.Field()
title = scrapy.Field()
text = scrapy.Field()
location = scrapy.Field()
author = scrapy.Field()
topic = scrapy.Field()
url = scrapy.Field()
# define the fields for your item here like:
# name = scrapy.Field()
pass
\ No newline at end of file
# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
from scrapy import signals
# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter
class TranseunteSpiderMiddleware:
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the spider middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_spider_input(self, response, spider):
# Called for each response that goes through the spider
# middleware and into the spider.
# Should return None or raise an exception.
return None
def process_spider_output(self, response, result, spider):
# Called with the results returned from the Spider, after
# it has processed the response.
# Must return an iterable of Request, or item objects.
for i in result:
yield i
def process_spider_exception(self, response, exception, spider):
# Called when a spider or process_spider_input() method
# (from other spider middleware) raises an exception.
# Should return either None or an iterable of Request or item objects.
pass
def process_start_requests(self, start_requests, spider):
# Called with the start requests of the spider, and works
# similarly to the process_spider_output() method, except
# that it doesn’t have a response associated.
# Must return only requests (not items).
for r in start_requests:
yield r
def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)
class TranseunteDownloaderMiddleware:
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the downloader middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
# Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
return None
def process_response(self, request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response
def process_exception(self, request, exception, spider):
# Called when a download handler or a process_request()
# (from other downloader middleware) raises an exception.
# Must either:
# - return None: continue processing this exception
# - return a Response object: stops process_exception() chain
# - return a Request object: stops process_exception() chain
pass
def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TranseuntePipeline:
def process_item(self, item, spider):
return item
# Scrapy settings for transeunte project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
BOT_NAME = "transeunte"
SPIDER_MODULES = ["transeunte.spiders"]
NEWSPIDER_MODULE = "transeunte.spiders"
FEED_EXPORT_ENCODING="utf-8"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "planaMayor (+http://www.yourdomain.com)"
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
#COOKIES_ENABLED = False
# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
# "Accept-Language": "en",
#}
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
# "transeunte.middlewares.TranseunteSpiderMiddleware": 543,
#}
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
# "transeunte.middlewares.TranseunteDownloaderMiddleware": 543,
#}
# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
# "scrapy.extensions.telnet.TelnetConsole": None,
#}
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# "transeunte.pipelines.TranseuntePipeline": 300,
#}
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False
# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = "httpcache"
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage"
# Set settings whose default value is deprecated to a future-proof value
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
# This package will contain the spiders of your Scrapy project
#
# Please refer to the documentation for information on how to create and manage
# your spiders.
import scrapy
import json
import re
from transeunte.items import TranseunteItem
# Expresión regular para eliminar etiquetas HTML
TAG_RE = re.compile(r'<[^>]+>')
def remove_tags(text):
if not isinstance(text, str):
return text # Devuelve el valor original si no es una cadena
return TAG_RE.sub('', text)
class NoticiasSpider(scrapy.Spider):
name = "noticias"
allowed_domains = ["transeuntemx.com"]
start_urls = ["https://transeuntemx.com/"]
def __init__(self, year=None, month=None, day=None, *args, **kwargs):
super(NoticiasSpider, self).__init__(*args, **kwargs)
self.year = year
self.month = month.zfill(2) if month else None
self.day = day.zfill(2) if day else None
if self.year and self.month and self.day:
self.start_urls = [
f"https://transeuntemx.com/wp-json/wp/v2/posts?after={self.year}-{self.month}-{self.day}T00:00:00&before={self.year}-{self.month}-{self.day}T23:59:59&per_page=100"
]
print(self.start_urls[0])
def parse(self, response):
try:
# Intenta decodificar el JSON de la respuesta
data = json.loads(response.text)
self.logger.info(f"Received {len(data)} posts from API.")
except json.JSONDecodeError as e:
# Si hay un error al decodificar el JSON, registra el error y detén el procesamiento
self.logger.error(f"Failed to parse JSON: {e}")
self.logger.error(f"Response content: {response.text[:500]}...") # Logea los primeros 500 caracteres de la respuesta
return
for post in data:
try:
content = post.get('content', {}).get('rendered', '').strip()
if content:
class_list = post.get('class_list', {})
topic = None
if isinstance(class_list, dict):
topic = class_list.get('7', '').split("category-")[1] if '7' in class_list else None
# Preparar item
item = TranseunteItem()
item['date'] = post.get('date')
item['title'] = remove_tags(post.get('title', {}).get('rendered', ''))
item['text'] = remove_tags(content)
item['topic'] = topic
item['url'] = post.get('link')
print(item['title'])
yield item
except Exception as e:
# Si hay un error al procesar un post, registra el error y continúa con el siguiente
self.logger.error(f"Error processing post {post.get('id')}: {e}")
continue
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment