Estoy mirando de crear una versión nueva de scrapertools, y he hecho este pequeño codigo, de momento he utilizado la libreria "requests", queda pendiente de hacer para urllib2, ya que requests no es compatible con todas las plataformas.
scrapertoolsv2.py
Código: Seleccionar todo
from lib import requests
def get_page(url):
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.ConnectTimeout as e:
raise RequestError("Timeout: {0}".format(url), e)
except requests.exceptions.HTTPError as e:
raise RequestError("HTTPError: {0}".format(url), e)
except requests.exceptions.ConnectionError as e:
# TODO internacionalizar el texto
raise RequestError("No se ha podido encontrar: {0}".format(url), e)
except requests.exceptions.RequestException as e:
# TODO internacionalizar el texto
raise RequestError("Se ha producido un error: {0}".format(url), e)
return response.content
class RequestError(Exception):
def __init__(self, message, errors):
# Call the base class constructor with the parameters it needs
super(RequestError, self).__init__(message)
logger.info("{0} {1}".format(message, errors))
canal.py
Código: Seleccionar todo
from core import scrapertoolsv2 as scrapertools
from core.scrapertoolsv2 import RequestError
def series(item):
logger.info("pelisalacarta.seriesblanco series")
itemlist = []
try:
data = scrapertools.get_page(item.url)
data = re.sub(r"\n|\r|\t|\s{2}| |<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data)
data = re.sub(r"<!--.*?-->", "", data)
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
patron = "<li><a href='([^']+)' title='([^']+)'>[^<]+</a></li>"
matches = re.compile(patron, re.DOTALL).findall(data)
# como no viene el thumbnail en esta pagina ponemos el thumbnail generico del canal
thumbnail = channel_xml["thumbnail"]
for scrapedurl, scrapedtitle in matches:
itemlist.append(Item(channel=__channel__, title=scrapedtitle, url=urlparse.urljoin(HOST, scrapedurl),
action="episodios", show=scrapedtitle, thumbnail=thumbnail, context=CONTEXT))
except RequestError as err:
item = Item(title="{0}".format(err))
itemlist.append(item)
return itemlist
Con esto se consigue que si hay un error al obtener datos de una página, nos añadiria un item con el titulo del error, sería más visible para el usuario que ha habido un error y no que devuelva un itemlist vacío.
¿Qué os parece?¿Alguna cosa para mejorar?