Scrapy - Extractores de enlaces
Descripción
Como su propio nombre indica, los extractores de enlaces son los objetos que se utilizan para extraer enlaces de páginas web utilizando scrapy.http.Responseobjetos. En Scrapy, hay extractores integrados comoscrapy.linkextractors importar LinkExtractor. Puede personalizar su propio extractor de enlaces de acuerdo con sus necesidades implementando una interfaz simple.
Cada extractor de enlaces tiene un método público llamado extract_linksque incluye un objeto Response y devuelve una lista de objetos scrapy.link.Link. Puede crear una instancia de los extractores de enlaces solo una vez y llamar al método extract_links varias veces para extraer enlaces con diferentes respuestas. La clase CrawlSpider utiliza extractores de enlaces con un conjunto de reglas cuyo objetivo principal es extraer enlaces.
Referencia del extractor de enlaces incorporado
Normalmente, los extractores de enlaces se agrupan con Scrapy y se proporcionan en el módulo scrapy.linkextractors. De forma predeterminada, el extractor de enlaces será LinkExtractor, que tiene la misma funcionalidad que LxmlLinkExtractor -
from scrapy.linkextractors import LinkExtractor
LxmlLinkExtractor
class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow = (), deny = (),
allow_domains = (), deny_domains = (), deny_extensions = None, restrict_xpaths = (),
restrict_css = (), tags = ('a', 'area'), attrs = ('href', ),
canonicalize = True, unique = True, process_value = None)
El LxmlLinkExtractor es un extractor de enlace muy recomendable, ya que tiene opciones de filtro a mano y se utiliza con una robusta HTMLParser de lxml.
No Señor | Descripción de parámetros |
---|---|
1 | allow (una expresión regular (o lista de)) Permite una sola expresión o grupo de expresiones que deben coincidir con la URL que se va a extraer. Si no se menciona, coincidirá con todos los enlaces. |
2 | deny (una expresión regular (o lista de)) Bloquea o excluye una sola expresión o grupo de expresiones que deben coincidir con la URL que no se va a extraer. Si no se menciona o se deja vacío, no eliminará los enlaces no deseados. |
3 | allow_domains (str o lista) Permite una sola cadena o lista de cadenas que deben coincidir con los dominios de los que se extraerán los enlaces. |
4 | deny_domains (str o lista) Bloquea o excluye una sola cadena o lista de cadenas que deben coincidir con los dominios de los que no se extraerán los enlaces. |
5 | deny_extensions (lista) Bloquea la lista de cadenas con las extensiones al extraer los enlaces. Si no está configurado, de forma predeterminada se establecerá en IGNORED_EXTENSIONS, que contiene una lista predefinida en el paquete scrapy.linkextractors . |
6 | restrict_xpaths (str o lista) Es una región de lista XPath de donde se extraerán los enlaces de la respuesta. Si se proporcionan, los enlaces se extraerán solo del texto, que es seleccionado por XPath. |
7 | restrict_css (str o lista) Se comporta de manera similar al parámetro restrict_xpaths que extraerá los enlaces de las regiones seleccionadas de CSS dentro de la respuesta. |
8 | tags (str o lista) Una sola etiqueta o una lista de etiquetas que se deben considerar al extraer los enlaces. De forma predeterminada, será ('a', 'área'). |
9 | attrs (lista) Se debe considerar un solo atributo o lista de atributos al extraer enlaces. De forma predeterminada, será ('href',). |
10 | canonicalize (booleano) La URL extraída se lleva a la forma estándar mediante scrapy.utils.url.canonicalize_url . De forma predeterminada, será Verdadero. |
11 | unique (booleano) Se utilizará si se repiten los enlaces extraídos. |
12 | process_value (invocable) Es una función que recibe un valor de las etiquetas y atributos escaneados. El valor recibido puede ser alterado y devuelto o de lo contrario no se devolverá nada para rechazar el enlace. Si no se usa, por defecto será lambda x: x. |
Ejemplo
El siguiente código se utiliza para extraer los enlaces:
<a href = "javascript:goToPage('../other/page.html'); return false">Link text</a>
La siguiente función de código se puede utilizar en process_value -
def process_value(val):
m = re.search("javascript:goToPage\('(.*?)'", val)
if m:
return m.group(1)