http 阮一峰_阮一峰是谁?

互联网界的前辈,经常看大佬的博客,阮佬从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值