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 (正则表达式(或列表)) 它允许一个单一的表达式或一组表达式,这些表达式应该匹配要提取的url。如果没有提及,它将匹配所有链接。
2 deny (正则表达式(或列表)) 它会阻止或排除应该与不会被提取的url匹配的单个表达式或一组表达式。如果没有提及或留空,那么它不会消除不需要的链接。
3 allow_domains (str或list) 它允许一个单一的字符串或字符串列表,该字符串列表应该与要从中提取链接的域匹配。
4 deny_domains (str或列表) 它会阻止或排除应该与不从中提取链接的域匹配的单个字符串或字符串列表。
5 deny_extensions (列表) 它在提取链接时会阻止包含扩展名的字符串列表。如果未设置,则默认情况下它将设置为 _IGNORED_EXTENSIONS_ ,其中包含 _scrapy.linkextractors_ 包中的预定义列表。
6 restrict_xpaths (str或列表) 它是从响应中提取链接的XPath列表区域。如果给定,链接将仅从XPath选择的文本中提取。
7 restrict_css (str或列表) 它的行为类似于restrict_xpaths参数,它将从响应中的CSS选定区域提取链接。
8 tags (str或列表) 提取链接时应考虑的单个标记或标记列表。默认情况下,它将是('a','区域')。
9 attrs (列表) 提取链接时应考虑单个属性或属性列表。默认情况下,它将是('href',)。
10 canonicalize (布尔) 使用 _scrapy.utils.url.canonicalize_url_ 将提取的网址转换为标准格式。默认情况下,它将为True。
11 unique (布尔) 如果提取的链接重复,它将被使用。
12 process_value (可调用) 它是从扫描的标签和属性中接收值的函数。收到的价值可能会改变并返回,否则什么都不会退回来拒绝链接。如果不使用,默认情况下它将是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)