java爬虫抓取动态网页(csdn用python3简单入门爬虫()())

优采云 发布时间: 2021-10-21 07:20

  java爬虫抓取动态网页(csdn用python3简单入门爬虫()())

  最近看了csdn微信推荐的python 3的简单入门爬虫(),想知道能不能用java技术做一个简单的爬虫?

  于是这个文章诞生了,我用的是jsoup,相关需求网上可以随便搜,接口文档()也可以搜到。

  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。

  可以知道文档的内容,获取数据源的方式有以下三种:

  (1) 从一段html代码字符串中获取:Document doc = Jsoup.parse(html);

  (2) 从一个u​​rl获取:Document doc = Jsoup.connect(url).get();

  (3)Get File input = new File("XXX.html"); 或 Document doc = Jsoup.parse(input, "UTF-8", url); 从一个 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);

}

}

  他的输出如下:

  

  我们发现我们已经得到了最基本的内容,现在我们需要简单地处理相反的内容。这个很简单,转换成string类型,用string相关的方法来处理。

  如果我们想导出保存到本地,可以使用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 {

//当前循环时间睡眠为10

Thread.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 (兼容; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC) ").超时(999999999)

  .userAgent的意思是模拟自己作为浏览器访问,防止反爬虫网站禁止访问爬虫程序;

  .timeout(999999999) 个人理解是延迟访问,也是为了防止反爬虫网站禁止访问爬虫程序;

  2.为什么循环从 9 而不是 0 或 1 开始?

  因为我们看小说的章节列表,发现前九章是最新的九章,而我们不需要这九章,因为我们可以在后面的循环中捕捉后九章,所以从9开始,或在循环结束时。减去9就可以了,因人而异。

  3.为什么要写一个 Thread.currentThread().sleep(5000); 来循环睡眠:

  因为你的频繁访问,即使你冒充浏览器,仍然会影响服务器的性能。服务器将拒绝此连接并使线程休眠。在这种情况下,它将模拟一个人浏览小说并在 5 秒内阅读。小说比较一般,可以下载几百本小说。

  以上内容就是我们对jsoup前端文字的简单爬虫获取。这里需要注意反爬虫服务器报的5XX和4XX错误。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线