Scrapy – 链接提取器
描述
顾名思义,链接提取器是使用 scrapy.http.Response 对象从网页上提取链接的对象。在Scrapy中,有一些内置的提取器,如 scrapy.linkextractors 导入 LinkExtractor。 你可以根据自己的需要,通过实现一个简单的接口来定制自己的链接提取器。
每个链接提取器都有一个名为 extract_links 的公共方法,它包括一个Response对象,并返回一个scrapy.link.Link对象的列表。你可以只实例化一次链接提取器,并多次调用extract_links方法来提取具有不同响应的链接。CrawlSpiderclass使用带有一组规则的链接提取器,其主要目的是提取链接。
内置链接提取器的参考
通常情况下,链接提取器与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 ** (正则表达式(或列表))它阻止或排除一个单一的表达式或一组表达式,这些表达式应该与不被提取的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 (可调用) 它是一个函数,从扫描的标签和属性中接收一个值。收到的值可以被改变并返回,否则将不返回任何东西来拒绝该链接。如果不使用,默认情况下它将是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)