互联网界的前辈,经常看大佬的博客,阮佬从2003年开始记博客,现在已经16年了。大佬真的是大佬,一个习惯可以坚持16年之久。。。
在这个行业,有太多的大佬,坚持本心,我一直在模仿,从未超越过。哈哈哈
博客写的很有水平,我很喜欢看,最近做了一个爬虫,把阮佬的所有博客都爬下来了,没事就翻出来看看。
随手记录下爬取博客的过程吧。文末分享下阮佬的博客。
开发环境:Java语言,JKD1.8
开发工具IDEA
抓取过程分析
阮佬的博客就是纯html,没有什么反爬虫限制,我做的就是http请求下载到html页面,然后把里边所有的广告删除了,保留了文章主体。博客是按时间组织的。代码如下,代码注释是爬取思路。总共120行代码,很简单。
talk is cheap show me the code
private void down() {
/*
爬取思路:
日志网站是以时间节点组织的,以时间为线索爬取所有日志
最早的日志是2003年12份
http://www.ruanyifeng.com/blog/2003/12/
*/
String url = "http://www.ruanyifeng.com/blog/";
LocalDate now = LocalDate.now();//获取当前日期
while (now.isAfter(LocalDate.of(2003, 12, 1))) {//网站开始时间 2003年12月1日
//爬取网站
int year = now.getYear();//年份
int month = now.getMonthValue();//月份
String monthStr = ((month + 100) + "").substring(1, 3);//格式月份 比如1月转为01月
String href = url + year + "/" + monthStr + "/";
//下载该月份的所有文章
String path = "ruanyifeng" + File.separator + year + monthStr;//文档保存目录
downPage(href, path);
//时间减一个月
now = now.minusMonths(1);
}
}
/**
* 下载一个月份的所有文章
*
* @param path 文件存储路径:年份+月份 如 200312
* @param url 某月份的网址
*/
private void downPage(String url, String path) {
if (repeatUrl.contains(url)) {
return;
}
LOG.info("开始下载某月份的所有文章:{}", url);
/*
实现思路:
比如某月份网址:http://www.ruanyifeng.com/blog/2003/12/
页面分析:由上下两部分组成,上边是该月份最后一篇文章,下边是所有剩下的所有文章
故爬取分上下两部分,爬取到文章的网址即可
*/
Document document = SpiderUtil.getDocument(url);
List urls = new ArrayList<>();
//得到上部分,最后一篇文章
Element last = document.selectFirst("div > h2 > a");
if (last != null) {
String lastUrl = last.attr("href");
urls.add(lastUrl);
//得到下部分,剩下的所有文章
Elements elements = document.select("#alpha-inner > div > div > ul > li > a");
elements.forEach(m -> urls.add(m.attr("href")));
//创建目录
FileUtil.mkdir(System.getProperty("user.dir") + File.separator + path);
//下载文章
urls.forEach(m -> downArticle(m, path));
}
//防止重复爬取
repeatUrl.add(url);
}
/**
* 下载文章详情页
*
* @param url 文章网址
* @param path 文件存储路径
*/
private void downArticle(String url, String path) {
if (repeatUrl.contains(url)) {
return;
}
LOG.info("开始下载文章详情:{}", url);
Document document = SpiderUtil.getDocument(url);
if (document != null) {
Element title = document.selectFirst("#page-title");
if(title==null){
repeatUrl.add(url);
return;
}
Element date = document.selectFirst("article > div > p:nth-child(2) > a > abbr");
Element content = document.selectFirst("#main-content");
//文章的图片处理
// SpiderUtil.saveImages(content, path);
String html = "
\n" +" " +
title.toString() + date.toString() + content.toString();
Document doc = Jsoup.parse(html);
// String markdown = SpiderUtil.html2markdown(html);//文章转markdown格式
//保存文档到硬盘
//得到文件标题并清除特殊符号
String titleStr = title.text().replaceAll("[\\pP+~$`^=|<>~`$^+=|<>¥×]", "");
String dateStr = date.text().replaceAll("[年|月|日]", "");
String filePath = FileUtil.getProjectDir() + path + File.separator + dateStr + "-" + titleStr + ".html";
File file = FileUtil.newFile(filePath);
LOG.info("保存文章: {},文章地址: {}", dateStr + titleStr, url);
FileUtil.writeString(doc.toString(), file, CharsetUtil.UTF_8);
//防止重复爬取
repeatUrl.add(url);
}
}
所有的博客在群文件,可以下载
317896269 点击链接加入群聊【数据爬取技术群】:正在跳转
对了开发依赖如下:
cn.hutool
hutool-all
4.4.5
org.jsoup
jsoup
1.11.3