使用JAVA爬取博客里面的所有文章
主要思路:
1、找到列表页。
2、找到文章页。
3、用一个队列来保存将要爬取的网页,爬取队头的url,如果队列非空,则一直爬取。
4、如果是列表页,则抽取里面所有的文章url进队;如果是文章页,则直接爬取至本地。
一个博客是起始页url是这样的:
http://www.cnblogs.com/joyeecheung/
第n页是这样的:
http://www.cnblogs.com/joyeecheung/default.html?page=n
文章的url是这样的:
http://www.cnblogs.com/joyeecheung/p/[0-9]+.html
代码如下:
public class boke {
private Queue<String> data = new LinkedList<String>();
//文章页面
String PAGE = "http://www.cnblogs.com/joyeecheung/p/[0-9]+.html";
Pattern p = Pattern.compile(PAGE);
public void action(String target) throws IOException{
Matcher m = p.matcher(target);
//如果是文章页面则读取
if(m.find()){
URL url = new URL(target);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.connect();
InputStream in = conn.getInputStream();
byte[] buf = new byte [1024];
int len = 0;
//分割url,把文章的编号作为文件的名字
String [] bufen = target.split("/");
String name = bufen[bufen.length-1];
name = name.replaceAll("html", "txt");
File file = new File(name);
FileOutputStream fp = new FileOutputStream(file);
while((len=in.read(buf))!=-1){
fp.write(buf, 0, len);
}
fp.close();
}
//如果是列表页面
//抽取里面的文章页面连接
else{
URL url = new URL(target);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.connect();
InputStream in = conn.getInputStream();
byte [] buf = new byte[1024];
//把列表页的内容放到ByteArrayOutputStream中
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int len = 0;
while((len=in.read(buf))!=-1){
//System.out.println(len);
outStream.write(buf,0,len);
}
in.close();
outStream.close();
String content = new String(outStream.toByteArray());
Matcher page = p.matcher(content);
//抽取文章的url
while(page.find()){
//将抽取的文章url进队
data.add(page.group());
}
}
}
public static void main(String args[]) throws IOException{
boke test = new boke();
//起始页面
String start = "http://www.cnblogs.com/joyeecheung/";
test.data.add(start);
//列表页面
String page = "http://www.cnblogs.com/joyeecheung/default.html?page=";
//总页数
int total =15;
//将15页列表页进队
for(int i=2;i<=total;i++)
test.data.add(page+i);
//队列非空则一直爬取
while(!test.data.isEmpty())
test.action(test.data.poll());
}
}
提取到的文章url效果:

爬取后效果:

文章内容效果:

博客里面右边会有推荐的文章栏,还有阅读排行里面的文章,这里的文章url会对我们后面提取到的url造成重复,怎么办呢?
我直接将文章编号作为文件名,如果重复的话,后一个会覆盖前面的内容。
直接用队列存储url,用循环来爬取内容,效率一般。高效率的爬虫支持多线程爬取,在此就不展开了。
这次对我关注的Joyee的文章进行了爬取,只是用作测试程序效果,没有恶意,如有冒犯,请联系删除,谢谢。
使用JAVA爬取博客里面的所有文章的更多相关文章
- python爬取博客圆首页文章链接+标题
新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了. 使用python 爬取博客园首页文章链接和标题. 首先当然是环境了,爬虫在window10系统下,python ...
- 爬虫---lxml爬取博客文章
上一篇大概写了下lxml的用法,今天我们通过案例来实践,爬取我的博客博客并保存在本地 爬取博客园博客 爬取思路: 1.首先找到需要爬取的博客园地址 2.解析博客园地址 # coding:utf-8 i ...
- Java使用Jsoup之爬取博客数据应用实例
导入Maven依赖 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <g ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- python 小爬虫爬取博客文章初体验
最近学习 python 走火入魔,趁着热情继续初级体验一下下爬虫,以前用 java也写过,这里还是最初级的爬取html,都没有用html解析器,正则等...而且一直在循环效率肯定### 很低下 imp ...
- Java爬取网络博客文章
前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...
- 【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取
打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码, ...
- [js高手之路]Node.js实现简易的爬虫-抓取博客文章列表信息
抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 ...
- Java课程设计——博客作业教学数据分析系统(201521123082 黄华林)
Java课程设计--博客作业教学数据分析系统(201521123082 黄华林) 一.团队课程设计博客链接 博客作业教学数据分析系统(From:网络五条狗) 二.个人负责模块或任务说明 1.网络爬虫 ...
随机推荐
- Java中会有内存泄露吗?
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的, 这些对象的创建都是在堆(He ...
- 【python】利用h5py存储数据
两类容器:group & dataset group类似文件夹,字典. dataset是数据集,类似数组 支持更多的对外透明的存储特征,数据压缩,误差检测,分块传输 group下面可以是gro ...
- 如何在JM8.6编码端提取QDCT?
毫无疑问,编码端的QDCT和解码端的QDCT完全相同,下面从编码端提取QDCT. 为简便起见,仅提取第一帧第一个宏块第一个4*4块的QDCT.JM8.6编码器最核心的编码函数是encode_one_m ...
- HAWQ取代传统数仓实践(九)——维度表技术之退化维度
退化维度技术减少维度的数量,简化维度数据仓库模式.简单的模式比复杂的更容易理解,也有更好的查询性能. 有时,维度表中除了业务主键外没有其它内容.例如,在本销售订单示例中,订单维度表除了订 ...
- C语言中的extern关键字用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v ...
- Java 对称加密
最近在做一个用户 token 功能,学习了加密相关 AES/DES.RSA 等.其中涉及一个对称和非对称加密问题.对称加密虽然没有非对称加密那样安全性高,但好处是加密速度快,但某些场合还是可以选择使用 ...
- (十二)break,continue
class Break { //break,continue public static void main(String[] args) { //break for(int i =0;i<=5 ...
- Python基本特殊方法之__format__
__format__()方法 __format__()传参方法:someobject.__format__(specification) specification为指定格式,当应用程序中出现&quo ...
- linux上编写运行 dotnet core api
安装 Ubuntu dotnet core 跨平台已不再是梦,它带来的意义非凡,比如api接口可以在linux上编写及部署,也可以在windows上编写好,打包发布,然后copy到lin ...
- IOS socket编程--Asyncsocket
iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写, ...