【发布时间】:2020-08-08 21:58:16
【问题描述】:
我正在研究网络爬虫,但我连续第二天遇到的问题无法解决。
这种方法的问题是当机器人应该访问网站时,收集所有的 URL,并将其中没有访问过的 URL 添加到 List "toVisit"
有问题的代码:
Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
for (Element e : temp) {
String x = e.getAt("href");
if(!visited.contains(x)) {
toVisit.add(x);
}
}
但是,if 语句没有过滤(或以我没有发现的方式过滤)url,我不知道为什么。
我尝试删除“!”在语句中创建一个 else 部分并粘贴 toVisit.add(x) 那里,但它没有帮助。
当我打印每个网址时,机器人会访问相同的网址两次甚至五次。
编辑(已访问定义)
static List<String> visited = new ArrayList<String>();
EDIT2(完整代码)
import java.util.ArrayList;
import java.util.List;
import com.jaunt.*;
public class b03 {
static String currentUrl = "https://stackoverflow.com";
static String stayAt = currentUrl;
static String searchingTerm = "";
static int toSearch = 50;
static List<String> toVisit = new ArrayList<String>();
static List<String> visited = new ArrayList<String>();
static UserAgent userAgent = new UserAgent();
public static void main(String[] args) {
System.out.println("*started searching...*");
while(visited.size() < toSearch)
visitUrl(currentUrl);
System.out.println("\n\n*done*\n\n");
}
public static void visitUrl(String url) {
visited.add(url);
evaluateUrls();
searchTerm();
toVisit.remove(0);
currentUrl = toVisit.get(0);
}
public static void searchTerm() {
//if(userAgent.doc.getTextContent().contains(searchingTerm))
System.out.println(visited.size() +") "+ currentUrl);
}
public static void evaluateUrls() {
try {
Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
for (Element e : temp) {
String x = e.getAt("href");
if(!visited.contains(x) && x.contains(stayAt)) {
toVisit.add(x);
}
}
}catch (Exception e) {
System.out.println(e);
}
}
}
【问题讨论】:
-
visited定义在哪里? -
不相关的旁注:使访问的集合而不是列表。对于大型列表,列表查找('contains()')非常慢。
标签: java string contains jaunt-api