gpt4 book ai didi

java - 如何递归查找网站上的所有URL——java

转载 作者:行者123 更新时间:2023-12-02 11:28:29 25 4
gpt4 key购买 nike

我有一个方法可以让我从页面获取所有 URL(并且可选 - 检查它是否有效)。但它只适用于 1 页,我想检查所有网站。需要进行递归。

private static FirefoxDriver driver;
public static void main(String[] args) throws Exception {
driver = new FirefoxDriver();
driver.get("https://example.com/");

List<WebElement> allURLs = findAllLinks(driver);
report(allURLs);

// here are my trials for recursion
for (WebElement element : allURLs) {
driver.get(element.getAttribute("href"));
List<WebElement> allUrls = findAllLinks(driver);
report(allUrls);
}
}
public static List findAllLinks(WebDriver driver)
{
List<WebElement> elementList = driver.findElements(By.tagName("a"));
elementList.addAll(driver.findElements(By.tagName("img")));
List finalList = new ArrayList();
for (WebElement element : elementList)
{
if(element.getAttribute("href") != null)
{
finalList.add(element);
}
}
return finalList;
}
public static void report(List<WebElement> allURLs) {
for(WebElement element : allURLs){
System.out.println("URL: " + element.getAttribute("href")+ " returned " + isLinkBroken(new URL(element.getAttribute("href"))));
}
}

请参阅评论“这是我对递归的尝试”。但它会浏览第一页,然后再次浏览第一页,仅此而已。

最佳答案

您正在尝试编写一个网络爬虫。我是代码重用的忠实粉丝。也就是说,在我花时间自己编写项目之前,我总是四处看看我的项目是否已经编写完成。网络爬虫有很多版本。一篇作者:Marilena Panagiotidou pops up early in a google search 。忽略导入,她的基本版本如下所示。

public class BasicWebCrawler {

private HashSet<String> links;

public BasicWebCrawler() {
links = new HashSet<String>();
}

public void getPageLinks(String URL) {
//4. Check if you have already crawled the URLs
//(we are intentionally not checking for duplicate content in this example)
if (!links.contains(URL)) {
try {
//4. (i) If not add it to the index
if (links.add(URL)) {
System.out.println(URL);
}
//2. Fetch the HTML code
Document document = Jsoup.connect(URL).get();
//3. Parse the HTML to extract links to other URLs
Elements linksOnPage = document.select("a[href]");
//5. For each extracted URL... go back to Step 4.
for (Element page : linksOnPage) {
getPageLinks(page.attr("abs:href"));
}
} catch (IOException e) {
System.err.println("For '" + URL + "': " + e.getMessage());
}
}
}

public static void main(String[] args) {
//1. Pick a URL from the frontier
new BasicWebCrawler().getPageLinks("http://www.mkyong.com/");
}
}

这里需要注意的最重要的事情可能是递归的工作原理。递归方法是一种调用自身的方法。你上面的例子不是递归。您有一个方法 findAllLinks,您可以在页面上调用一次,然后为页面中找到的每个链接调用一次。请注意 Marilena 的 getPageLinks 方法如何为它在给定 URL 的页面中找到的每个链接调用自身一次。在调用自身时,它会创建一个新的堆栈框架,并从页面生成一组新的链接,并为每个链接再次调用自己一次,等等。

关于递归函数,另一个需要注意的重要事项是它何时停止调用自身。在这种情况下,Marilena 的递归函数不断调用自身,直到找不到任何新链接。如果您正在抓取的页面链接到其域之外的页面,则该程序可能会运行很长时间。顺便说一句,在这种情况下可能发生的情况就是该网站的名字的由来:a StackOverflowError

关于java - 如何递归查找网站上的所有URL——java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49458816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com