mime scrapy

mime - cómo omitir algún tipo de archivo mientras se arrastra con scrapy?



(3)

. Scip y .pdf son ignorados por scrapy de forma predeterminada .

Como regla general, puede configurar una regla para incluir solo las URL que coincidan con su expresión regular (.htm * en este caso):

rules = (Rule(SgmlLinkExtractor(allow=(''/.htm'')), callback=''parse_page'', follow=True, ), )

o excluya los que coincidan con una expresión regular:

rules = (Rule(SgmlLinkExtractor(allow=(''.*''), deny=(''/.pdf'', ''/.zip'')), callback=''parse_page'', follow=True, ), )

Lea la documentación para más información.

Quiero omitir algún tipo de archivo enlace .exe .zip .pdf mientras rastreo con scrapy, pero no quiero usar Rule con URL específica regular. ¿Cómo?

Actualizar:

Debido a eso, es difícil decidir si seguir este enlace solo por Content-Type en respuesta cuando el cuerpo no se ha descargado. Cambio a colocar url en el middleware de descarga. gracias Peter y Leo


Si va a linkextractor.py en el directorio raíz de Scrapy, verá lo siguiente:

""" Common code and definitions used by Link extractors (located in scrapy.contrib.linkextractor). """ # common file extensions that are not followed if they occur in links IGNORED_EXTENSIONS = [ # images ''mng'', ''pct'', ''bmp'', ''gif'', ''jpg'', ''jpeg'', ''png'', ''pst'', ''psp'', ''tif'', ''tiff'', ''ai'', ''drw'', ''dxf'', ''eps'', ''ps'', ''svg'', # audio ''mp3'', ''wma'', ''ogg'', ''wav'', ''ra'', ''aac'', ''mid'', ''au'', ''aiff'', # video ''3gp'', ''asf'', ''asx'', ''avi'', ''mov'', ''mp4'', ''mpg'', ''qt'', ''rm'', ''swf'', ''wmv'', ''m4a'', # other ''css'', ''pdf'', ''doc'', ''exe'', ''bin'', ''rss'', ''zip'', ''rar'', ]

Sin embargo, dado que esto se aplica al linkextractor (y no desea utilizar las Reglas), no estoy seguro de que esto resuelva su problema (me acabo de dar cuenta de que usted especificó que no quería usar las Reglas. Pensé que tenía preguntó cómo cambiar las restricciones de extensión de archivo sin necesidad de especificar directamente en una regla).

La buena noticia es que también puede crear su propio middleware descargador y eliminar todas las solicitudes a las URL que tienen una extensión indeseable. Ver Downloader Middlerware

Puede obtener la url solicitada accediendo al atributo url del objeto de request la siguiente manera: request.url

Básicamente, busque el final de la cadena para ''.exe'' o cualquier extensión que desee eliminar, y si contiene dichas extensiones, devuelva una excepción IgnoreRequest y la solicitud se eliminará inmediatamente.

ACTUALIZAR

Para procesar la solicitud antes de que se descargue, debe asegurarse de definir el método ''process_request'' en su middleware descargador personalizado.

De acuerdo con la documentación de Scrapy

process_request

Se llama a este método para cada solicitud que pasa por el middleware de descarga.

process_request () debería devolver None, un objeto Response o un objeto Request.

Si devuelve None, Scrapy continuará procesando esta solicitud, ejecutando todos los demás middlewares hasta que, finalmente, se llame al controlador de descarga apropiado y se descargue la respuesta.

Si devuelve un objeto Response, Scrapy no se molestará en llamar CUALQUIER otro middleware de solicitud o excepción, o la función de descarga apropiada; devolverá esa respuesta. El middleware de respuesta siempre se llama en cada respuesta.

Si devuelve un objeto Request, la solicitud devuelta se reprogramará (en el Scheduler) para ser descargada en el futuro. La devolución de llamada de la solicitud original siempre será llamada. Si la nueva solicitud tiene una devolución de llamada, se invocará con la respuesta descargada, y la salida de esa devolución de llamada se pasará a la devolución de llamada original. Si la nueva solicitud no tiene una devolución de llamada, la respuesta descargada se pasará a la devolución de llamada de solicitud original.

Si devuelve una excepción IgnoreRequest, la solicitud completa se eliminará por completo y su devolución de llamada nunca se llamará.

Entonces, esencialmente, solo crea una clase de descarga, agrega una clase de método, solicitud de proceso, que toma un objeto de solicitud y un objeto de araña como parámetros. A continuación, devuelva la excepción IgnoreRequest si la url contiene extensiones no deseadas.

Esto debería ocurrir antes de que la página se descargue. Sin embargo, si quiere procesar los encabezados de respuesta, deberá enviarse una solicitud a la página web.

Siempre puede implementar un método de solicitud de proceso y de respuesta de proceso en el programa de descarga, con la idea de que las extensiones obvias se descartarán inmediatamente y de que, si por alguna razón la URL no contiene la extensión de archivo, la solicitud se procesará y capturará. el método process_request (ya que puede verificar en los encabezados)?


Creé este Middleware para excluir cualquier tipo de respuesta que no esté en una lista blanca de expresiones regulares:

from scrapy.http.response.html import HtmlResponse from scrapy.exceptions import IgnoreRequest from scrapy import log import re class FilterResponses(object): """Limit the HTTP response types that Scrapy dowloads.""" @staticmethod def is_valid_response(type_whitelist, content_type_header): for type_regex in type_whitelist: if re.search(type_regex, content_type_header): return True return False def process_response(self, request, response, spider): """ Only allow HTTP response types that that match the given list of filtering regexs """ # to specify on a per-spider basis # type_whitelist = getattr(spider, "response_type_whitelist", None) type_whitelist = (r''text'', ) content_type_header = response.headers.get(''content-type'', None) if not content_type_header or not type_whitelist: return response if self.is_valid_response(type_whitelist, content_type_header): return response else: msg = "Ignoring request {}, content-type was not in whitelist".format(response.url) log.msg(msg, level=log.INFO) raise IgnoreRequest()

Para usarlo, agréguelo a settings.py:

DOWNLOADER_MIDDLEWARES = { ''[project_name].middlewares.FilterResponses'': 999, }