西山小菜鸟之Scrapy学习笔记---LinkExtractor

前言

    本文中如有错误,望指正。

背景

    日常爬取一个网站时,想要爬取的数据分布在多个页面中,每个页面包含一部分数据以及到其它页面的链接,提取页面中数据的方法想必大家都有了解,最最最直接的就是xpath了,提取链接的方法则有Selector和LinkExtractor两种方法 。

理论

    接着上面所说,提取链接的方法则有Selector和LinkExtractor两种方法 :

  • 使用Selector
        因为链接也是页面中的数据,所以可以使用与提取数据相同的方法进行提取(可以使用xpath、beautifulsoup等),在提取少量链接或提取规则比较简单时,使用Selector就足够了。
  • 使用LinkExtractor
        Scrapy提供了一个专门用于提取链接的类LinkExtractor,在提取大量链接或提取规则比较复杂时,使用LinkExtractor更加方便。
        每个链接提取器唯一的公共方法是extract_links接收一个Response对象并返回一个 scrapy.link.Link 对象列表。链接提取器意在被实例化一次,并且它们的 extract_links 方法被调用几次,具有不同的响应以提取跟随的链接。
         使用简介:
from scrapy.linkextractors import LinkExtractor
le = LinkExtractor()                          #括号中为提取规则(参数)
links = le.extract_links(response)
for link in links:                            #若链接有多个,可用for循环逐个打印
	print('提取到的链接为:',link.url)         #link.url为具体链接
  • allow
    接收一个正则表达式,提取绝对url与正则表达式匹配的链接,如果该参数为空,就提取全部链接。
>>>from scrapy.linkextractors import LinkExtractor
>>>pattern = '正则'
>>>le = LinkExtractor(allow=pattern)
>>>links = le.extract_links(response)
>>>[link.url for link in links]
>>>提取到的链接
  • deny
    接收一个正则表达式或正则表达式列表,与allow相反,排除绝对url与正则表达式匹配的链接。此处不再给出示例。
  • allow_domains
    接收一个域名或一个域名列表,提取摘取到指定域的链接
>>>from scrapy.linkextractors import LinkExtractor
>>>domains = ['github.com','stackoverflow.com']
>>>le = LinkExtractor(allow_domains=domains)
>>>links = le.extract_links(response)
>>>[link.url for link in links]
>>>提取到的链接
  • deny_domains
    接收一个域名或一个域名列表,与allow_domains相反,排除到指定域的链接。此外不再给出示例。
  • restrict_xpaths
    接收一个XPath表达式或一个表达式列表,提取XPath表达式选中区域下的链接。
>>>from scrapy.linkextractors import LinkExtractor
>>>le = LinkExtractor(restrict_xpaths='xpath路径')
>>>links = le.extract_links(response)
>>>[link.url for link in links]
>>>提取到的链接
  • restrict_css
    接收一个CSS选择器或列表,CSS选择器选中区域下的链接。
>>>from scrapy.linkextractors import LinkExtractor
>>>pattern = '正则'
>>>le = LinkExtractor(restrict_css='CSS路径')
>>>links = le.extract_links(response)
>>>[link.url for link in links]
>>>提取到的链接
  • tags
    接收一个标签(字符串)或一个标签列表,提取指定标签内的链接,默认为[‘a’,‘area’]
  • attrs
    接收一个属性(字符串)或一个属性列表,摘取指定属性内的链接,默认为[‘href’]
>>>from scrapy.linkextractors import LinkExtractor
>>>le = LinkExtractor(tags='script',attrs='src')
>>>links = le.extract_links(response)
>>>[link.url for link in links]
>>>提取到的链接

示例

    以网站http://www.hotelaah.com/ipo/index.html为例,现准备提取出网站中对应城市的链接。
在这里插入图片描述
    如图所示,每个城市的链接为需要的链接 ,而右边的如“电话区号”、“邮政编码”等为不需要的链接。下面给出Scrapy中的规例代码:

  • 示例1
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor

class ShangshiSpider(scrapy.Spider):
    name = 'shangshi'
    allowed_domains = ['hotelaah.com']
    start_urls = ['http://www.hotelaah.com/ipo/index.html']

    def parse(self, response):
        le = LinkExtractor(restrict_xpaths='//table/tr/td/table//li/a')
        links = le.extract_links(response)
        for link in links:
            print(link.url)

    查看元素得到链接的xpath路径,则提取的链接为:
在这里插入图片描述
    从提取结果中可以看到,提取的链接中包含一些我们并不需要的链接。

  • 示例2
le = LinkExtractor(restrict_xpaths='//table/tr/td/table//li/a',deny='.+index.html')

在这里插入图片描述
    从上图可以看出,加个deny参数后,过滤掉了部分不需要的链接。

  • 示例3
le = LinkExtractor(allow='http://www\.hotelaah\.com/ipo/.+\.html',deny='.+index.html')

在这里插入图片描述
    从此可以看出,现在只剩下了需要的链接 。
    以上仅供大家参考,作为熟悉的例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值