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,
}