使用HtmlAgilityPack进行网页抓取

3

我正在使用HtmlAgilityPack来在C# Asp.Net中进行网络爬虫,目前在从多个网页中进行爬取时没有遇到任何问题,但是,在尝试执行以下代码时我遇到了一个错误

Var getHtmlWeb = new HtmlWeb ();
Var home page = getHtmlWeb.Load ("https://www.corfo.cl/sites/cpp/home");

出现的错误是:
"连接中断:意外发送错误。"
唯一给我带来问题的网站是Corfo,不知道如何解决这个问题。 感谢您的帮助。

我注意到这个网站会重置使用htmlagilitypack进行C#连接。当在firefox中进行请求时,除了缺少一个图片外,一切正常,这是可以接受的。这个URL也有相同的连接重置 -“https://www.corfo.cl/sites/cpp/home”。 - Herbert Yu
这是你的网站吗?这个网站是如何工作的?对我来说,这个网站似乎从/sites设置了一个cookie,并且猜测如果没有得到这个cookie,会再次获取它,如果还是没有,就重置连接。但我没有详细检查JavaScript。 - Herbert Yu
1
@HerbertYu 理想情况下,使用HtmlAgilityPack进行数据提取是最好的选择,但您也可以考虑其他方法来执行对"https://www.corfo.cl/sites/cpp/home"的抓取。 - Andrés
1个回答

1
此网站依赖 cookie 工作,例如它请求的一个 URL 是 https://www.corfo.cl/sites/Satellite;jsessionid=T8w78ZolfWgr3ZoEBBvE81nBiXbXIdjfF1In3bgpZiYvL_w8TF4p!1081543155!-596930586?c=Page&cid=1456408322328&pagename=CorfoPortalPublico/Page/corfoListadoOfertaInteligenteWebLayout

所以,当您请求www.corfo.cl时,首先它会转发到www.corfo.cl/sites/cpp/home,然后在/sites/文件夹中,它设置cookie jsessionid = OHS_1〜T8w78ZolfWgr3ZoEBBvE81nBiXbXIdjfF1In3bgpZiYvL_w8TF4p!1081543155!-596930586等。

有了这个cookie,此页面将使用与此jsessionid相关的所有/某些组件构建自身。

如果客户端代码不处理这些逻辑,如上两行所示,服务器将按预期重置连接,因为服务器不知道如何在没有jsessionid的情况下构建此页面。

来自System.Net.WebException的内部异常是{"Authentication failed because the remote party has closed the transport stream."}

希望这可以帮助您!


我理解你的意思,但是如何设置cookie呢? 你能帮我写一下代码吗? - Andrés
2
添加了cookies但仍然不起作用,我的cookie经验几乎为零,感谢您的帮助=)我拥有的代码如下: 'var a = "corfo.cl"; var getHtmlWeb = new HtmlWeb(); getHtmlWeb.UseCookies = true; var paginaInicio = getHtmlWeb.Load(a);' - Andrés
1
这个HtmlAgilityPack客户端和Firefox之间还有哪些区别?你能设置一个合适的代理名称,与那些流行的浏览器一样吗?我知道Firefox肯定可以工作,并且它有多个前后往返。使用Firefox开发者来调试这个交互过程的步骤。然后使用HtmlAgilityPack来模拟这个过程。 - Herbert Yu
1
我已经写了没有使用htmlagilitypack的代码,但仍然无法工作 =( Uri target = new Uri("https://www.corfo.cl/"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(target); CookieContainer cookies = new CookieContainer(); cookies.Add(new Cookie("JSESSIONID", "OHS_1~LPJB4yOTbZFPxPBwWcJjJ-fPmlfhnEv_XL1MVnKSrN7hVaB-LWi7!-596930586!-316486629") { Domain = target.Host }); request.CookieContainer = cookies; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); - Andrés
另一个问题是“Html Agility Pack”的限制。Html Agility Pack仅是HTML解析器 - 它无法解释javascript或将其绑定到文档的内部表示形式。请参见https://dev59.com/MWgu5IYBdhLWcg3wWVyF以获取可能的答案。我还没有检查目标网站是否为动态网站。如果是,则必须使用另一个工具。 - Herbert Yu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接