package com.wbg.my.service;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* @author Jack Chen
* */
public class BlogUtil { /**
* URL_PAGE:cnblogs url
* URL_PAGE_DETAIL:详情页url
* PAGE_COUNT:页数
* urlLists:所有详情页url Set集合(防止重复)
* p:匹配模式
* */
public final static String URL_PAGE = "https://www.cnblogs.com/weibanggang/default.html?page=";
public final static String URL_PAGE_DETAIL = "https://www.cnblogs.com/weibanggang/p/([0-9]+.html)";
public final static int PAGE_COUNT = 20;
public static Set<String> urlLists = new TreeSet<String>();
public final static Pattern p = Pattern.compile(URL_PAGE_DETAIL);
//文件路径
public static String file="d:index.html";
static String [] arr=null;
static int sun=0;
public static void main(String[] args) throws Exception {
for(int i = 1;i<=PAGE_COUNT;i++) {
getUrls(i);
}
System.out.println("开始获取内容!");
arr=new String[urlLists.size()];
for(Iterator<String> i = urlLists.iterator();i.hasNext();) {
createFile(i.next());
sun++;
}
System.out.println("获取内容完毕!");
System.out.println("开始写入文件!");
StringBuffer stringBuffer=new StringBuffer(kais());
for (int i = 0; i < arr.length; i++) {
stringBuffer.append(arr[i]);
}
stringBuffer.append(jiehun());
System.out.println("写入文件完毕!");
System.out.println("开始导出文件!");
createFile(file,stringBuffer);
System.out.println("导出文件完毕!");
System.out.println("输出文件地址为:"+file);
}
/*
* 将结果写入文件
*/
private static void createFile(String file, StringBuffer buffer) {
try {
File newFile = new File(file);
if (newFile.exists())// 存在,则删除
if (!newFile.delete())// 删除成功则创建
{
System.err.println("删除文件" + newFile + "失败");
}
if (newFile.createNewFile()) {// 创建成功,则写入文件内容
PrintWriter p = new PrintWriter(new FileOutputStream(newFile
.getAbsolutePath()));
p.write(buffer.toString());
p.close();
} else {
System.err.println("创建文件:" + newFile + "失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
//开始头部
public static String kais(){
return "<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"utf-8\">\n" +
" <title>weibanggang.github.io</title>\n" +
" <meta name=\"renderer\" content=\"webkit\">\n" +
" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n" +
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n" +
" <style>\n" +
" html,body{width:100%;height: 100%}\n" +
" table{width: 1150px;height:500px;margin: auto}\n" +
" table,td,th{border: 1px solid #e6e6e6;border-collapse:collapse; }\n" +
" body{-moz-background-size:100% 100%; background-size:100% 100%;background-image:url(\"link.jpg\");background-repeat: no-repeat} body{-moz-background-size:100% 100%; background-size:100% 100%;background-image:url(\"link.jpg\");background-repeat: no-repeat}\n" +
" * { margin: 0; padding: 0; }\n" +
" table { border-collapse: collapse; text-align: center; }\n" +
" /*关键设置 tbody出现滚动条*/\n" +
" table tbody {\n" +
" display: block;\n" +
" height: 500px;\n" +
" overflow-y: scroll;overflow-x:hidden;\n" +
" }\n" +
" table thead, tbody tr { display: table;width: 100%; table-layout: fixed; }\n" +
" table thead th { height: 40px }\n" +
" table tbody td {height: 30px }\n" +
" </style>\n" +
"</head>\n" +
"\n" +
"<body>\n" +
"<marquee><h1 style=\"color:white;\">本网页仅作为参考博客、github等地址</h1></marquee>\n" +
"<table width=\"80%\" border=\"1\">\n" +
" <thead>\n" +
" <tr>\n" +
" <th style=\"width:230px\">序号</th>\n" +
" <th style=\"width:231px\">标题链接</th>\n" +
" <th style=\"width:231px\">时间</th>\n" +
" <th style=\"width:231px\">来源</th>\n" +
" <th style=\"width:249px\">备注</th>\n" +
" </tr>\n" +
" </thead>\n" +
" <tbody>\n" +
"\n" +
" </tbody>\n" +
"</table>\n" +
"</body>\n" +
"<script src=\"js/jquery.js\"></script>\n" +
"<script>\n" +
" var sum=[";
}
//结尾
public static String jiehun(){
return " ];\n" +
" \n" +
" for(var i=0;i<sum.length;i++){\n" +
" var tr=$(\"<tr/>\");\n" +
" //序号\n" +
" $(\"<td/>\").html(i+1).appendTo(tr);\n" +
" //标题链接\n" +
" var a=\"<a href='\"+sum[i][0]+\"' target='_blank'>\"+sum[i][1]+\"</a>\"\n" +
" $(\"<td/>\").html(a).appendTo(tr);\n" +
" //时间\n" +
" $(\"<td/>\").html(sum[i][2]).appendTo(tr);\n" +
" //来源\n" +
" $(\"<td/>\").html(sum[i][3]).appendTo(tr);\n" +
" //备注\n" +
" $(\"<td/>\").html(sum[i][4]).appendTo(tr);\n" +
" $(\"table tbody\").append(tr);\n" +
" }\n" +
"</script>\n" +
"</html>";
}
static String fh="";
/**
* @param url
* 获取所有内容
* @throws
*/
private static void createFile(String url) throws Exception {
Matcher m = p.matcher(url);
m.find();
String fileName = m.group(1);
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String str;
StringBuffer s=new StringBuffer();
while((str = br.readLine()) != null){
s.append(str);
}
String href="https://www.cnblogs.com/weibanggang/p/"+fileName;
String title=getTitle(s);
String data=getDate(s);
arr[sun]=fh+"[\""+href+"\",\""+title+"\",\""+data+"\",\"博客\",\"正常\"]";
fh=",";
br.close();
conn.disconnect();
}
//获取时间
public static String getDate(StringBuffer sb){
int first=sb.indexOf("<span id=\"post-date\">")+"<span id=\"post-date\">".length();
String aa=sb.substring(first);
int last=aa.indexOf("</span>");
String sa=aa.substring(0,last);
return sa;
}
//获取标题
public static String getTitle(StringBuffer sb){
int first=sb.indexOf("<title>");
int last=sb.indexOf("</title>");
String sa=sb.substring(first+7,last);
int errorindex=sa.lastIndexOf("- 韦邦杠 - 博客园");
return sa.substring(0,errorindex);
}
/**
* @param idx
* 获取页数
* @throws
*/
private static void getUrls(int idx) throws Exception{
URL u = new URL(URL_PAGE+""+idx);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String str;
while((str = br.readLine()) != null){
if(null != str && str.contains("https://www.cnblogs.com/weibanggang/p/")) {
Matcher m = p.matcher(str);
if(m.find()) {
urlLists.add(m.group());
}
}
}
br.close();
conn.disconnect();
} }

java提取(获取)博客信息(内容)的更多相关文章

  1. 如何提取CSDN博客正文内容

    document.getElementById("article_content").outerHTML; 在任意的一片博文运行以上代码都可以获得正文内容,但是对于代码.字体都没有 ...

  2. 02_使用WebMagic爬虫获取CSDN推荐专家的个人博客信息

    本来是想抓取博客园的博客推荐的页面的,但由于一些博客进去的页面格式都不太相同,一时不想花时间去寻找规律,发现CSDN上面的格式较为单一,就决定以CSDN推荐专家的个人博客信息作为爬虫抓取的目标. [首 ...

  3. windows下使用python的scrapy爬虫框架,爬取个人博客文章内容信息

    scrapy作为流行的python爬虫框架,简单易用,这里简单介绍如何使用该爬虫框架爬取个人博客信息.关于python的安装和scrapy的安装配置请读者自行查阅相关资料,或者也可以关注我后续的内容. ...

  4. Java课程设计博客(个人)

    Java课程设计博客(个人) 1. 团队课程设计博客链接 http://www.cnblogs.com/wkfg/p/7063081.html 2. 个人负责模块或任务说明 负责模块/任务:编写doG ...

  5. 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)

    该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况. 整个脚本的流程:是利用python3来编写,利用selnium获 ...

  6. Java课程设计——博客作业教学数据分析系统(201521123082 黄华林)

    Java课程设计--博客作业教学数据分析系统(201521123082 黄华林) 一.团队课程设计博客链接 博客作业教学数据分析系统(From:网络五条狗) 二.个人负责模块或任务说明 1.网络爬虫 ...

  7. Java课程设计博客(团队)

    Java课程设计博客(团队) 1. 团队/项目名称 使用JAVA实现简易HTTP服务器 2. 团队成员 组长:林一心 组员:张杭镖 3. 项目git地址 https://github.com/oran ...

  8. Java实现个人博客网站

    说明:该项目是实验楼用户"LOU3165780622"发布在实验楼上的项目教程:[Java实现个人博客],未经允许,禁止转载: 该项目利用 SSM 框架和 Mysql 以及一些简单 ...

  9. 推荐一款自研的Java版开源博客系统OneBlog

    OneBlog 一款超好用的Java版开源博客      Introduction 简介 OneBlog 一个简洁美观.功能强大并且自适应的Java博客.使用springboot开发,前端使用Boot ...

随机推荐

  1. Android:Sqlitedatabase学习小结

    今天刚刚学习完Sqlite数据库的基础知识,随即把学到的东西记录下来,以便随后查阅,以下是自己对Sqlite数据库的小结:1.Sqlite简介       Sqlite是一款轻型的数据库,它包含在一个 ...

  2. node使用https,webSocket开启wss

    1. 前言 看WEBRTC教程时使用到WebSocket来传输信令,node端使用了ws库来实现,但在浏览器端http无法获取本地媒体,必须使用https,使用https后webSocket 不能使用 ...

  3. sp 数据拼接html table表转换xml,发邮件

    USE [BES_ADV] GO /****** Object: StoredProcedure [dbo].[RSP_FN_UNAPPLIED_Mail_Reminder] Script Date: ...

  4. artDialog组件应用学习(一)

    个人觉得artDialog是一组很不错的对话框组件.写的是artDialog_v6应用. 官方称其兼容性测试通过:IE6~IE11.Chrome.Firefox.Safari.Opera. 官网:ht ...

  5. CSP学习之ASN.1编码(一)

    一.定义: 是定义抽象数据类型的标准. 是用于描述数据的表示.编码.传输.解码的灵活记法. 它提供一套正式.无歧义和精确的规则,以描述独立于特定计算机硬件的对象结构. 标准的ASN.1编码规则有其基本 ...

  6. SpringBoot ------ 使用AOP处理请求

    一.AOP统一处理请求日志 1.spring的两大核心:AOP ,  IOC 2.面向对象OOP关注的是将需求功能垂直,划分为不同的,并且相对独立的,   会封装成良好的类,并且类有属于自己的行为. ...

  7. Disruptor之粗糙认识

    一 概述 1.Disruptor Disruptor是一个高性能的异步处理框架,一个“生产者-消费者”模型. 2.RingBuffer RingBuffer是一种环形数据结构,包含一个指向下一个槽点的 ...

  8. 使用HTML5 canvas做地图(2)瓦片以及如何计算的

    上一篇也说到瓦片,我们为什么使用瓦片?这一篇主要是关于如何拼接地图? 下面的一张图,可以一眼明了,地图是如何切割以及拼接的. 瓦片信息 瓦片信息包括切图原点,瓦片大小,格式,分辨率以及分辨率级别等. ...

  9. JQuery Tips

    另一篇文章 JavaScript Tips 1. 获取span标签的值需要用text(); 2. datepicker控件的‘setDate’属性可用于设置默认值: 3. 使用parseFloat转换 ...

  10. MonkeyRunner之MonkeyRecorder录制回放脚本

    MonkeyRunner强大的功能之一便是允许用户自由录制需要的脚本,录制和回放需要两个脚本文件 monkey_recorder.py和monkey_playback.py 首先来看 monkey_r ...