文档章节

使用Hutool爬取开源中国的开源资讯

路小磊
 路小磊
发布于 2017/11/19 21:29
字数 937
阅读 3.5K
收藏 92

介绍

为了演示Hutool-http的http请求功能,因此这个栗子用红薯家的开源资讯开刀,在此做个简单的Demo。

开始

分析页面

  1. 打开红薯家的主页,我们找到最显眼的开源资讯模块,然后点击“更多”,打开“开源资讯”板块。

  1. 打开F12调试器,点击快捷键F12打开Chrome的调试器,点击“Network”选项卡,然后在页面上点击“全部资讯”。

  1. 由于红薯家的列表页是通过下拉翻页的,因此下拉到底部会触发第二页的加载,此时我们下拉到底部,然后观察调试器中是否有新的请求出现。如图,我们发现第二个请求是列表页的第二页。

  1. 我们打开这个请求地址,可以看到纯纯的内容。红框所指地址为第二页的内容,很明显p参数代表了页码page。

  1. 我们右键点击后查看源码,可以看到源码。

  1. 找到标题部门的HTML源码,然后搜索这个包围这个标题的HTML部分,看是否可以定位标题。

至此分析完毕,我们拿到了列表页的地址,也拿到了可以定位标题的相关字符(在后面用正则提取标题用),就可以开始使用Hutool编码了。

模拟Http请求爬取页面

使用Hutool-http配合ReUtil请求并提取页面内容非常简单,代码如下:

//请求列表页
String listContent = HttpUtil.get("http://www.oschina.net/action/ajax/get_more_news_list?newsType=&p=2");
//使用正则获取所有标题
List<String> titles = ReUtil.findAll("<span class=\"text-ellipsis\">(.*?)</span>", listContent, 1);
for (String title : titles) {
	//打印标题
	Console.log(title);
}

抓取结果为:

其实核心就前两行代码,第一行请求页面内容,第二行正则定位所有标题行并提取标题部分。

这里我解释下正则部分:ReUtil.findAll方法用于查找所有匹配正则表达式的内容部分,第二个参数1表示提取第一个括号(分组)中的内容,0表示提取所有正则匹配到的内容。这个方法可以看下core模块中ReUtil章节了解详情。

<span class=\"text-ellipsis\">(.*?)</span>这个正则就是我们上面分析页面源码后得到的正则,其中(.*?)表示我们需要的内容,.表示任意字符,*表示0个或多个,?表示最短匹配,整个正则的意思就是。,以<span class=\"text-ellipsis\">开头,</span>结尾的中间所有字符,中间的字符要达到最短。?的作用其实就是将范围限制到最小,不然</span>很可能匹配到后面去了。

关于正则表达式这块可以看下我的博客:正则表达式简明参考

结语

不得不说,抓取本身并不困难,尤其配合Hutool会让这项工作变得更加简单快速,而其中的难点便是分析页面和定位我们需要的内容。

真正的内容抓取分为连个部分:

  • 找到列表页(很多网站都没有一个总的列表页)
  • 请求列表页,获取详情页地址
  • 请求详情页并使用正则匹配我们需要的内容
  • 入库或将内容保存为文件

而且在抓取过程中我们也会遇到各种问题,包括但不限于:

  • 封IP
  • 对请求Header有特殊要求
  • 对Cookie有特殊要求
  • 验证码

这些问题都有一些解决办法,具体要在具体的开发中分析解决。

希望大家看到这个栗子有所启发,也为Hutool提供更多更好的意见~

© 著作权归作者所有

路小磊

路小磊

粉丝 433
博文 55
码字总数 42397
作品 5
呼和浩特
程序员
私信 提问
加载中

评论(20)

双曲线

引用来自“两广总督bogang”的评论

HtmlUnit可以取不到京东的秒杀价(3648.00)

引用来自“zlikun”的评论

有可有价格是通过Ajax请求生成的,普通的爬虫不具备执行js的通力,所以无法得到这个值。
需要嵌套浏览器内核的爬虫库来搞,把页面下到本地渲染完了再爬
路小磊
路小磊 博主

引用来自“在下路哥”的评论

引用来自“路小磊”的评论

