HtmlAgilityPack和Selenium Webdriver返回随机结果

inq*_*one 15 c# web-crawler web-scraping html-agility-pack selenium-webdriver

我正试图从网站上删除产品名称.奇怪的是,我似乎只抓了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())
            ;
Run Code Online (Sandbox Code Playgroud)

[更新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();
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码,但仍然没有运气.该页面上有20多个项目,但我似乎只是随机获得12.如何抓取该网站上的所有项目?

Jon*_*nan 5

自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);
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是在页面准备就绪时找到告诉你的东西,因为库不可能知道.


Cod*_*uma 3

对于大多数动态加载内容的单页应用程序或页面,您最好使用实际的浏览器来导航页面。我建议研究硒来进行这种类型的设置。

https://www.nuget.org/packages/Selenium.WebDriver