链接提取器¶
链接提取器是其唯一目的是从最终将跟随的网页(scrapy.http.Response
对象)提取链接的对象。
在Scrapy中有 scrapy.linkextractors import LinkExtractor
,但您可以通过实现一个简单的界面来创建自己的自定义链接提取程序,以满足您的需求。
每个链接提取器唯一的公共方法是 extract_links
,它接收 Response
对象并返回 scrapy.link.Link
对象的列表。链接提取器意在被实例化一次,并且它们的 extract_links
方法被调用几次,具有不同的响应以提取跟随的链接。
链接提取器通过一组规则用于 CrawlSpider
类(可在Scrapy中使用),但是您也可以在蜘蛛中使用它,即使您不是从 CrawlSpider
子类化,因为其目的非常简单:提取链接。
内置链接提取器参考¶
链接提取器类与Scrapy捆绑在 scrapy.linkextractors
模块中提供。
默认链路提取器是 LinkExtractor
,它与 LxmlLinkExtractor
相同:
from scrapy.linkextractors import LinkExtractor
以前的Scrapy版本中曾经有过其他链接提取器类,但现在已经过时了。
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实现。
参数: - allow (a regular expression (or list of)) – 一个单一的正则表达式(或正则表达式列表),(绝对)urls必须匹配才能提取。如果没有给出(或为空),它将匹配所有链接。
- deny (a regular expression (or list of)) – 一个正则表达式(或正则表达式列表),(绝对)urls必须匹配才能排除(即不提取)。它优先于
allow
参数。如果没有给出(或为空),它不会排除任何链接。 - allow_domains (str or list) – 单个值或包含将被考虑用于提取链接的域的字符串的列表
- deny_domains (str or list) – 单个值或包含不会被考虑用于提取链接的域的字符串的列表
- deny_extensions (list) – 包含在提取链接时应忽略的扩展的单个值或字符串列表。如果没有给出,它将默认为在 scrapy.linkextractors 包中定义的
IGNORED_EXTENSIONS
列表。 - restrict_xpaths (str or list) – 是一个XPath(或XPath的列表),它定义响应中的链接应从中提取的区域。如果给出,只有那些XPath选择的文本将被扫描链接。参见下面的例子。
- restrict_css (str or list) – 一个CSS选择器(或选择器列表),它定义应该从中提取链接的响应中的区域。具有与
restrict_xpaths
相同的行为。 - tags (str or list) – 标签或在提取链接时要考虑的标签列表。默认为
('a', 'area')
。 - attrs (list) – 在查找要提取的链接时应该考虑的属性或属性列表(仅适用于在
tags
参数中指定的那些标记)。默认为('href',)
- canonicalize (boolean) – 规范化每个提取的url(使用w3lib.url.canonicalize_url)。默认为
True
。 - unique (boolean) – 是否应该对提取的链路应用重复过滤。
- process_value (callable) – 接收从标签提取的每个值和扫描的属性并且可以修改值并返回新值的函数,或者返回
None
以完全忽略链接。如果没有给出,process_value
默认为lambda x: x
。 .. highlight :: html例如,从这个代码中提取链接:: <a href=”javascript:goToPage(‘../other/page.html‘); return false”>链接文本</a> .. highlight :: python您可以在process_value
中使用以下函数:: def process_value(value):m = re.search(“ javascript:goToPage(‘(.*?)’”,value)if m:return m.group(1)