Scrapy 链接提取器

顾名思义,链接提取器是用于使用 scrapy.http.Response 对象从网页中提取链接的对象。 在Scrapy中,有内置的提取器如 scrapy.linkextractors import LinkExtractor。 我们可以通过实现一个简单的界面,根据我们的需要定制自己的链接提取器。

每个链接提取器都有一个名为 extract_links 的公共方法,它包含一个 Response 对象并返回一个 scrapy.link.Link 对象列表。 我们可以仅实例化链接提取器一次,并多次调用 extract_links 方法以提取具有不同响应的链接。 CrawlSpider 类使用具有一组规则的链接提取器,其主要目的是提取链接。


内置链接提取器的参考

通常链接提取器与 Scrapy 分组,并在 scrapy.linkextractors 模块中提供。 默认情况下,链接提取器将是 LinkExtractor,它在功能上与 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)

LxmlLinkExtractor 是一个强烈推荐的链接提取器,因为它有方便的过滤选项,并且与 lxml 强大的 HTMLParser 一起使用。

序号 参数 描述
1 allow(a regular expression (or list of)) 它允许单个表达式或一组表达式与要提取的 url 相匹配。 如果未提及,它将匹配所有链接。
2 deny(a regular expression (or list of)) 它阻止或排除应与不被提取的 url 匹配的单个表达式或一组表达式。 如果未提及或留空,则不会消除不需要的链接。
3 allow_domains(str or list) 它允许单个字符串或字符串列表匹配要从中提取链接的域。
4 deny_domains(str or list) 它阻止或排除应与不从中提取链接的域匹配的单个字符串或字符串列表。
5 deny_extensions(list) 提取链接时,它会阻止带有扩展名的字符串列表。 如果未设置,则默认情况下它将设置为 IGNORED_EXTENSIONS,其中包含 scrapy.linkextractors 包中的预定义列表。
6 restrict_xpaths(str or list) 它是一个 XPath 列表区域,从中可以从响应中提取链接。 如果给定,链接将只从文本中提取,这是由 XPath 选择的。
7 restrict_css(str or list) 它的行为类似于 restrict_xpaths 参数,它将从响应内的 CSS 选定区域中提取链接。
8 tags(str or list) 提取链接时应考虑的单个标签或标签列表。 默认情况下,它将是 ('a', 'area')
9 attrs(list) 提取链接时应考虑单个属性或属性列表。 默认情况下,它将是 ('href',)
10 canonicalize(boolean) 使用 scrapy.utils.url.canonicalize_url 将提取的 url 转换为标准格式。 默认情况下,它将是 True。
11 unique(boolean) 如果重复提取的链接,将使用它。
12 process_value(callable) 它是一个从扫描的标签和属性中接收值的函数。 接收到的值可能会被更改并返回,否则将不会返回任何内容以拒绝链接。 如果不使用,默认情况下它将是 lambda x: x

示例

以下代码用于提取链接

<a href = "javascript:goToPage('../other/page.html'); return false">Link text</a>

process_value 中可以使用如下代码函数

def process_value(val): 
   m = re.search("javascript:goToPage\('(.*?)'", val) 
   if m: 
      return m.group(1) 

查看笔记

扫码一下
查看教程更方便