大家好, 前几篇文章一直提到用 xpath 去解析 html 由于是演示代码, 所以看上去都简洁明了的其实在生产环境下, 我们需要获取的数据往往不是一点点, 如何让获取数据的代码写的更加清晰优雅呢?
本篇文章尝试用注解的方式实现一下, 大家看看是否好一点
1) 目标
随便找一个网站, 获取上面列表类的数据
2) 之前的解析类
在 process 方法中围绕我们想要的数据, 努力去定位查找
- package com.cv4j.netdiscovery.example;
- import com.cv4j.netdiscovery.core.domain.Page;
- import com.cv4j.netdiscovery.core.parser.Parser;
- import java.util.List;
- public class TestParser implements Parser {
- @Override
- public void process(Page page) {
- // 最新网申
- List<String> newApplyList = page.getHtml().xpath("//dl[@id='dlFull']/dd/div/div/p[@title]/a/text()").all();
- page.getResultItems().put("newApplyList", newApplyList);
- // 最新实习
- List<String> newWorkList = page.getHtml().xpath("//dl[@id='dlPart']/dd/div/div/p[@title]/a/text()").all();
- page.getResultItems().put("newWorkList", newWorkList);
- }
- }
3) 使用注解之后的解析类
只要继承类 AnnotationParser, 不要实现接口 Parser
别忘记添加 super.process(page)
在 pipeline 类中, 用变量名称作为 key 从 map 中获取对应的值
可以用框架自带的 ConsolePipeline 类做测试
- package com.cv4j.netdiscovery.example;
- import com.cv4j.netdiscovery.core.domain.Page;
- import com.cv4j.netdiscovery.core.parser.AnnotationParser;
- import com.cv4j.netdiscovery.core.parser.annotation.ExtractBy;
- import java.util.List;
- public class TestParser extends AnnotationParser {
- // 最新网申
- @ExtractBy.XPath("//dl[@id='dlFull']/dd/div/div/p[@title]/a/text()")
- private List<String> newApplyList;
- // 最新实习
- @ExtractBy.XPath("//dl[@id='dlPart']/dd/div/div/p[@title]/a/text()")
- private List<String> newWorkList;
- @Override
- public void process(Page page) {
- super.process(page); // 这行代码不能缺
- //process 里一行代码也不用写, 在上面通过注解就可以获取我们要的数据了
- }
- }
4) 运行结果
首页上最新网申和最新实习的标题数据如下:
5) 总结
总之, 打造框架的目标是希望能用的前提下, 用的更好更爽好像汽车品牌一样, 虽然都是四个轮子的, 几万的也有, 几十万的也很多
有兴趣的小伙伴可以关注这个爬虫框架 NetDiscovery, 基本上每周都有更新的
来源: https://juejin.im/post/5a9666265188257a5911f73f