在处理少量,规则简单的链接时,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
浙公网安备 33010602011771号