# 爬虫的读书笔记
《自己动手写网络爬虫》,并基于Python3和Java实现
## 为什么采用宽度优先搜索策略?
1. 深度优先遍历可能会在深度上过“深”而陷入“黑洞”;
2. 重要的网页往往距离种子网页比较近,越深的网页的重要性越低;
3. 万维网深度最多17层,但到达某面总存在一条很短的路径,宽度优先遍历会以最快的速度达到这个网页;
4. 宽度优先遍历有利于多爬虫的合作抓取,多爬虫合作通常先抓取站内链接,抓取的封闭性很强;
## 解析HTML网页---Jsoup
```
Maven中配置:
<dependency>
<groupId>org.jsoup</gorup>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
```
## 正则表达式:
- 对URL进行过滤,只提取符合特定格式的链接;
- 提取网页内容;
## HTMLParser:
- 文本抽取;
- 链接抽取;
- 资源抽取;
- 链接检查;
- 站点检查;
- URL重写;
- 广告清除;
- 将HTML页面转化成XML页面;
- HTML页面清理;
Rhino是一个由Java实现的JavaScript语言解析引擎,Rhino的主要功能是管理脚本执行时的运行环境
# 非HTML解析:
1. PDF文件:PDFBox解析PDF文件
- FontBox:处理PDF字体的Java类库
- JempBox处理XMP元数据 的Java类库
2. Office文档:POI项目
- POI读写Excel、Word、PPT文件
- POI-HSMF读写Outlook
- POI-HDGF读写Visio
- POI-HPBF支持Publisher
3. 其他文件
## 多媒体内容抽取:
1. 抽取视频内容
- 视频内容一般分为四部分:帧、镜头、情节和节目
- 关键帧的提取---动态规则策略、基于视觉模型的自适应关键帧提取策略、基于镜头边界系数的关键帧提取策略
2. 基于镜头边界系数的关键帧提取分3个步骤进行:
- 设置最大关键帧数M
- 每个镜头的非边界过渡区的第一帧确定为关键帧 【找镜头边界:基于帧差的镜头边界检测方法、基于模型的镜头边界检测方法、基于学习的镜头边界检测方法】
- 使用非极大值抑制法确定镜头边界系数极大值并排序,以实现基于镜头边界系数的关键帧提取
3. JMF(Java视频处理):
- 功能
- a)在Java Applet和应用程序中播放贵重物品媒体文件,如AVI、MPEG、WAV等;
- b)可以播放从互联网上下载的媒体流;
- c)可以利用麦克风、摄像机等设备截取音频和视频,并只在成多媒体文件;
- d)处理多媒体文件,转换成文件格式;
- e)向互联网上传音频和视频数据流;
- f)在互联网上播放音频和视频数据;
- 组件
- a)数据源,如一个媒体文件
- b)截取设备,如麦克风、摄像机等
- c)播放器-Player,JMF中的接口是Player,将音频/视频数据流作为输入,将数据流输出到音箱或屏幕上
- d)处理器-Processor,Processor接口继承了Player接口,支持Player对象所支持的功能外还可以控制对于输入的多媒体数据流进行何种处理以及通过数据源向其他Player对象或Processor对象输出数据
- e)数据格式-Format,保存多媒体格式信息
- f)管理器,4种管理器Manager、PackageManager、CaptureDeviceManager、PlugInManager
4. Sourceforge-org.farng.mp3(Java音频处理):
- 音乐:歌手名+歌曲名等元信息,以MP3文件大体分为三部分:
- a) TAG_V2(ID3V2) 包含了作者、作曲、专辑等信息,长度不固定,扩充ID3V1信息
- b) Frame 一系列的帧,由帧头(MP3的位率、采样率、版本等信息)和数据实体两部分组成
- c) TAG_V1(ID3V1) 包含作者、作曲、专辑等信息,长度128字节
# 解析Json数据---Json
```
Maven中配置:
<dependency>
<groupId>com.alibabap</gorup>
<artifactId>fastjson</artifactId>
<version>1.2.35.3</version>
</dependency>
```
# 评估页面的重要程度
1. 链接的欢迎程度---反向链接(即指向当前URL的链接)的数量和质量决定的,定义为IB(P);
2. 链接的重要程度---关于URL字符串的函数,仅仅考察字符串本身,比如认为".com"和"home"的URL比".cc"和"map"高,定义为IL(P);
3. 平均链接的深度---根据上面所分析的宽度优先的原则,计算全站的平均链接深度,然后认为距离种子站点越近的重要性越高,定义为ID(P);
则网页的重要性I(P)=X*IB(P)+Y*IL(P),ID(P)由宽度优先遍历规则保证
# 爬虫队列
保存爬下来的URL,具备以下几个特点:
1. 能够存储海量数据,当内存容量不够时可以固化在硬盘;
2. 快速存取数据;
3. 支持多线程访问;
因此采用Hash存储,一般选取URL作为key值,选取MD5压缩算法
# 爬虫架构
## 一、应该满足的条件
1. 分布式
2. 可伸缩性:能通过增加额外的机器和带宽提高抓取速度
3. 性能和有效性:有效使用系统资源,如CPU、网络带宽、和存储空间
4. 质量:针对大部分网络不能及时出现在用户查询中,所以应该首先抓取重要网页
5. 新鲜性:持续运行
6. 更新:爬虫应该取得已获取网页的新的拷贝,例如网站的回贴功能
7. 可扩展性:为了能够支持新的数据格式和新的抓取协议,爬虫应该设计成模块化的形式
## 二、实现异步I/O的框架
1. Mina-借由Java的NIO的反应式实现的模拟前摄式模型;
2. Grizzly-Web服务器GlassFish的I/O核心;
3. Netty-NIO客户端服务器框架;
4. Naga-把普通的Socket和ServerSocket封装成支持NIO的形式;
# 一致性Hash(Consistent Hash)
解决因特网中的热点(Hot Spot)问题
1. 单调性-如果已经有内容通过哈希分配到了相应的缓存中,而又有新的缓冲加入到系统,哈希的结果应该能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区
2. 平衡性-哈希的结果能够尽可能分布到所有缓冲中去,这样使得所有的缓冲空间都得到利用
3. 分散性-不同终端将相同内容映射到不同缓冲中去,好的哈希算法应该能够尽量避免这种不一致的情况发生
4. 负载-(从另一个角度看待分散性问题)对特定的缓冲区,也可能被不同用户映射为不同的内容
# 存储
1. Berkeley DB, 内存数据库,内存数据结构并不适合大规模爬虫的应用
- 底层实现B树;
- key/value结构;
- 布隆过滤器;
2. Heritrix,成熟的开源爬虫软件
- 封闭Berkeley DB,存放所有待处理的链接,过滤已被抓取的连接(BdbUriUniFilter);
- 模块化的设计,各模块由CrawlController类协调,负责整个爬虫任务的开始的结束;
# Nutch
> 开源Java搜索引擎(全文搜索 + Web爬虫)
宽度优先搜索对网页进行抓取,但主要着重【存储】和【爬虫】两过程
- 【存储】数据文件有三类:
- Web database(WebDB):只在爬虫过程中使用,存储爬虫抓取的网页之间的链接结构信息---Page和Link。WebDB存储了所抓取网页的链接结构图,在链接结构图中Page为节点,Link为边
- a) Page:描述网页的特征信息,包括网页内的链接数目、抓取此网页的时间等相关抓取信息,对网页的重要度评分
- b) Link:描述两Page之间的链接关系
- segment:存储一次抓取过程抓到的网页以及这些网页的索引(一次爬行会产生很多个段),爬虫爬行过程会根据WebDB中链接关系按
关于Java和Python爬虫那些事儿.zip
需积分: 0 22 浏览量
更新于2023-12-30
收藏 27.73MB ZIP 举报
在IT行业中,爬虫技术是数据获取的重要手段,它允许我们自动地从互联网上抓取大量信息。本压缩包文件“关于Java和Python爬虫那些事儿.zip”可能包含与使用Java和Python这两种语言进行网络爬虫相关的教程、代码示例或资源。尽管描述中只提到了“python”,但标题暗示了内容可能涵盖两种语言。
让我们深入了解一下Python爬虫。Python因其简洁的语法和丰富的第三方库而成为爬虫开发者的首选。其中,最著名的库包括BeautifulSoup、Scrapy和Requests。BeautifulSoup用于解析HTML和XML文档,使得提取网页数据变得简单。Scrapy是一个强大的框架,它提供了一整套解决方案,包括请求管理、响应解析、数据存储等。Requests库则用于发送HTTP请求,它是Python爬虫的基础,可以轻松地获取网页内容。
在Python中,爬虫的基本流程通常包括以下步骤:
1. 发送HTTP请求:使用requests库向目标URL发送GET或POST请求。
2. 解析响应:获取服务器返回的HTML内容,用BeautifulSoup解析,查找目标数据。
3. 数据提取:通过CSS选择器或XPath定位到目标元素,提取所需信息。
4. 数据存储:将提取的数据保存为文件或存入数据库。
接下来,我们转向Java爬虫。虽然Python更为流行,但Java也有其优势,如性能强、跨平台以及丰富的库支持,如Jsoup、Apache HttpClient和HtmlUnit。Jsoup是一个用于处理实际世界HTML的Java库,它的API设计得非常直观,可以方便地解析和操作HTML。Apache HttpClient是用于执行HTTP请求的强大工具,而HtmlUnit则是一个无头浏览器,可模拟真实用户行为,对于JavaScript渲染的页面尤为有用。
Java爬虫的基本流程与Python类似,但也有一些不同之处,例如:
1. 创建HttpClient实例,配置请求参数,并执行请求。
2. 获取响应内容,通常是以InputStream形式,然后用Jsoup解析。
3. 使用Jsoup的API找到并提取目标数据。
4. 存储数据,这一步与Python相似,可以选择文件系统、数据库或其他持久化方式。
至于压缩包内的子文件“9843”,由于没有具体信息,可能是代码示例、文档教程或者数据文件。如果包含Python代码,可能会有如何设置User-Agent、处理反爬机制(如验证码、IP限制)以及爬虫项目的结构设计等内容。如果是Java代码,可能涉及线程池的使用、异常处理和更复杂的网络请求管理。
Java和Python在爬虫领域的应用各有优劣,选择哪种语言主要取决于项目需求、个人技能和团队偏好。Python适合快速开发和原型验证,而Java更适合大型、高性能的爬虫项目。学习和掌握这两种语言的爬虫技术,将使你在数据获取方面拥有更全面的能力。