基于javaswing的Web爬行
我正在开发一个基于Java的网络爬虫。我创建了一个JFrame(Java:Swing)。我的爬虫程序正在成功运行。它正在访问创建的链接。但我想在JTextArea中添加动态爬网链接,但它没有。我不能那样做。当我尝试这个时,我的程序被冻结了。但我可以将访问的url设置为控制台 我的gui如下所示:基于javaswing的Web爬行,java,swing,web-crawler,Java,Swing,Web Crawler,我正在开发一个基于Java的网络爬虫。我创建了一个JFrame(Java:Swing)。我的爬虫程序正在成功运行。它正在访问创建的链接。但我想在JTextArea中添加动态爬网链接,但它没有。我不能那样做。当我尝试这个时,我的程序被冻结了。但我可以将访问的url设置为控制台 我的gui如下所示: Document html = null; try { html = Jsoup.connect(url).get(); Elements lin
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
jTextArea2.append(tmp + "\n");
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
我的代码行如下所示:
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
jTextArea2.append(tmp + "\n");
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
如何在JTextarea中动态设置访问过的url?试试以下方法:
new Thread((Runnable)() ->
{
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
EventQueue.invokeLater(() -> {
jTextArea2.append(tmp + "\n");
});
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
}catch(Exception e){}
}).start();
GUI冻结的原因是您正在阻止GUI线程。因此,通过创建一个新线程,在不同的线程上开始您的操作,然后从那里开始运行。
要获取更新,请致电EventQue
它将告诉GUI线程将文本添加到JTextArea尝试以下操作:
new Thread((Runnable)() ->
{
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
EventQueue.invokeLater(() -> {
jTextArea2.append(tmp + "\n");
});
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
}catch(Exception e){}
}).start();
GUI冻结的原因是您正在阻止GUI线程。因此,通过创建一个新线程,在不同的线程上开始您的操作,然后从那里开始运行。
要获取更新,请致电EventQue
它将告诉GUI线程将文本添加到JTextArea您是否从UI事件线程调用此代码?大多数Swing控件只支持从UI事件线程调用。欢迎使用Stack Overflow,请阅读并浏览,这将引导您找到,这将在稍后告诉您发布一个有效的消息来演示您的问题。由于您的程序不完整,因此不可编译,我们不希望您的整个应用程序都是完整的,但需要一个简单但完整的示例(不是代码片段)来演示您的问题。例如,您可以对URL进行硬编码,并使用一个
JTextArea
和一个JButton
启动该过程。我们知道您的GUI冻结,但您的问题太广泛,因为它缺乏足够的信息(即MCVE)来回答。。。。。。因为你可能还没有在EDT中初始化你的应用程序,或者你正在EDT中运行它,也许你也想看看,这允许你在一个单独的线程中处理长任务,而不阻塞EDT(这会冻结你的GUI)。另外,请阅读您是否从UI事件线程调用此代码?大多数Swing控件只支持从UI事件线程调用。欢迎使用Stack Overflow,请阅读并浏览,这将引导您找到,这将在稍后告诉您发布一个有效的消息来演示您的问题。由于您的程序不完整,因此不可编译,我们不希望您的整个应用程序都是完整的,但需要一个简单但完整的示例(不是代码片段)来演示您的问题。例如,您可以对URL进行硬编码,并使用一个JTextArea
和一个JButton
启动该过程。我们知道您的GUI冻结,但您的问题太广泛,因为它缺乏足够的信息(即MCVE)来回答。。。。。。因为你可能还没有在EDT中初始化你的应用程序,或者你正在EDT中运行它,也许你也想看看,这允许你在一个单独的线程中处理长任务,而不阻塞EDT(这会冻结你的GUI)。也请阅读