使用LinkExtractor提取链接
先回顾一下我们前边是如何提取链接地址的
#以网站http://books.toscrape.com/index.html为例,提取下一页的链接地址
#我们来提取一下 >>> response.css('li.next a::attr(href)').extract_first() 'catalogue/page-2.html' #我们已经提取出来了,但是这是一个相对的地址我们如果要在程序中使用,要将其拼接成绝对的地址 #部分代码 next_url = response.css('li.next a::attr(href)').extract_first() if next_url: next_url = response.urljoin(next_url) #拼接url地址 yield scrapy.Request(url=next_url,callback=self.parse) #拼接的形式是start_urls中的内容+next_url
下面使用LinkExtractor的方式来提取url
>>> from scrapy.linkextractors import LinkExtractor >>> le = LinkExtractor(restrict_css=('li.next')) >>> links = le.extract_links(response) >>> for link in links: print(link.url) ... http://books.toscrape.com/catalogue/page-2.html
#导入LinkExtractor
#创建一个LinkExtractor对象,并传入一个restrict_css参数用来描述下一页链接的区域
#调用extract_links方法传入response对象,根据描述的规则在response中提取链接返回link对象
#上边只用一个对象我们还可以使用links[0].url来访问
#注:link对象的url属性便是页面的绝对url地址,不需要再调用response.urljoin方法了
再来介绍一下LinkExtractor构造器的参数
allow:接收一个正则表达式,提取绝对url和正则表达式匹配的链接 deny:接收一个正则表达式,排除绝对url和正则表达式匹配的链接 allow_domains:接收一个域名或域名列表,提取指定域名的链接 deny_domains:接收一个域名或域名列表,排除指定域名的链接 restrict_xpaths:接收一个xpath表达式,提取xpath区域中的链接 restrict_css:接收一个css表达式,提取css区域中的链接 tags:接收一个标签(字符串),提取指定标签的链接,默认为['a','area'] attrs:接收一个属性(字符串),提取属性中的链接,默认为['href'] 如:提取JavaScript文件中的链接 LinkExtractor(tags='script',attrs='src') process_value:接收一个形如func(value)的回调函数。如果传递了该参 数,LinkExtractor将调用该回调函数对提取的每一个链接 (如a的href)进行处理,回调函数正常情况下应返回一个 字符串(处理结果),想要抛弃所处理的链接时,返回 None。 >>> import re >>> def process(value): ... m = re.search("javascript:goToPage\('(.*?)'", value) ... # 如果匹配,就提取其中url 并返回,不匹配则返回原值 ... if m: ... value = m.group(1) ... return value … >>> from scrapy.linkextractors import LinkExtractor >>> le = LinkExtractor(process_value=process) >>> links = le.extract_links(response2) >>> [link.url for link in links] ['http://example2.com/home.html', 'http://example2.com/doc.html', 'http://example2.com/example.html']