爬虫:Scrapy10 - Link Extractors
Link Extractors 适用于从网页(scrapy.http.Response)中抽取会被 follow 的链接的对象。
Scrapy 默认提供 2 种可用的 Link Extractor,但你可以通过实现一个简单的接口创建自己制定的 Link Extractor 来满足需求。Scrapy 提供了 from scrapy.contrib.linkextractors import LinkExtractor。
每个 LinkExtractor 有唯一的公共方法是 extract_links,其接收一个 Response 对象,并返回 scrapy.link.Link 对象。Link Extractors 只能实例化一次,其 extract_links 方法会根据不同的 Response 被调用多次来提取链接。
Link Extractors 在 CrawlSpider 类(在 Scrapy 可用)中使用。通过一套规则,你也可以用它在你的 Spider 中个,即使你不是从 CrawlSpider 继承的子类,因为它的目的很简单:提取链接。
内置 Link Extractor 参考
Scrapy 自带的 Link Extractors 类在 scrapy.contrib.linkextractors 模块提供。
默认的 link extractor 是 LinkExtractor ,其实就是 LxmlLinkExtractor:
from scrapy.contrib.linkextractors import LinkExtractor
在以前版本的 Scrapy 版本中提供了其他的 link extractor,不过都已经被废弃了。
LxmlLinkExtractor
class scrapy.contrib.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), tags=('a', 'area'), attrs=('href', ), canonicalize=True, unique=True, process_value=None)
LxmlLinkExtractor is the recommended link extractor with handy filtering options. It is implemented using lxml’s robust HTMLParser.
它接收来自扫描标签和属性提取每个值, 可以修改该值, 并返回一个新的,或返回 None 完全忽略链接的功能。如果没有给出,process_value 默认是 lambda x: x。
例如,从这段代码中提取链接:
<a href="javascript:goToPage('../other/page.html'); return false">Link text</a>
你可以使用下面的这个 process_value
函数:
def process_value(value): m = re.search("javascript:goToPage\('(.*?)'", value) if m: return m.group(1)