引用来自“在下路哥”的评论

怎么查看下拉翻页的js和效果是怎么弄的?不会看

这你就要问红薯了

回复@路小磊 : 怎么在f12那里看,我不会找

这个就要自行百度了哦
开源中国首席罗纳尔多
开源中国首席罗纳尔多

引用来自“路小磊”的评论

引用来自“在下路哥”的评论

怎么查看下拉翻页的js和效果是怎么弄的?不会看

这你就要问红薯了

回复@路小磊 : 怎么在f12那里看,我不会找
路小磊
路小磊 博主

引用来自“宇润”的评论

红薯很感动,然后封杀了这种采集方法

当然是交了保护费滴,哈哈
路小磊
路小磊 博主

引用来自“在下路哥”的评论

怎么查看下拉翻页的js和效果是怎么弄的?不会看

这你就要问红薯了
宇润-不忘251-支持中医
宇润-不忘251-支持中医
红薯很感动,然后封杀了这种采集方法
开源中国首席罗纳尔多
开源中国首席罗纳尔多
怎么查看下拉翻页的js和效果是怎么弄的?不会看
路小磊
路小磊 博主

引用来自“爱喝貓的咖啡”的评论

为什么都不刨妹子图了?

你可以刨后发出来,哈哈。
路小磊
路小磊 博主

引用来自“开源中国首席男司机”的评论

python request bs4蜜汁微笑。。。

Python确实也是我的第一选择,语言不重要,顺便说下,使用Hutool并不比python麻烦哦。
MrXionGe
MrXionGe

引用来自“obhen”的评论

请大声告诉我,红薯家的主流颜色是啥?
原谅绿!
Python开发趣味应用

【业务需求】 以下4个应用场景4个选题,4选1,开发者自主选择开发 一、爬聚合类资讯,例如http://www.oschina.net/news/industry(开发者可自由选择感兴趣内容源进行爬取,但仅限于开源中国网...

宋庆离
2017/08/16
19
0
Hutool 3.1.1 跨越发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 主页:http://hutool.cn/ 文档:http://hutool.mydoc.io/ (...

路小磊
2017/09/13
1.2K
40
Hutool 3.0.5 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 主页:http://hutool.cn/ 文档:http://hutool.mydoc.io/ (...

路小磊
2017/05/04
1.7K
14
基于Google Flutter的开源中国客户端,支持Android与iOS

FlutterOSC 基于Google Flutter的开源中国客户端,支持Android和iOS。 码云戳这里 GitHub戳这里 关于Google Flutter Android扫码下载APK 请使用手机浏览器扫码下载,不要使用微信或者qq扫码 ...

我遇见谁_会有怎样的对白
2018/05/09
0
0
Hutool 3.0.7 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 主页:http://hutool.cn/ 文档:http://hutool.mydoc.io/ (...

路小磊
2017/06/15
1.4K
24

没有更多内容

加载失败,请刷新页面

加载更多

程序员需要了解依赖冲突的原因以及解决方案

0x00. 前言 依赖冲突是日常开发中经常碰到的过程,如果运气好,并不会有什么问题。偏偏小黑哥有点背,碰到好几次生产问题,排查一整晚,最后发现却是依赖冲突的引起的问题。 没碰到过这个问题...

楼下小黑哥
30分钟前
60
0
聊聊skywalking的JVMService

序 本文主要研究一下skywalking的JVMService BootService skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/boot/BootService.java publi......

go4it
30分钟前
42
0
python处理Redis的基本操作

安装 docker run -d -p 6379:6379 redis 操作 连接 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是S...

项昂之
45分钟前
36
0
python 多文件编程文件调用方式

python 多文件编程文件调用方式 首先要知道的是在使用python命令执行python代码时,默认的代码执行方式是脚本的方式.如下: $ python main.pyHello World! 除了通过脚本的方式运行python代码...

ghimi
57分钟前
45
0
Linux 用户管理命令笔记

1、新增用户 useradd user1 用户创建流程 1、系统先将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾,同时分配该用户UID。 2、创建用户目录,一般创建路径/home目录中。...

IT技术分享社区
58分钟前
43
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部