【重磅推荐】scrapy框架之链接提取LinkExtractor对象的使用(这里有一个很大的坑,新手都会犯的一个错误)

官方文档(LinkExtractor参数细节):https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/link-extractors.html

 

LinkExtractor参数大全:

allow:接收一个正则表达式或一个正则表达式列表,提取绝对url于正则表达式匹配的链接,如果该参数为空,默认全部提取。

deny:接收一个正则表达式或一个正则表达式列表,与allow相反,排除绝对url于正则表达式匹配的链接,换句话说,就是凡是跟正则表达式能匹配上的全部不提取。

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

deny_domains:和allow_doains相反,拒绝一个域名或一个域名列表,提取除被deny掉的所有匹配url。

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

restrict_css:这参数和restrict_xpaths参数经常能用到,所以同学必须掌握

tags:接收一个标签(字符串)或一个标签列表,提取指定标签内的链接,默认为tags=(‘a’,‘area’)

attrs:接收一个属性(字符串)或者一个属性列表,提取指定的属性内的链接,默认为attrs=(‘href’,),示例,按照这个中提取方法的话,这个页面上的某些标签的属性都会被提取出来,如下例所示,这个页面的a标签的href属性值都被提取到了

process_value (callable) :它接收来自扫描标签和属性提取每个值, 可以修改该值, 并返回一个新的, 或返回 None 完全忽略链接的功能。如果没有给出, process_value 默认是 lambda x: x

cononicalize=(boolean) 规范化每个提取的url(使用w3lib.url.canonicalize_url)。默认为True。

unique=(boolean) 是否应对提取的链接应用重复过滤。

务必注意:提取css、jpg、png、js等有些链接的时候,process_value函数收到后给过滤了!所有link提取的值都会经过process_value这个函数,如果这个函数没指定,默认为lambda x: x

 LinkExtractor中allow正则表达式必须是没有被过滤的链接,否则返回来会是空(css、jpg、png、js文件类链接process_value函数过滤之后,返回来都是空列表

class BookSpider(Spider):
    name = 'url'

    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']


    def parse(self, response):
        所有link提取的值都会经过process_value这个函数,如果这个函数没指定,默认为lambda x: x
        务必注意:提取css、jpg、png、js等有些链接的时候,process_value函数收到后给过滤了!
        下载文件或获取最全的链接一定要重写process_value函数
        link = LinkExtractor(allow=["[\w\W]+?\.css"],tags=["img","script","link","a","area"],
                             attrs=["href","src"],
                             process_value=self.process_value)


        此方法是每个linkextractor有唯一的公共方法,接收一个Response对象, 并返回一个scrapy.link.Link对象
        extract_links函数会等待process_value函数执行完毕之后把css、jpg、png、js这里文件链接过滤掉后,在返回链接列表
        LinkExtractor中allow正则表达式必须是没有被过滤的链接,否则返回来会是空!
        links = link.extract_links(response)

        a = 1


    处理LinkExtractor提取出来的每一个链接,默认函数为lambda x: x
    这里断点调试很方便查看每一条链接的结果!
    def process_value(self,value):
        print(value)
        return value+".html"

猜你喜欢

转载自blog.csdn.net/weixin_43343144/article/details/87901268