c# - HtmlAgilityPack 和 Selenium Webdriver 返回随机结果

标签 c# selenium-webdriver web-scraping web-crawler html-agility-pack

我正在尝试从网站上抓取产品名称。奇怪的是,我似乎只随机抓取了 12 个项目。我已经尝试了 HtmlAgilityPack 和 HTTPClient,我得到了相同的随机结果。这是我的 HtmlAgilityPack 代码:

using HtmlAgilityPack;
using System.Net.Http;

var url = @"http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
HtmlWeb web = new HtmlWeb();
var doc = web.Load(url, "GET", proxy, new NetworkCredential(PROXY_UID, PROXY_PWD, PROXY_DMN));
var nodes = doc.DocumentNode.Descendants("div")
            .Where(div => div.GetAttributeValue("class", string.Empty) == "product-name")
            .Select(div => div.InnerText.Trim())
            ;

[更新 1] @CodingKuma 建议我试试 Selenium Webdriver。这是我使用 Selenium Webdriver 的代码:

IWebDriver chromeDriver = new ChromeDriver(@"C:\TEMP\Projects\Chrome\chromedriver_win32");
chromeDriver.Url = "http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
var items = chromeDriver.FindElements(By.ClassName("product-name"));
items.Count().Dump();
chromeDriver.Quit();

我试过这段代码,但还是不行。该页面上有 20 多个项目,但我似乎只得到随机的 12 个。如何抓取该网站上的所有项目?

最佳答案

从 v1.5.0-beta92 开始,

HtmlAgilityPack 有一个 FromBrowser 方法,允许您等待所有您想要的元素准备就绪。

文档:http://html-agility-pack.net/from-browser

string url = "http://html-agility-pack/from-browser";

var web1 = new HtmlWeb();
var doc1 = web1.LoadFromBrowser(url, o =>
{
    var webBrowser = (WebBrowser) o;

    // WAIT until the dynamic text is set
    return !string.IsNullOrEmpty(webBrowser.Document.GetElementById("uiDynamicText").InnerText);
});
var t1 = doc1.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText

var web2 = new HtmlWeb();
var doc2 = web2.LoadFromBrowser(url, html =>
{
    // WAIT until the dynamic text is set
    return !html.Contains("<div id=\"uiDynamicText\"></div>");
});
var t2 = doc2.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText

Console.WriteLine("Text 1: " + t1);
Console.WriteLine("Text 2: " + t2);

这里的技巧是找到可以告诉您页面何时准备就绪的信息,因为图书馆不可能知道。

关于c# - HtmlAgilityPack 和 Selenium Webdriver 返回随机结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45243042/

相关文章:

c# - 在 c++/c# 中从哪里开始抓取/爬行?

python - 使用 python 通过网络抓取来提取表

c# - 运行 WPF 应用程序时出错

c# - AutoCompleteSource 停止 KeyPress 事件?

c# - 如何在 C# 中使用 cookie 执行简单的 GET 请求

javascript - 无法在 selenium 3.0-beta3 中使用 geckodriver 0.10 使用 Javascript 和 selenium 自己的示例启动 Firefox

java - Selenium 没有检测到 IE 中的第二个窗口

c# - 如何将现有屏幕添加到 Sketchflow map ?

python - Selenium Python 的 http.client.RemoteDisconnected : Remote end closed connection without response error using driver. quit()

java - 如何在 Java 中检索 "inspected source code"(Google chrome)?