我正在使用网络抓取工具,但是连续第二天都无法解决问题。
此方法的问题是,当机器人应访问网站,收获所有URL,并将尚未访问的URL添加到List
问题代码:
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部分,并将其粘贴到此处的Visit.add(x),但这没有帮助。
当我打印每个URL时,机器人会访问相同的URL两次甚至五次。
编辑(已定义访问)
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);
}
}
}
您的机器人多次访问了一些URL,因为您多次将它们添加到toVisit
列表中。
toVisit
列表中。接下来,它会访问标签页面(stackoverflow.com/tags)。此页面再次包含指向与以前相同的四个URL的链接。由于您尚未访问用户和作业子页面,因此它将第二次添加到toVisit
列表中。
要解决此问题,您只应将不在toVisit
列表中的URL添加到visited
列表中
and不在toVisit
列表中:
if (!visited.contains(x) && !toVisit.contains(x) && x.contains(stayAt)) {
toVisit.add(x);
}
分割您的代码,使其可读。尽量不要使用“静态”。
希望有帮助
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
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...*");
toVisit.add(currentUrl);
while(toVisit.size() > 0 && visited.size() < toSearch){
visitUrl(toVisit.get(0));
}
System.out.println("\n\n*done*\n\n");
}
public static void visitUrl(String url) {
List<String> ee = evaluateUrls(url);
searchTerm(url);
visited.add(url);
toVisit.remove(url);
toVisit.addAll(ee.stream().filter( e -> !visited.contains(e)).collect(Collectors.toList()));
toVisit.remove(0);
}
public static void searchTerm(String currentUrl) {
//if(userAgent.doc.getTextContent().contains(searchingTerm))
System.out.println(visited.size() +") "+ currentUrl);
}
public List<String> evaluateUrls(String currentUrl) {
List<String> subUrls = new ArrayList<>();
try {
Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
for (Element e : temp) {
String x = e.getAt("href");
subUrls.add(x);
}
}catch (Exception e) {
System.out.println(e);
}
return subUrls;
}
}