WebMagic

WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来实现多线程,创建链接池,自动解析网页代码获取请求链接,封装正则表达式等等。

但是如果使用框架,就不再需要考虑爬虫的逻辑,只需要专注HTML内容的解析和获取。

引用WebMagic后写一个爬虫只需要编写一个类实现PageProcessor接口,实现两个方法。

一个WebMagic例子

  1. package csdnblog;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7.  
  8. import us.codecraft.webmagic.Page;
  9. import us.codecraft.webmagic.Site;
  10. import us.codecraft.webmagic.Spider;
  11. import us.codecraft.webmagic.processor.PageProcessor;
  12.  
  13. public class MyPageProcessor implements PageProcessor {
  14.  
  15. @Override
  16. public Site getSite() {
  17. // 重试3次,抓取间隔1S
  18. return Site.me().setRetryTimes(3).setSleepTime(1000);
  19. }
  20.  
  21. @Override
  22. public void process(Page page) {
  23. page.addTargetRequests(page.getHtml().links().regex("http://blog\\.csdn\\.net/\\?&page=.*").all());
  24.  
  25. try {
  26. // 创建新文件
  27. String path = "D:\\testFile\\"+getFileName(page.getUrl().toString())+".html";
  28. PrintWriter printWriter = new PrintWriter(new FileWriter(new File(path)));
  29. // 写内容
  30. printWriter.write(page.getHtml().toString());
  31. printWriter.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36.  
  37. public static void main(String[] args) {
  38. Spider.create(new MyPageProcessor()).addUrl("http://blog.csdn.net").thread(5).run();
  39. }
  40.  
  41. public String getFileName(String url) {
  42. return url.substring(20, url.length()).replace("?", "").replace("&", "");
  43. }
  44. }

这个例子里实现了一个getSite方法,用来获取抓取网站的相关配置,包括:编码、抓取间隔、重试次数等

还实现了一个process方法,里面除了写文件的部分,就只有一个page.addTargetRequests(),它是用来为链接池添加爬虫需要的链接,当爬虫线程开启后,每个线程会到链接池中取链接,当链接池为空,爬虫结束。

  1. page.addTargetRequests(page.getHtml().links().regex("http://blog\\.csdn\\.net/\\?&page=.*").all());

即将所有符合"http:blog.csdn.net?&page=数字"的链接放入链接池中

例子中可以看到page.getHtml()即获取页面上HTML内容,在此基础上用xpath就可以取得其中想要的数据

xpath是一种HTML标签元素的路径表达方式

  1. 使用火狐firebug和谷歌浏览器F12都可以右键标签直接复制标签的xpath

可以采用xpath的方式获取链接池链接

  1. // 添加所有文章页
  2. page.addTargetRequests(page.getHtml().xpath("//div[@class='blog_list_wrap']").links()// 限定文章列表获取区域
  3. .regex("http://blog\\.csdn\\.net/.*/article/details/.*")
  4. .all());
  5. // 添加其他列表页
  6. page.addTargetRequests(page.getHtml().xpath("//div[@class='page_nav']").links()// 限定其他列表页获取区域
  7. .regex("http://blog\\.csdn\\.net.*")
  8. .all());

使用xpath获取页面中想要的数据

  1. package csdnblog;
  2.  
  3. import us.codecraft.webmagic.Page;
  4. import us.codecraft.webmagic.Site;
  5. import us.codecraft.webmagic.Spider;
  6. import us.codecraft.webmagic.processor.PageProcessor;
  7.  
  8. public class MyPageProcessor implements PageProcessor {
  9.  
  10. @Override
  11. public Site getSite() {
  12. // 重试3次,抓取间隔1S
  13. return Site.me().setRetryTimes(3).setSleepTime(1000);
  14. }
  15.  
  16. @Override
  17. public void process(Page page) {
  18. // 添加所有文章页
  19. page.addTargetRequests(page.getHtml().xpath("//div[@class='blog_list_wrap']").links()// 限定文章列表获取区域
  20. .regex("http://blog\\.csdn\\.net/.*/article/details/.*")
  21. .all());
  22. // 添加其他列表页
  23. page.addTargetRequests(page.getHtml().xpath("//div[@class='page_nav']").links()// 限定其他列表页获取区域
  24. .regex("http://blog\\.csdn\\.net.*")
  25. .all());
  26. //如果当前页为文章页
  27. if(page.getUrl().regex("http://blog\\.csdn\\.net/.*/article/details/.*").match()){
  28. // 编号
  29. System.out.println("编号:" + page.getUrl().regex("http://blog\\.csdn\\.net/.*/article/details/(\\d+)").get());
  30. // 标题
  31. System.out.println("标题:" + page.getHtml().xpath("//div[@class='article_title']//span[@class='link_title']/a/text()").get());
  32. // 日期
  33. System.out.println("日期" + page.getHtml().xpath("//div[@class='article_r']/span[@class='link_postdate']/text()").get());
  34. // 标签
  35. System.out.println("标签" + page.getHtml().xpath("//div[@class='article_l']/span[@class='link_categories']/a/allText()").all().toString());
  36. // 类别
  37. System.out.println("类别" + page.getHtml().xpath("//div[@class='category_r']/label/span/text()").all().toString());
  38. }
  39. }
  40.  
  41. public static void main(String[] args) {
  42. Spider.create(new MyPageProcessor()).addUrl("http://blog.csdn.net").thread(5).run();
  43. }
  44. }

JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)的更多相关文章

  1. Dubbo实践(三)框架设计

    整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口: 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层 ...

  2. 爬虫(十八):Scrapy框架(五) Scrapy通用爬虫

    1. Scrapy通用爬虫 通过Scrapy,我们可以轻松地完成一个站点爬虫的编写.但如果抓取的站点量非常大,比如爬取各大媒体的新闻信息,多个Spider则可能包含很多重复代码. 如果我们将各个站点的 ...

  3. JAVA 爬虫框架webmagic 初步使用Demo

    一想到做爬虫大家第一个想到的语言一定是python,毕竟python比方便,而且最近也非常的火爆,但是python有一个全局锁的概念新能有瓶颈,所以用java还是比较牛逼的, webmagic 官网 ...

  4. 网络爬虫框架Webmagic

    1 谈谈网络爬虫 1.1 什么是网络爬虫 在大数据时代,信息的采集是一项重要的工作,而互联网中的数据是海量的,如果单纯靠人力进行信息采集,不仅低效繁琐,搜集的成本也会提高.如何自动高效地获取互联网中我 ...

  5. 爬虫框架webmagic与spring boot的结合使用--转

    原文地址:http://www.jianshu.com/p/c3fc3129407d 1. 爬虫框架webmagic WebMagic是一个简单灵活的爬虫框架.基于WebMagic,你可以快速开发出一 ...

  6. 2018-2019-2 20175227张雪莹《Java程序设计》实验三 《敏捷开发与XP实践》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验三 <敏捷开发与XP实践> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号: ...

  7. 20155310 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155310 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验步骤 (一)敏捷开发与XP 1.敏捷开发 敏捷开发( ...

  8. 20155337 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155337 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基 ...

  9. 20145207 《Java 程序设计》实验三 (敏捷开发与XP实践)实验报告

    <Java 程序设计>实验三 (敏捷开发与XP实践)实验报告 目录 改变 敏捷开发与XP实践实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自己的思 ...

随机推荐

  1. bzoj 4653: [Noi2016]区间

    Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...

  2. New Life With 2018

    2017年转眼过去了.对自己来说.这一大年是迷茫和认知的一年.我的第一篇博客就这样记录下自己的历程吧 一:选择 从进入这一行到现在已经一年多了,2016年11月份就像所有的应届毕业生一样,都贼反感毕业 ...

  3. arm-linux-objdump反汇编使用指南

    一.   arm-linux-objdump常用来显示二进制文件信息,常用来查看反汇编代码 二.   常用选项: 1.-b bfdname 指定目标码格式 2.-disassemble或者-d 反汇编 ...

  4. 使用Python批量下载ftp服务器中的内容

    使用ftplib,轻松实现从ftp服务器上下载所需要的文件,包括目录结构等,支持了一下断点续传 from ftplib import FTP import sys import os import r ...

  5. <转>shell经典,shell十三问

    (注:关于变量概念,我们留到下两章才跟大家说明.) 好了,更多的关于 command line 的格式,以及 echo 命令的选项,就请您自行多加练习.运用了... ----------------- ...

  6. thinkphp->add方法错误

    $group_id=$model->add($add); 以上这句代码如果执行成功,返回它存储的id,但是,会有一种情况一直返回1. 代码完全没有问题,检查数据库发现有两个主键id,删除一个就O ...

  7. 【软件】关于Notepad++(32位)

    1.Notepad++安装包 简介:NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快. 官网网址:https://notepad-plus-plus.org/ 百度网盘:https: ...

  8. jQuery实现移动端评测问卷功能

    效果图: 需求: 1.有10道测试题目,单选,选中答案之后,500ms后自动跳转至下一题 2.如果当前题目没有选择答案,将弹窗提示"请选择答案!" 3.点击"上一题&qu ...

  9. php 使用beanstalk 消息队列

    Beanstalkd 消息队列 一.基本信息Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有 ...

  10. [转]OpenLiveWriter 代码插件

    插件地址链接:http://pan.baidu.com/s/1jHFDtbS 密码:ax31 将文件解压,放在路径下面 重启应用后,如图