前言
本文中如有错误,望指正。
背景
日常爬取一个网站时,想要爬取的数据分布在多个页面中,每个页面包含一部分数据以及到其它页面的链接,提取页面中数据的方法想必大家都有了解,最最最直接的就是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')
从此可以看出,现在只剩下了需要的链接 。
以上仅供大家参考,作为熟悉的例子。