Scrapy_LinkExtractor
文章目录
- 使用LinkExtractor提取链接
- 描述LinkExtractor提取规则
- LinkExtractor构造器参数描述
使用LinkExtractor提取链接
提取页面链接有Selector和LinkExtractor两种方法
因为链接也是页面中的数据,所以可以使用与提取数据相同的方法进行提取,在提取少量(几个)链接或提取规则比较简单时,使用selector就足够了
Scrapy提供了一个专门用于提取链接的类LinkExtractor,在提取大量链接或提取规则比较复杂时,使用LinkExtractor更加方便
描述LinkExtractor提取规则
导入LinkExtractor,位于scrapy.linkextractors模块
from scrapy.linkextractors import LinkExtractor
创建一个LinkExtractor对象,使用一个或多个构造器参数描述提取规则,下面详见
le = LinkExtractor(构造器参数)
调用LinkExtractor对象的extract_links方法传入一个Response对象,该方法依据创建对象时所描述的提取规则,
在Response对象所包含的页面中提取链接,最终返回一个列表,其中的每一个元素都是一个Link对象,即提取到的一个链接
links = le.extract_links(respons)
用links[index]获取Link对象,Link对象的url属性便是链接页面的绝对url地址(无须再调用response.urljoin方法)
url = link[index].url
LinkExtractor构造器参数描述
为了讲解举例,首先制造一个实验环境,创建两个包含多个链接的HTML页面
<!--example1.html-->
<!DOCTYPE html>
<html>
<head><title>LinkExtractor</title>
</head>
<body><div id="top"><p>下面是一些站内链接</p><a class="internal" href="/intro/install.html">Installation guide</a><a class="internal" href="/intro/tutorial.html">Tutorial</a><a class="internal" href="../examples.html">Examples</a></div><div id="bottom"><p>下面是一些站外链接</p><a href="http://stackoverflow.com/tags/scrapy/info">StackOverflow</a><a href="https://github.com/scrapy/scrapy">Fork on Github</a></div>
</body>
</html>
<!--example2.html-->
<!DOCTYPE html>
<html>
<head><title>LinkExtractor</title><script type="text/javascript" src="/js/app1.js"></script><script type="text/javascript" src="/js/app2.js"></script>
</head>
<body><a href="/home.html">主页</a><a href="javascript:goToPage('/doc.html');return false">文档</a><a href="javascript:goToPage('/example.html');return false">案例</a>
</body>
</html>
使用以上两个HTML文本构造两个Requests对象:
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractorhtml1 = open('example1.html', 'rb').read()
html2 = open('example2.html', 'rb').read()respons1 = HtmlResponse(url='http://example1.com', body=html1, encoding='utf-8')
respons2 = HtmlResponse(url='http://example2.com', body=html2, encoding='utf-8')
allow
接受一个正则表达式或一个正则表达式列表,提取绝对url与正则表达式匹配的链接,如果该参数为空(默认),就提取全部链接
示例:提取页面example1.html中路径以/intro开始的链接
pattern = '/intro/.+\.html$'
le = LinkExtractor(allow=pattern)
links = le.extract_links(respons1)
print([link.url for link in links])
# >>>['http://example1.com/intro/install.html', 'http://example1.com/intro/tutorial.html']
deny
接收一个正则表达式或一个正则表达式列表,与allow相反,排除绝对url 与 正则表达式匹配的链接
示例:提取页面example1.html中所有站外链接(即排除站内链接)
from urllib.parse import urlparse
pattern = patten = '^' + urlparse(respons1.url).geturl()
print(pattern) # ^http://example1.comle = LinkExtractor(deny=pattern)
links = le.extract_links(respons1)
print([link.url for link in links])
# >>>['http://stackoverflow.com/tags/scrapy/info', 'https://github.com/scrapy/scrapy']
allow_domains
接收一个域名或一个域名列表,提取到指定域的链接
示例:提取页面example1.html中所有到github.com和stackoverflow.com这两个域的链接
domains = ['github.com', 'stackoverflow.com']
le = LinkExtractor(allow_domains=domains)
links = le.extract_links(respons1)
print([link.url for link in links])
deny_domains
接收一个域名或一个域名列表,与allow_domains相反,排除到指定域的链接。
示例:提取页面example1.html中除github.com域以外的链接
le = LinkExtractor(deny_domains='github.com')
links = le.extract_links(respons1)
print([link for link in links])
restrict_xpaths
接收一个XPath表达式或一个XPath表达式列表,提取XPath表达式选中区域下的链接
示例:提取页面example1.html中<div id = 'top’元素下的链接
le = LinkExtractor(restrict_xpaths='//div[@id = "top"]')
links = le.extract_links(respons1)
print([link for link in links])
restrict_css
接收一个CSS选择器或一个CSS选择器列表,提取CSS选择器选中区域下的链接
示例:提取页面example1.html中<div id = 'bottom’元素下的链接
le = LinkExtractor(restrict_css='div#bottom')
links = le.extract_links(respons1)
print([link for link in links])
tag
接收一个标签(字符串)或一个标签列表,提取指定标签内的链接,默认为[‘a’, ‘area’]
attrs
接收一个属性(字符串)或一个属性列表,提取指定属性内的链接,默认为[‘href’]
示例:提取页面example2.html中引用JavaScript文件的链接
le = LinkExtractor(tags='script', attrs='src')
links = le.extract_links(respons2)
print([link.url for link in links])
process_value
接收一个形如func(value) 的回调函数,如果传递了该参数,LInkExtractor将调用该回调函数
对提取的每一个链接(如a 的 href)进行处理,回调函数正常情况下应返回一个字符串(处理结果),
想要抛弃所处理的链接时,返回None
示例:在页面example2.html中,某些a的href属性是一段JavaScript代码,代码中包含了链接页面
的实际url地址,此时应对链接进行处理,提取页面example2.html中所有实际链接
import re
def process(value):m = re.search("javascript:goToPage\('(.*?)'", value)# 如果匹配,就提取其中url并返回,不匹配则返回原值if m:value = m.group(1)return valuele = LinkExtractor(process_value=process)
links = le.extract_links(respons2)
print([link.url for link in links])
# >>>['http://example2.com/home.html', 'http://example2.com/doc.html', 'http://example2.com/example.html']
LinkExtractor构造器的所有参数都有默认值,如果构造器对象不传递任何参数,就提取页面中所有链接
Scrapy_LinkExtractor相关推荐
最新文章
- Nginx三部曲之一【配置文件详解】
- js在firefox中的问题
- Fisher Vector(FV)向量
- js 时间比较_成都js聚合物弹性防水涂料生产厂家来电洽谈_鹏晨防水
- laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...
- 程序显示文本框_C++入门到精通(二),编写我们自己的Hello World程序
- OpenCASCADE:拓扑 API之偏移、拔模、管道和演变形状
- Boost::context模块callcc的解析器测试程序
- 小苏打到底能不能碱化尿液
- Django使用消息提示简单的弹出个对话框
- 在Ubuntu下进行MongoDB安装步骤
- UI组件-UIPickerView
- 多线程android代码,android入门 — 多线程(一)(示例代码)
- [Java] 蓝桥杯ALGO-152 算法训练 8-2求完数
- 去掉谷歌浏览器中烦人的广告
- 后端技术栈学习路线与面试技巧指北
- 中国省市地图JSON数据下载
- 爬虫实战(自用)requests模块、聚焦爬虫(数据解析)、selenium模块
- “科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 F.排列计算
- pdf文档页码怎么添加?分享这几个pdf加页码方法给你
热门文章
- 0914-npm EACCES: permission denied权限问题官网终极解决办法
- 淘宝网手机客户端开发(一)目录篇
- 概率图模型(PGM)/马尔可夫随机场(MRF)/条件随机场基本概念(CRF)
- Selenium常用API的使用java语言之6-WebDriver常用方法
- Centos7 yum install chrome
- cpu高 load 高 内存高 io 高怎么排查
- JDBC学习笔记(6)——获取自动生成的主键值处理Blob数据库事务处理
- 在减少对内地房地产投资的同时,加快了在内地零售业的布局;并积极推动“走出去”战略,在全球52个国家投资多种业务。...
- flutter闪屏过渡动画,闪光占位动画
- JavaScript设计模式(一)-- 简单工厂模式