使用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']

 

posted @ 2020-05-07 10:40  风之老凌  阅读(458)  评论(0)    收藏  举报