WebMagic

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

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

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

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

一个WebMagic例子

package csdnblog;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor; public class MyPageProcessor implements PageProcessor { @Override
public Site getSite() {
// 重试3次,抓取间隔1S
return Site.me().setRetryTimes(3).setSleepTime(1000);
} @Override
public void process(Page page) {
page.addTargetRequests(page.getHtml().links().regex("http://blog\\.csdn\\.net/\\?&page=.*").all()); try {
// 创建新文件
String path = "D:\\testFile\\"+getFileName(page.getUrl().toString())+".html";
PrintWriter printWriter = new PrintWriter(new FileWriter(new File(path)));
// 写内容
printWriter.write(page.getHtml().toString());
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
Spider.create(new MyPageProcessor()).addUrl("http://blog.csdn.net").thread(5).run();
} public String getFileName(String url) {
return url.substring(20, url.length()).replace("?", "").replace("&", "");
}
}

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

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

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

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

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

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

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

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

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

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

package csdnblog;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor; public class MyPageProcessor implements PageProcessor { @Override
public Site getSite() {
// 重试3次,抓取间隔1S
return Site.me().setRetryTimes(3).setSleepTime(1000);
} @Override
public void process(Page page) {
// 添加所有文章页
page.addTargetRequests(page.getHtml().xpath("//div[@class='blog_list_wrap']").links()// 限定文章列表获取区域
.regex("http://blog\\.csdn\\.net/.*/article/details/.*")
.all());
// 添加其他列表页
page.addTargetRequests(page.getHtml().xpath("//div[@class='page_nav']").links()// 限定其他列表页获取区域
.regex("http://blog\\.csdn\\.net.*")
.all());
//如果当前页为文章页
if(page.getUrl().regex("http://blog\\.csdn\\.net/.*/article/details/.*").match()){
// 编号
System.out.println("编号:" + page.getUrl().regex("http://blog\\.csdn\\.net/.*/article/details/(\\d+)").get());
// 标题
System.out.println("标题:" + page.getHtml().xpath("//div[@class='article_title']//span[@class='link_title']/a/text()").get());
// 日期
System.out.println("日期" + page.getHtml().xpath("//div[@class='article_r']/span[@class='link_postdate']/text()").get());
// 标签
System.out.println("标签" + page.getHtml().xpath("//div[@class='article_l']/span[@class='link_categories']/a/allText()").all().toString());
// 类别
System.out.println("类别" + page.getHtml().xpath("//div[@class='category_r']/label/span/text()").all().toString());
}
} public static void main(String[] args) {
Spider.create(new MyPageProcessor()).addUrl("http://blog.csdn.net").thread(5).run();
}
}

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. java中的参数传递是按引用传递还是按值传递

    最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...

  2. Linux根目录详解-转自鸟哥的私房菜

    转自:http://myhat.blog.51cto.com/391263/107931/   *根目录(/)的意义与内容: 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的 ...

  3. 02.将SDK获取到的ECS主机信息入库

    1.通过调用阿里SDK,将获取到的ECS信息存入数据库,如果不知道SDK怎么使用,查看:01.阿里云SDK调用,获取ESC主机详细信息 2.import aliSDK应用的是01.阿里云SDK调用,获 ...

  4. php实现MySQL读写分离

    MySQL读写分离有好几种方式 MySQL中间件 MySQL驱动层 代码控制 关于 中间件 和 驱动层的方式这里不做深究  暂且简单介绍下 如何通过PHP代码来控制MySQL读写分离 我们都知道 &q ...

  5. Fiddler捕获localhost的网站

    Fiddler如何捕获localhost的网站?在hosts文件中加入127.0.0.1  localsite这样也可以被捕获到.

  6. WebRTC 入门到放弃(一)WebRTC

    前言 WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Gl ...

  7. tornado返回指定的http code

    最近做web api,需要在接口返回异常时,返回对应的http code. 查了下tornado的文档,是通过set_status方法来设置返回的http code,做个记录. self.set_st ...

  8. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  9. Nodejs(pkg方式安装)卸载 及命令行模式的重新安装

    直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...

  10. 常用数学符号的 LaTeX 表示方法

    常用数学符号的 LaTeX 表示方法 (以下内容主要摘自"一份不太简短的 LATEX2e 介绍") 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(square ...