这适用于在脚本中设置的cookie(可能在脚本标记内)。
System.Windows.Forms.HtmlDocument
执行这些脚本,并且可以通过 Cookies 属性检索设置的Cookie(如document.cookie=etc...
)。
我认为HtmlAgilityPack.HtmlDocument
没有这样做(执行)。我想知道是否有一种简单的方法可以模拟System.Windows.Forms.HtmlDocument
功能(cookies部分)。
任何?
答案 0 :(得分:3)
当我需要一起使用 Cookies 和 HtmlAgilityPack 时,或者只是创建自定义请求(例如,设置User-Agent
属性等)时,这里是我做了什么:
WebQuery
...
public HtmlAgilityPack.HtmlDocument GetSource(string url);
在此方法中我们需要做什么?
好吧,使用 HttpWebRequest 和 HttpWebResponse ,手动生成http请求(有几个如何在Internet上执行此操作的示例),创建一个{{{ 1}} class使用接收流的构造函数。
我们必须使用哪条视频流?嗯,返回的是:
HtmlDocument
如果使用 HttpWebRequest 进行查询,则可以轻松地将其httpResponse.GetResponseStream();
属性设置为每次访问新页面之前声明的变量,这样您访问的网站设置的所有Cookie都会正确存储在您CookieContainer
类中声明的CookieContainer
变量中,并计算您只使用{{1}的一个实例1}} class。
希望您能找到有用的解释。无论是否 HtmlAgilityPack 支持,你都可以使用它来计算你想做的事情。
答案 1 :(得分:2)
我还与Rohit Agarwal的BrowserSession课程以及HtmlAgilityPack一起工作。 但对我来说,随后调用“Get-function”并不起作用,因为每次都设置了新的cookie。 这就是我自己添加一些功能的原因。 (我的解决方案远不是完美的方式 - 它只是一个快速而肮脏的修复)但对我来说它有用,如果你不想花很多时间来调查BrowserSession课这里就是我做的:
添加/修改的功能如下:
class BrowserSession{
private bool _isPost;
private HtmlDocument _htmlDoc;
public CookieContainer cookiePot; //<- This is the new CookieContainer
...
public string Get2(string url)
{
HtmlWeb web = new HtmlWeb();
web.UseCookies = true;
web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest2);
web.PostResponse = new HtmlWeb.PostResponseHandler(OnAfterResponse2);
HtmlDocument doc = web.Load(url);
return doc.DocumentNode.InnerHtml;
}
public bool OnPreRequest2(HttpWebRequest request)
{
request.CookieContainer = cookiePot;
return true;
}
protected void OnAfterResponse2(HttpWebRequest request, HttpWebResponse response)
{
//do nothing
}
private void SaveCookiesFrom(HttpWebResponse response)
{
if ((response.Cookies.Count > 0))
{
if (Cookies == null)
{
Cookies = new CookieCollection();
}
Cookies.Add(response.Cookies);
cookiePot.Add(Cookies); //-> add the Cookies to the cookiePot
}
}
它的作用:它基本上保存了来自最初的“后响应”的cookie,并将相同的CookieContainer添加到稍后调用的请求中。我不完全理解它为什么不在初始版本中工作,因为它在AddCookiesTo函数中以某种方式相同。 (if(Cookies!= null&amp;&amp; Cookies.Count&gt; 0)request.CookieContainer.Add(Cookies);) 无论如何,使用这些添加的功能它现在应该可以正常工作。
可以像这样使用:
//initial "Login-procedure"
BrowserSession b = new BrowserSession();
b.Get("http://www.blablubb/login.php");
b.FormElements["username"] = "yourusername";
b.FormElements["password"] = "yourpass";
string response = b.Post("http://www.blablubb/login.php");
所有后续通话都应使用:
response = b.Get2("http://www.blablubb/secondpageyouwannabrowseto");
response = b.Get2("http://www.blablubb/thirdpageyouwannabrowseto");
...
我希望当你遇到同样的问题时会有所帮助。