Selenium 404 构建列表

Posted

技术标签:

【中文标题】Selenium 404 构建列表【英文标题】:Selenium build list of 404s 【发布时间】:2012-10-03 22:05:54 【问题描述】:

是否可以让 Selenium 抓取 TLD 并逐步导出找到的任何 404 列表?

我在 Windows 机器上卡了几个小时,想在回到舒适的 *nix 之前运行一些测试...

【问题讨论】:

你是如何运行你的测试的?我通过在发生测试数据时将测试数据导出到 sql 服务器来对 NUnit 做类似的事情。但如果您不使用 windows/ms/.net,我只能将其作为概念性答案。 测试通过 Python 运行,基于 unittest 库。它确实在 Windows 机器上执行 WebDriver 测试,并且可以利用数据库来导出测试数据。请发布您的解决方案作为答案,只要它设法抓取网站并标记 404,就可以满足要求 刚刚进行了快速搜索,this 是否适合您?听起来它会通过并为您获取一个列表,您可以编写一些关于获取 404 的代码。虽然,它确实需要公开链接。你在寻找更像wget -r 的东西吗? 感谢 wget -r 可能就足够了,尽管 selenium 爬虫更适合使用 Selenium 的要求,我无法看到使用它的示例,但正如你所说,编写一些代码来处理 404会工作的。 这是***.com/questions/6509628/… 的重复。 Selenium 不支持 HTTP 响应代码。此外,使用 urllib2 或 httplib2 可能更容易、更安全、更快捷。当然,除非您确实需要 Selenium 用于特定目的.... 【参考方案1】:

我不太了解 Python,也不了解它的任何常用库,但我可能会做这样的事情(使用 C# 代码作为示例,但概念应该适用):

// WARNING! Untested code here. May not completely work, and
// is not guaranteed to even compile.

// Assume "driver" is a validly instantiated WebDriver instance
// (browser used is irrelevant). This API is driver.get in Python,
// I think.
driver.Url = "http://my.top.level.domain/";

// Get all the links on the page and loop through them,
// grabbing the href attribute of each link along the way.
// (Python would be driver.find_elements_by_tag_name)
List<string> linkUrls = new List<string>();
ReadOnlyCollection<IWebElement> links = driver.FindElement(By.TagName("a"));
foreach(IWebElement link in links)

    // Nice side effect of getting the href attribute using GetAttribute()
    // is that it returns the full URL, not relative ones.
    linkUrls.Add(link.GetAttribute("href"));


// Now that we have all of the link hrefs, we can test to
// see if they're valid.
List<string> validUrls = new List<string>();
List<string> invalidUrls = new List<string>();
foreach(string linkUrl in linkUrls)

    HttpWebRequest request = WebRequest.Create(linkUrl) as HttpWebRequest;
    request.Method = "GET";

    // For actual .NET code, you'd probably want to wrap this in a
    // try-catch, and use a null check, in case GetResponse() throws,
    // or returns a type other than HttpWebResponse. For Python, you
    // would use whatever HTTP request library is common.

    // Note also that this is an extremely naive algorithm for determining
    // validity. You could just as easily check for the NotFound (404)
    // status code.
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    if (response.StatusCode == HttpStatusCode.OK)
    
        validUrls.Add(linkUrl);
    
    else
    
        invalidUrls.Add(linkUrl);
    


foreach(string invalidUrl in invalidUrls)

    // Here is where you'd log out your invalid URLs

此时,您有一个有效和无效 URL 的列表。您可以将这一切包装成一个方法,您可以将 TLD URL 传递到该方法中,并使用每个有效 URL 递归调用它。这里的关键是您没有使用 Selenium 来实际确定链接的有效性。如果您真的在进行递归爬网,您不会希望“单击”链接以导航到下一页。相反,您希望直接导航到页面上的链接。

您还可以采用其他方法,例如通过代理运行所有内容,并以这种方式捕获响应代码。这在一定程度上取决于您希望如何构建解决方案。

【讨论】:

以上是关于Selenium 404 构建列表的主要内容,如果未能解决你的问题,请参考以下文章

Selenium 报错问题

selenium+java:获取列表中的值

python+selenium下拉列表option对象操作方法一

如何使用 Capybara + Selenium 测试响应代码

构建错误:无法找到org.openqa.selenium.internal.Locatable的类文件

selenium结合docker构建分布式测试环境