java爬虫抓取动态网页(csdn用python3简单入门爬虫()())
优采云 发布时间: 2021-10-21 07:20java爬虫抓取动态网页(csdn用python3简单入门爬虫()())
最近看了csdn微信推荐的python 3的简单入门爬虫(),想知道能不能用java技术做一个简单的爬虫?
于是这个文章诞生了,我用的是jsoup,相关需求网上可以随便搜,接口文档()也可以搜到。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
可以知道文档的内容,获取数据源的方式有以下三种:
(1) 从一段html代码字符串中获取:Document doc = Jsoup.parse(html);
(2) 从一个url获取: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错误。