【1】用jsoup来实现简单的java爬虫
来源:互联网 发布:树人围棋软件注册码 编辑:程序博客网 时间:2024/05/16 14:03
最近看了csdn微信推荐的一篇用python 3简单入门爬虫(http://mp.weixin.qq.com/s/lGenb6F-r8YyoE2ZO0cVSw),于是想到我是不是可以用java的技术弄一个简单的爬虫呢?
于是此文章诞生,我用的是jsoup,相关需要架包网上可以很容易搜到,接口文档(https://jsoup.org/apidocs/overview-summary.html)也能搜到。
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
文档内容可知道,获取数据源的方法有三种:
(1)从一段html代码字符串获取: html);
(2)从一个url获取: ).get();
(3)从一个html文件获取 XXX.html"); 或
废话不说,进入正文。
每一个页面都有相关的前端内容,我们这里就是先分析相关页面的内容,然后根据标签来进行分别分类获取,然后利用java的其余技术来处理你获取的内容。
首先最基本的,获取页面的全部代码,包含HTML,CSS等内容,这里也以网络盗版小说网站为例子,进行相关的爬虫。
package pachong;import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;public class Test1 {//第一个,完整爬虫爬下来内容public static void get_html(String url){try {Document doc = Jsoup.connect(url).get();System.out.println(doc);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String url = "http://www.biquge5200.com/78_78387/149957687.html";get_html(url);}}
输出的结果如下:
因为consle不能全部截图,我就截图了一部分,从这里就能看到完整的前端内容。
而我们只需要里面的小说内容,而对于什么样式,脚本等等之类的东西并不是我们需要的,于是我们先找到小说正文内容,根据正文内容来处理。
我们分析正文内容发现,正文内容全部是被一组id为content的div包含的,对于其他内容,我们并不需要,只需要id为content的div内容里的数据,于是我们能不能只要这里面的东西的。
而查询jsoup,我们发现确实是有相关获取class,id,tag的方法的,可以利用这些发现来获取我们需要的数据,于是第二个例子就出现了。
package pachong;import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class Test2 {//第二个,选择内容爬下来public static void get_html(String url) {try {Document doc = Jsoup.connect(url).get();//得到html中id为content下的所有内容Element ele = doc.getElementById("content");//分离出下面的具体内容Elements tag = ele.getElementsByTag("div");System.out.println(tag);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String url = "http://www.biquge5200.com/78_78387/149957687.html";get_html(url);}}
他的输出结果如下图:
我们发现最基本的内容我们已经拿到,现在就是需要对立面的内容来简单的处理一下。这就很简单了,转换成字符串类型的,利用字符串的相关方法来处理这个。
如果我们要导出来保存本地,就可以利用java的io来处理相关数据并保存。
package pachong;import java.io.File;import java.io.FileWriter;import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class Test2 {//第二个,选择内容爬下来并保存到自己电脑public static void get_html(String url) {try {Document doc = Jsoup.connect(url).get();//得到html中id为content下的所有内容Element ele = doc.getElementById("content");//分离出下面的具体内容Elements tag = ele.getElementsByTag("div");//System.out.println(tag);String text = tag.text();//替换里面的空格为换行String needs = text.replace(" ", "\n");//得到整个html里面的tittle,方便爬虫下来的txt命名文件名Elements titlehtml = doc.getElementsByTag("title");String tittle = titlehtml.text();//去掉多余的txt文件命名的文字String head=tittle.substring(0,tittle.length()-7);File file = new File("D:\\"+head+".txt");FileWriter fw = new FileWriter(file);fw.write(needs);fw.close();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String url = "http://www.biquge5200.com/78_78387/149957687.html";get_html(url);}}
那上面只是简单的一篇小说,如果我们想把全本小说全部下载到我们的电脑里并保存下来,那又如何处理呢?
我们先看看整个目录的小说里对前端内容的分析,我们发现,其实每个章节的内容都在一个id为list的div下,那面根据上面的经验来说,我们就拿list来获取。
然后获取到后,我们根据超链接标签a来遍历,获取到数据后,在循环里打开页面,然后爬虫下载下来就可以了。
package pachong;import java.io.File;import java.io.FileWriter;import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class Test3 {//第三个,批量选择内容爬下来并保存到自己电脑public static void get_html(String url) {try {//模仿浏览器访问Document doc = Jsoup.connect(url) .userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)") .timeout(999999999) .get();//得到html中id为list下的所有内容Element ele = doc.getElementById("list");//得到html中id为list下,同时标签为a的下面数据Elements tag = ele.getElementsByTag("a");String taghref, tagtext;for (int i = 9; i < tag.size(); i++) {try {//当前循环时间睡眠为10Thread.currentThread().sleep(5000);taghref = tag.get(i).attr("href");tagtext = tag.get(i).text();Document docs = Jsoup.connect(taghref) .userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)") .timeout(999999999) .get();Element eles = docs.getElementById("content");Elements tags = eles.getElementsByTag("div");String texts = tags.text().replace(" ", "\r\n\r\n");String tittle = docs.getElementsByTag("title").text();String head = tittle.substring(0, tittle.length() - 7);File file = new File("D:\\Desktop\\hanxiang\\" + head + ".txt");FileWriter fw = new FileWriter(file);fw.write(texts);fw.close();} catch (Exception e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String url = "http://www.biquge5200.com/78_78387/";get_html(url);}}
这里有几个地方解释:
1.先说.userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)").timeout(999999999)
.userAgent表示是模拟自己是浏览器访问,防止反爬虫网站对爬虫程序的禁止访问;
.timeout(999999999)个人理解是延时访问,也是防止反爬虫网站对爬虫程序的禁止访问;
2.为何循环从9开始,而不是从0或者1开始呢?
因为我们看小说章节目录发现,前面九章是最新更新的九章,而这九章我们并不需要,因为我们后面的循环可以抓到最后的九章,所以从9开始,或者在循环结束那减去9也可以的。因人而异。
3.为何要写个Thread.currentThread().sleep(5000);来对循环睡眠:
因为你频繁访问,哪怕你伪装成浏览器,还是会对服务器性能等方面造成影响,服务器会对这种连接拒绝,而睡眠线程,这样的话,就模拟一个人正在浏览小说,5秒看完一篇小说是比较很正常的,这样,你才能把上百上千的小说下载下来。
以上内容是我们对jsoup对前端的文字简单的爬虫获取,这里需要注意下反爬虫服务器报的5XX和4XX的报错。
- 【1】用jsoup来实现简单的java爬虫
- 【2】用jsoup来实现简单的java爬虫-图片篇
- 【3】用jsoup来实现简单的java爬虫-视频篇
- Jsoup实现简单的爬虫
- 基于Jsoup实现的简单爬虫
- Jsoup-实现简单的网络爬虫
- 基于Jsoup实现的简单网络爬虫
- JAVA爬虫--Jsoup的简单运用
- JAVA简单爬虫例子--Jsoup的运用
- Java爬虫学习:利用HttpClient和Jsoup库实现简单的Java爬虫程序
- 用URLConnection来实现简单的java网络爬虫
- 简单的网络爬虫实现(Jsoup使用)
- java写的一个简单的爬虫(jsoup)
- java爬虫--jsoup简单的表单抓取案例
- 【正完成】Java基于Jsoup的网络爬虫工具实现
- 好用的爬虫:Jsoup
- java爬虫实战简单用Jsoup框架进行网页爬虫(如抓取网页图片)
- 【使用JSOUP实现网络爬虫】清理HTML-消除不受信任的html (来防止xss攻击)
- 找不到引用?! 找“NuGet程序包管理器”
- 用分治法解决循环赛日程表
- C# 从MongoDB导入数据到mysql
- 有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决
- NOJ1571八数码问题
- 【1】用jsoup来实现简单的java爬虫
- 正则表达式的常用操作符
- 留给人类的时间不多了?现在不学机器学习更待何时!
- Android程序签名打包 什么是签名,有什么用:
- Bean named 'deptDao' must be of type [com.zttech.sys.dao.IGroupDao], but was actually of type [com.s
- AngularJS(1.X)
- HDU-6010-Daylight Saving Time
- hbase于centos的安装
- LINUX 安装 JDK 配置环境变量