我试图使用System.Windows.Forms WebBrowser类导航到网站以解析其内容。不幸的是,该请求首先被重定向到隐私策略站点,在该站点中,系统会提示用户先确认按钮,然后再将其定向到原始URL。
要解决此问题,我根据以下答案编写了一个小型控制台应用程序:
https://stackoverflow.com/a/4271581/9703315
class Program
{
static void Main(string[] args)
{
new Importer().ImportWebsite();
}
}
class Importer
{
public void ImportWebsite()
{
RunBrowserThread(new Uri("http://..."));
Console.ReadLine();
}
private void RunBrowserThread(Uri url)
{
var thread = new Thread(() => {
var browser = new WebBrowser();
browser.DocumentCompleted += Browser_DocumentCompleted;
browser.Navigate(url);
browser.ScriptErrorsSuppressed = true;
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var browser = sender as WebBrowser;
var buttonContainer = browser.Document.GetElementById("consentButtonContainer");
if (buttonContainer != null)
{
var button = buttonContainer.GetElementsByTagName("BUTTON");
button[0].InvokeMember("click");
Console.WriteLine("click");
}
var html = browser.Document.GetElementsByTagName("HTML");
var doc = html[0].OuterHtml;
Console.WriteLine(doc);
}
}
首先,我创建一个新的WebBrowser对象并导航到所需的URL。加载网站后,将触发DocumentCompleted事件。然后,将检查HtmlDocument是请求的站点还是隐私策略站点。隐私权政策将有一个带有按钮确认的容器。如果找到了这些,我可以使用InvokeMember()方法单击该按钮并触发重定向。
这时我需要一些指导。现在,我希望在单击按钮后加载所需的站点时会再次触发DocumentCompleted事件。这永远不会发生。在按钮上使用InvokeMember(“ click”)之后,我是否需要采取一些其他步骤,或者为什么从未调用DocumentCompleted?