在处理少量,规则简单的链接时,Selector足够应付。

在处理大量或规则复杂的链接时,使用LinkExtractor更加方便

使用流程

第一步,需要从scrapy.linkextractors中导入LinkExtractor

第二步,创建一个此类的实例(限定了筛选的链接格式)

第三步,调用这个实例的extract_link的方法(进行筛选)

import scrapy
# 导入LinkExtractor 
from scrapy.linkextractors import LinkExtractor

class BookSpider(scrapy.Spider):
    name = 'book'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        # 创建一个实例,传入目标链接的格式
        le = LinkExtractor(restrict_xpaths='//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a')
      # 调用实例的extract方法,传入需要提取的response
        link_list = le.extract_links(response)
        for link in link_list:
        # url属性会返回一个绝对url
            print(link.url)

 

LinkExtractor

LinkExtractor是一个专门用于提取链接的类,在使用时你需要根据目标链接的具体情况传入不同参数,构造一个实例。

def __init__(
    self,
    allow=(),
    deny=(),
    allow_domains=(),
    deny_domains=(),
    restrict_xpaths=(),
    tags=('a', 'area'),
    attrs=('href',),
    canonicalize=False,
    unique=True,
    process_value=None,
    deny_extensions=None,
    restrict_css=(),
    strip=True,
    restrict_text=None,
):

 __init__中所有的参数都有默认值,如果在构造实例时没有给参数传入数值,则这个实例在调用时会提取页面中所有的链接。

  • allow

接收一个正则表达式或一个正则表达式列表,提取绝对url与正则表达式匹配的链接

# 创建一个正则表达式格式
pattern = '/intro/.+\.html$'  
le = LinkExtractor(allow = pattern)  
  • deny

接收一个正则表达式或一个正则表达式列表,与allow相反,排除绝对url与正则表达式匹配的链接

  • allow_domains

接收一个域名或一个域名列表,提取到指定域的链接。

patter = '^http://example.com'
le = LinkExtractor(allow_domains = patter)
  • deny_domains

接收一个域名或一个域名列表,与allow_domains相反,排除到指定域的链接。

  • restrict_xpaths

接收一个XPath表达式或一个XPath表达式列表,提取XPath表达式选中区域下的链接。

_xpath = '//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a' 
le = LinkExtractor(restrict_xpaths= _xpath)
  • tags=('a', 'area')

接收一个标签(字符串)或一个标签列表,提取指定标签内的链接,默认为['a', 'area']。

  • attrs=('href',)

接收一个属性(字符串)或一个属性列表,提取指定属性内的链接,默认为['href']。

  • canonicalize

规范化每个提取的url

  • unique

是否应对提取的链接应用重复过滤。

  • process_value

接收一个形如 func(value) 的回调函数。如果传递了该参数,LinkExtractor将调用该回调函数对提取的每一个链接(如a的href)进行处理,回调函数正常情况下应返回一个字符串(处理结果),想要抛弃所处理的链接时,返回None。

  • deny_extensions

字符串或字符串的列表,属于该后缀名的链接不会被爬取,若不提供的话,会默认为 scrapy.LinkExtractor模块中定义的 IGNORED_EXTENSIONS 列表。

  • restrict_css

接收一个CSS选择器或一个CSS选择器列表,提取CSS选择器选中区域下的链接。

  • strip = True

是否从提取的属性中删除空格。根据HTML5标准,前导和尾部空格必须从被剥离href的属性<a>,<area>以及许多其他的元素,src属性<img>,<iframe>元件等,所以LinkExtractor默认条空间字符。设置strip=False将其关闭(例如,如果要从允许前导/后缀空格的元素或属性中提取网址)。

  • restrict_text=None,

链接的文本必须匹配的单个正则表达式才能被提取。如果给定正则表达式列表,则将提取至少匹配一个的链接。

 

extract_links

LinkExtractor实例的方法。接收一个页面response,返回由link组成的列表。

def parse(self, response):
    # 创建一个实例,传入目标链接的格式
    le = LinkExtractor(restrict_xpaths='//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a')
    # 调用实例的extract方法,传入需要提取的response
    link_list = le.extract_links(response)
    print('长度:' , len(link_list))
    for link in link_list:
        # url属性会返回一个绝对url
        print(link.url)

 

link

对象表示提取的链接。拥有以下属性

  • url

返回此link的绝对url

  • text

返回标签中的文本

  • fragment

网​​址中 #(哈希符号)后面的部分。

  • nofollow

 指示rel标记标签属性中是否存在nofollow值。

nofollow是HTML页面中a标签的属性值。目的是告诉搜索引擎"不要追踪此网页上的链接"或"不要追踪此特定链接"。即告诉搜索引擎这个链接不是经过作者信任的。

 posted on 2021-03-25 15:34  宁青楼  阅读(192)  评论(0)    收藏  举报