一、前言

  首先我们把准备工作做好:IDEA 2019.1、JDK1.8、Maven3.5

  Jsoup的Maven依赖:

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>

  以及可能用到的Splider工具集合:

        <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.4</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>

  以及程序员必备的Google的Guava包

        <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>

  基本工具就到这里了,后面需要什么在加什么就行了。

二、操作

  我这里就以2种(HTML、JSON)格式作为讲解内容。其他的格式(JS、XML等格式就不做更多说明了,毕竟操作都差不多)

  • JSON格式

  首先,这里我推荐一个JSON在线解析的网站(https://www.json.cn/),毕竟后面很多都要去查结构。

  然后我们得了解一下使用JsonPath解析Json的语法。

操作 说明
$ 查询根元素。这将启动所有路径表达式。
@ 当前节点由过滤谓词处理。
* 通配符,必要时可用任何地方的名称或数字。
.. 深层扫描。 必要时在任何地方可以使用名称。
. 点,表示子节点
['' (, '')] 括号表示子项
[ (, )] 数组索引或索引
[start:end] 数组切片操作
[?()] 过滤表达式。 表达式必须求值为一个布尔值。

   在官方网站上有更加详细的解说(https://github.com/json-path/JsonPath),这里就不作更多解释了,如果觉得英文麻烦可以百度下JsonPath语法。就会很多相关的博客解释。

     这里为了方便给出一点点的解释:

  好!前期知识预备工作不多废话了,更多请自行百度。

  具体题材自己定,如果使用某些公司的网站作为题材,搞不好要被发律师函,作者就把一些核心代码以及核心思路写出来就行了。

  首先想要爬取一个网站的信息必定要有一下几步:

    1. 能够获取到的URL(Response只要能获取想要的数据即可)。

    2. 能够使用程序链接上,有的网页只能用POST,还要设置必要的参数。

    3. 通过自己熟悉的解析方式解析数据,封装数据。

  一般来说一个页面的描述都是2种类型(列表页,详情页)

  我们就要分3步走:

    1. 获取列表页的列表信息,其他不重要的信息基本可以抛弃。

    2. 获取列表信息后可以获取完整的URL或者部分URL(部分的话自己拼接下,一般来说大多数前缀都相同)。

    3. 获取详情页的信息。

  在这个过程中比较繁杂,需要多用浏览器F12或者其他抓包工具,很多网站的内容并不会直接放在页面中,有的是使用JSON作为信息传输,有的是使用XML有的是使用JS

  第一步:获取打开链接获取内容

public List<String> getDateFromUrl(String url) throws Exception {
List<String> list = new ArrayList<>();
int page = 1, count = 1;
/**
* 遍历每一页
*/
while(page <= count) {
Map<String,String> map = new HashMap<>();
/**
* 设置传输的参数,如果没有不用设置
*/ String json = http(url).method(Connection.Method.POST).data(map).execute().body();
if(page == 1){
count = Integer.parseInt(JsonPath.parse(json).read("$.body.sns.count", String.class));
if(count % 20 == 0){
count /= 20;
}else{
count = count / 20 + 1;
}
}
page++;
JsonPath.parse(json).read("$.body.sns.list.*", JSONArray.class)
.stream()
.map(JSON::toJSONString)
.forEach(list::add);
}
return list;
}

  第二步:解析数据。

public MyData crawlerDetailPage(String itemBody, Map<String, Object> params) throws Exception {
DocumentContext parse = JsonPath.parse(itemBody);
String pageUrl = "https://www.XXX.com/XXX/" + parse.read("$.resourceid", String.class) + ".html"; //拼接URL
String duplicateKey = CommonUtils.md5IdUrl(pageUrl);
if(duplicateKeyDao.containsKey(duplicateKey)){
return null;
}
MyDatamyData= new MyData();
String fromUrl = params.get("link").toString();// 获取父地址
String commentcount = parse.read("$.commentcount", String.class);// 评论数
String id = parse.read("$.id", String.class);// id
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = parse.read("$.publishtime", String.class);// 获取时间
if(time.contains("年")){
time = time.replace("年",":").replace("月",":").replace("日","");
}else{
time = calendar.get(Calendar.YEAR) + ":" + time.replace("月",":").replace("日","");
}
String picUrl = parse.read("$.image.url", String.class);// 封面图的URL
JSONArray read = parse.read("$.list.*", JSONArray.class);
if(read.size() > 0){
Object obj = read.get(0);
String videPicUrl = JsonPath.parse(obj).read("$.image.url", String.class);// 视频封面URL
String videoUrl = JsonPath.parse(obj).read("$.videourl.sdinfo.url", String.class);// 获取视频URL
String playcount = JsonPath.parse(obj).read("$.playcount", String.class);// 播放量
myData.setPlayCount(Long.parseLong(playcount));
myData.setCommentCount(Integer.parseInt(playcount));
myData.setPageLink(videoUrl);
myData.setVideoDynamicCover(videPicUrl);
}
String videoId = parse.read("$.id", String.class);// 视频ID
String title = parse.read("$.title", String.class);// 标题
String username = parse.read("$.user.name", String.class);// 用户名
String praisecount = parse.read("$.praisecount", String.class);// 点赞数
/**
* 封装数据
*/
return myData;
}

  针对JSON的入门,基本到这里也就差不多了

  • HTML格式

  其实原理和上面一样,只不过这个是使用Jsoup进行解析,上面是使用JsonPath进行解析。

    public List<String> crawlerListPage(String url) throws Exception {
List<String> result = new ArrayList<>();
String body = http(url).execute().parse().html();
return Jsoup.parse(body).select(/*CSS的各种选择器,只要保证绝对定位进行*/)
.stream()
.map(Element::toString)
.collect(Collectors.toList());
} public MyData crawlerDetailPage(String itemBody) throws Exception {
Document parse = Jsoup.parse(itemBody);
String pageUrl = "http:" + parse.select("CSS选择器").attr("href");// 获取文章链接
String title = parse.select("CSS选择器").text();// 获取文章Tile
String username = parse.select("CSS选择器").text();// 获取用户名
String like = parse.select("CSS选择器").text();// 获取点赞数
String id = parse.select("CSS选择器").attr("href");// 用户ID
String body = http(pageUrl).execute().body();
String time = Jsoup.parse(body).select("#content > div.gXB_R8JPG9i5-WDsZpN3C > div._30-dgPMBo3ct-NBvSsFmkq > p > span").text().replace("发布于", "");
String picUrl = "http:" + Jsoup.parse(body).select("#app > div > div.q-container > div:nth-child(4) > div > img").attr("src");// 封面链接
String content = Jsoup.parse(body).select("#textContBox").text();// 内容
MyData my = new MyData();
/*封装数据*/
return my;
}

Java网络爬虫的更多相关文章

  1. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  2. java网络爬虫基础学习(三)

    尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...

  3. java网络爬虫基础学习(一)

    刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...

  4. 学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  5. Java 网络爬虫,就是这么的简单

    这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑 ...

  6. Java网络爬虫笔记

    Java网络爬虫笔记 HttpClient来代替浏览器发起请求. select找到的是元素,也就是elements,你想要获取具体某一个属性的值,还是要用attr("")方法.标签 ...

  7. Java 网络爬虫获取页面源代码

    原博文:http://www.cnblogs.com/xudong-bupt/archive/2013/03/20/2971893.html 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网 ...

  8. 开源的49款Java 网络爬虫软件

    参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...

  9. 【转】44款Java 网络爬虫开源软件

    原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...

  10. hadoop中实现java网络爬虫

    这一篇网络爬虫的实现就要联系上大数据了.在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集.数据上传.数据分析.数据结果读取.数据可视化. 需要用到 ...

随机推荐

  1. 【Wince-DataTable填充ListView】DataTable的数据填充到ListView控件,适用.Net2.0

    在开发WinCE6.0程序的时候,要把DataTable的数据显示到ListView控件上,无法使用绑定, 只能使用循环遍历. 思路:外循环遍历行,内循环遍历列 //DataTable:dt2 //L ...

  2. ng-reapte指令遍历

    <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...

  3. 一种sqlor的拆分

    原脚本declare @Phone nvarchar(50)declare @CompanyNO nvarchar(50)set @Phone='13914124223'set @CompanyNO= ...

  4. Spring Boot教程(三十二)多数据源配置与使用(1)

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...

  5. Unity3D_(网格导航)简单物体自动寻路

    NavMesh(导航网络)是3D游戏世界中用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路. 实现Ca ...

  6. 解决zbx的web界面zabbix服务器端运行中 显示为不(启动命令)

    zabbix装完,发现server和agent服务都起来了,端口监听了,但是web界面zabbix服务器端运行中为 不 解决: 打开浏览器,到zabbix的setup.php界面 一般输入 ip/za ...

  7. 图解数据库中的join操作

    1.所有的join都从cross join衍生而来 2.所有join图示 转自Say NO to Venn Diagrams When Explaining JOINs

  8. C++入门经典-例5.2-使用指针比较两个数的大小

    1:代码如下: // 5.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  9. watir学习系列--对话框处理(转)

    1.下面是网上编写的类库,保存为libAutoit.rb #LibAutoit主要处理windows弹出的对话框,调用autoit类进行处理 #函数如下: #- ChooseFileDialog函数: ...

  10. 复制表结构和数据SQL语句(转)

    http://www.cnblogs.com/zhengxu/articles/2206894.html 1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 ...