1, 背诵单词: assault 猛烈地攻击, 袭击 principal 最重要的, 主要的 consumption 消费(量), 消耗 sniff . 嗅... 味道; 抽鼻涕 extensive 广大的, 广阔的 tolerance 宽容 denote 表示, 意味着 fierce 凶猛的, 残忍的 idiot 白痴; 笨蛋 regarding 关于, 有关 surge 汹涌; 彭湃 railroad 铁路 coordinate 同等的, 并列的 renovate 更新, 修复 efficiency 效率; 功效 gown 长袍 cotton 棉花; 棉线 minor 较小的, 较小的 magistrate 地方行政官 whale n. 鲸; 庞然大物
2, 做爬取北京信件网页内容并学习 Java 爬虫 webMagic 框架观看视频: https://www.bilibili.com/video/av48765648? 23 到 33 集
1, 添加 webMagic 依赖
2, 添加资源文件 log4j.properties
3,WebMagic 的结构分为 Downloader,PageProcessor,Scheduler,Pipeline 四大组件,
1.Downloader
Downloader 负责从互联网上下载页面, 以便后续处理. WebMagic 默认使用了 Apache HttpClient https://hc.apache.org/index.html 作为下载工具.
2.PageProcessor
PageProcessor 负责解析页面, 抽取有用信息, 以及发现新的链接. WebMagic 使用 Jsoup http://jsoup.org/ 作为 HTML 解析工具, 并基于其开发了解析 XPath 的工具 Xsoup https://github.com/code4craft/xsoup .
在这四个组件中, PageProcessor 对于每个站点每个页面都不一样, 是需要使用者定制的部分.
3.Scheduler
Scheduler 负责管理待抓取的 URL, 以及一些去重的工作. WebMagic 默认提供了 JDK 的内存队列来管理 URL, 并用集合来进行去重. 也支持使用 Redis 进行分布式管 理. 除非项目有一些特殊的分布式需求, 否则无需自己定制 Scheduler.
4.Pipeline
Pipeline 负责抽取结果的处理, 包括计算, 持久化到文件, 数据库等. WebMagic 默认提供了 "输出到控制台" 和 "保存到文件" 两种结果处理方案. Pipeline 定义了结 果保存的方式, 如果你要保存到指定数据库, 则需要编写对应的 Pipeline. 对于一类需求一般只需编写一个 Pipeline.
4, 常用对象:
1. Request
Request 是对 URL 地址的一层封装, 一个 Request 对应一个 URL 地址. 它是 PageProcessor 与 Downloader 交互的载体, 也是 PageProcessor 控制 Downloader 唯一方 式. 除了 URL 本身外, 它还包含一个 Key-Value 结构的字段 extra. 你可以在 extra 中保存一些特殊的属性, 然后在其他地方读取, 以完成不同的功能. 例如附加上一个页 面的一些信息等.
2. Page
Page 代表了从 Downloader 下载到的一个页面 -- 可能是 HTML, 也可能是 JSON 或者其他文本格式的内容. Page 是 WebMagic 抽取过程的核心对象, 它提供一些方法 可供抽取, 结果保存等. 在第四章的例子中, 我们会详细介绍它的使用.
3. ResultItems
ResultItems 相当于一个 Map, 它保存 PageProcessor 处理的结果, 供 Pipeline 使用. 它的 API 与 Map 很类似, 值得注意的是它有一个字段 skip, 若设置为 true, 则不 应被 Pipeline 处理.
5, 抽取元素:
xpath 方法:
- // 查找所有的 "B"
- var xpath="//B";
- // 查找所有元素
- xpath = "//*";
- // 选择所有路径依附于 / A/B / 的元素
- xpath ="/A/B/*";
- // 选择所有的有 3 个祖先元素的 B 元素
- xpath ="///*/B" ;
- // 选择所有父元素是 DDD 的 BBB 元素
- xpath="//C/D";
- // 选择 A/B/C 的第一个 E 子元素
- xpath="/A/B/C/E[1]";
- // 选择 A/B/C 的最后一个 E 子元素
- xpath="/A/B/C/E[last()]" ;
- // 选择有 name 属性的 B 元素
- xpath = "//B[@name]" ;
- // 选择所有的 name 属性
- xpath="//@name";
- // 选择有任意属性的 B 元素
- xpath="//B[@*]";
- // 选择没有属性的 B 元素
- xpath="//B[not(@*)]";
- // 选择含有属性 id 且其值为'e2'的 E 元素
- xpath="//E[@id='e2']";
- // 选择含有属性 name 且其值 (在用 normalize-space 函数去掉前后空格后) 为'b'的 B 元素
- xpath="//B[normalize-space(@name)='b']";
- // 选择含有 2 个 B 子元素的元素
- xpath="//*[count(B)=2]";
- // 选择含有 3 个子元素的元素
- xpath="//[count()=3]";
- // 选择所有名称为 B 的元素(这里等价于 //B)
- xpath="//*[name()='B']";
- // 选择所有名称以 "W" 起始的元素
- xpath="//*[starts-with(name(),'W')]";
- // 选择所有名称包含 "W" 的元素
- xpath="//*[contains(name(),'W')]";
- // 选择名字长度为 2(大于, 小于)的元素;
- xpath="//*[string-length(name()) = 2]";
- xpath="//*[string-length(name()) <2]";
- xpath="//*[string-length(name())> 1]";
- // 多个路径可以用分隔符 | 合并在一起, 可以合并的路径数目没有限制, 选择所有的 WF 和 C 元素
- xpath="//WF | //C";
- // 等价于 / A
- xpath="/child::A";
- // 等价于 //C/D
- xpath="//child::C/child:: D";
3, 遇到的问题: 对 Java 集合的操作不熟练
4, 明天计划: 继续将爬取的数据进行分析并学习 hive 的使用
来源: http://www.bubuko.com/infodetail-3415329.html