linux cpu占用率如何看
318
2022-09-06
htmlunit+quartz定时抓取博文并生成jsp页面
前言分析网页
页码分析文章链接分析文章内容分析
io流生成jsp页面squarz设置定时抓取
前言
看视频看的累了 写写博文~ 很久以前就想有个自己的博客。csdn很好,可是我不是专家啊,还是功底不够, 没有权限,也就不能实现自己的一些想法。所以就百度了一个静态模版。有了模版,问题来了。是个空壳子啊,没有任何内容,所以就想着爬取自己csdn上面的所有文章并生成相应的jsp页面保存到本地,而且为了实时保证自己的博文新鲜度所以就用spring-quartz定时器定时执行抓取页面的任务。博客地址(, 百度搜索排名还在我的前面。原来那么简单
页码分析
在这个页面我们可以看到最短的分页信息。
然后通过审查元素定位到这里。
仔细查看,最大页码为12.在id为papelist标签下的第一个span元素。所以最大页码就可以这样获得
HtmlPage page=wc.getPage("javascript:void(0)"); DomElement pageList = page.getElementById("papelist"); //最大页码 int MaxPage=Integer.parseInt(pageList.getFirstChild().asText().substring(6, 8));
文章链接分析
在上一步,我们得到了分页的最大页码。
通过查看url可以发现javascript:void(0)2 最后一位
即为你要请求的页码。
那么就可以通过get请求来获得某一页的数据。
page=wc.getPage+MaxPage);
而在进入某一页后。继续查看源码
可以发现所有的文章都在article_list标签内。
所以我们可以首先获得article_list标签。
DomElement article_list = page.getElementById(“article_list”);在article_list 标签内我们要继续获得文章的信息。
首先获得所有的article_list 子标签(并不包括子标签的子标签)。即上述图片的
DomNodeList
然后通过for循环对每一篇的文章细节进行分析:
for
文章的所有信息一览无余。
由于里面只有两个a标签。
在第一个a标签里面有文章的地址,标题信息。在第二个a标签里面有文章的阅读次数信息。然后第二个a标签的父标签的父标签下的第一个标签内有文章的创建日期信息。在获得题目的同时,使用md5码对文章的标题进行加密作为数据库中的主键
所以通过标签名字获取两个a标签:
.getElementsByTagName("a");
String address=links.get(0).getAttribute("href"); String title=links.get(0).asText(); String readCounts=links.get(1).getParentNode().asText(); String time=links.get(1).getParentNode().getParentNode().getFirstChild().asText();
到了这一步仅仅获得了所有文章的题目信息。 那么应该如何获得文章的具体内容呢?
文章内容分析
定位到某一篇文章。通过审查元素,我们可以找到所有的文章内容都在article_details标签里。
剩下的就是把article_details标签的所有内容存到自己的网页了。
在这里遇到了一问题。
起初我使用的是htmlunit工具直接通过getElementById的方法获取article_details的源码。可以生成后的网页分析后发现。所有的文章是正常显示了,可是代码出现严重的换行现象。通过对比源码后发现,htmlunit的axXml方法会自动对所有的标签进行格式化操作。google许久也没有找到适当的解决办法。灵光一闪,想到了URLConnection。
URLConnection的get请求获得的源码和浏览器源码一致。
于是定义了一个方法。对获得的源码进行字符串截取即可。正则表达式不是我不用,是爆栈啦~字符串太长了。。。。
/** * * @Title: getArticle * @Description: (通过URLConnection的get请求获得文章的源码信息) * @param link 文章的链接 * @return public static String getArticle(String link){ URL url=null; URLConnection conn=null; InputStream is = null; //字符流 InputStreamReader isr = null; //缓冲流 BufferedReader br = null; try { url=new URL(link); conn= url.openConnection(); conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); conn.connect(); //网页编码 String context = null; //获得网页的字节输入流 is = conn.getInputStream(); //将字节输入流转换为字符输入流 并设置转码格式为utf-8 isr = new InputStreamReader(is, "utf-8"); //将字符流转换为缓冲流 br = new BufferedReader(isr); //一行一行读取网页内容 context = br.readLine(); String txt=""; while ((txt=br.readLine())!=null) { context +=txt+"\n"; } int st=context.indexOf("
到了这里基本就快完成了~ 剩下的就是使用io流写入网页了
io流生成jsp页面
我们的jsp页面肯定不能只有个文章的信息。当然也需要一些其它的元素。所以这些其它元素就需要我们自己准备了,保存到web项目里,然后使用io流读取即可。由于至少需要读取两个部分。所以我新建了一个方法
/** * * @Title: getHeadHtml * @Description: (通过文件的路径读取相应的文件信息并返回) * @param path 文件路径 * @return String 文件内的信息 * @throws public static String getHeadHtml(String path) { String res=""; BufferedReader br=null; String data=null; try { br=new BufferedReader(new InputStreamReader(new FileInputStream(path),"utf-8")); while((data=br.readLine())!=null){ res+=data+"\n"; } } catch (IOException e) { throw new RuntimeException(e); }finally{ if(br!=null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return
然后就是写入jsp信息了。如果当前数据库中没有这篇文章,那么就生成这个jsp页面。jsp的名称我使用的是文章题目md5码的后8位
if(!articleService.findArticleById(id)){ //将源码写入到文件 OutputStreamWriter bw=new OutputStreamWriter(new FileOutputStream(filePath+"articles/"+htmlname+".jsp"),"utf-8"); //jsp的头部信息 bw.write(MyStringUtil.getHeadHtml(filePath+"headHtml.txt")); //head标签中的title标签 bw.write("
到了这里就大功告成了。
squarz设置定时抓取
配置如下:每12个小时执行一次抓取任务 如果对squarz定时器不懂,
执行后可以在文件夹中查看
写了一个多小时 也该回宿舍了~~希望暑期能找到个实习工作 唉
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~