我有下面的代码,可以使用JSoup抓取网站,但我想同时抓取多个URL。我将URL存储在一个数组中,但无法使其工作。如果我想使用它,如何在多线程中实现这段代码?多线程对这样的应用程序有好处吗?
public class Webcrawler {
public static void main(String[] args) throws IOException {
String [] url = {"http://www.dmoz.org/","https://docs.oracle.com/en/"};
//String [] url = new String[3];
//url[0] = "http://www.dmoz.org/";
//url[1] = "http://www.dmoz.org/Computers/Computer_Science/";
//url[2] = "https://docs.oracle.com/en/";
for(String urls : url){
System.out.print("Sites to be crawled\n " + urls);
}
//String url = "http://www.dmoz.org/";
print("\nFetching %s...", url);
Document doc = Jsoup.connect(url[0]).get();
org.jsoup.select.Elements links = doc.select("a");
//doc.select("a[href*=https]");//(This is the one you are looking for)selects if value of href contatins https
print("\nLinks: (%d)", links.size());
for (Element link : links) {
print(" (%s)", link.absUrl("href") /*link.attr("href")*/, trim(link.text(), 35));
}
}
private static void print(String msg, Object... args) {
System.out.println(String.format(msg, args));
}
private static String trim(String s, int width) {
if (s.length() > width)
return s.substring(0, width-1) + ".";
else
return s;
}
}
您可以同时使用多线程和抓取多个网站。下面的代码可以满足您的需要。我很确定它可以改进很多(例如通过使用执行器
),但我写得很快。
public class Main {
public static void main(String[] args) {
String[] urls = new String[]{"http://www.dmoz.org/", "http://www.dmoz.org/Computers/Computer_Science/", "https://docs.oracle.com/en/"};
// Create and start workers
List<Worker> workers = new ArrayList<>(urls.length);
for (String url : urls) {
Worker w = new Worker(url);
workers.add(w);
new Thread(w).start();
}
// Retrieve results
for (Worker w : workers) {
Elements results = w.waitForResults();
if (results != null)
System.out.println(w.getName()+": "+results.size());
else
System.err.println(w.getName()+" had some error!");
}
}
}
class Worker implements Runnable {
private String url;
private Elements results;
private String name;
private static int number = 0;
private final Object lock = new Object();
public Worker(String url) {
this.url = url;
this.name = "Worker-" + (number++);
}
public String getName() {
return name;
}
@Override
public void run() {
try {
Document doc = Jsoup.connect(this.url).get();
Elements links = doc.select("a");
// Update results
synchronized (lock) {
this.results = links;
lock.notifyAll();
}
} catch (IOException e) {
// You should implement a better error handling code..
System.err.println("Error while parsing: "+this.url);
e.printStackTrace();
}
}
public Elements waitForResults() {
synchronized (lock) {
try {
while (this.results == null) {
lock.wait();
}
return this.results;
} catch (InterruptedException e) {
// Again better error handling
e.printStackTrace();
}
return null;
}
}
}
我有上面的编码来提取使用硒 - 蟒蛇的href链接。我想提取每个人的个人资料“董事会成员”中的内容。我知道如何逐个提取它们,但不知道如何编写循环来执行此操作。 以下是我的代码: 任何想法都很感谢!
问题内容: 我正在尝试使用JSoup从Google抓取搜索结果。目前这是我的代码。 我只是想获取搜索结果的标题以及标题下方的摘录。是的,我只是不知道要搜寻这些元素要查找哪些元素。如果有人有更好的方法使用Java抓取Google,我想知道。 谢谢。 问题答案: 干得好。 另外,要自己完成此操作,我建议您使用chrome。您只需右键单击要刮取的任何内容,然后检查元素。它将带您到该元素位于html的确切
我试图从html文件中获取内容,该文件位于html中。gz文件。当我尝试使用Jsoup点击URL时,我得到: 线程“main”til.readEOFException中的异常:til.java:154InflaterInputSorg.jsoup.helper.(InflaterInputSesponse.execute)onnection.java:560InflaterInputSorg.js
我需要捕获相同模式的多个组。假设,我有以下字符串: 我写了以下模式 我想让它做的是捕捉每一个单词,所以第一组是“你好”,第二组是“那里”,第三组是“世界”。我的正则表达式实际上捕获的只是最后一个,即“世界”。 我在这里测试我的正则表达式,我想将其与Swift一起使用(也许Swift中有一种方法可以以某种方式获得中间结果,以便我可以使用它们?) 更新:我不想使用拆分。我现在只需要知道如何捕获所有符合
我想刮从多个网站与类似的网址的,如https://woollahra.ljhooker.com.au/our-team, https://chinatown.ljhooker.com.au/our-team和https://bondibeach.ljhooker.com.au/our-team. 我已经写了一个脚本,第一个网站的工作,但我不知道如何告诉它从其他两个网站刮。 我的代码: 有没有一种方
问题内容: 我正在抓取r / theonion并将标题写入文本文件onion.txt。之后,我打算抓取r / nottheonion并将标题写入文本文件nottheonion.txt。我成功写入了onion.txt,但未写入nottheonion.txt。 问题答案: 无论如何,如果要使用Promise,请使用 和简化代码,而不要重复使用函数。 这未经测试。