[编辑于 10/01/18 以提供有关代码的更多背景信息。此版本提供使用的完整代码]
我在使用 AngleSharp 提交表单时有些挣扎。
我使用 AngleSharp 来废弃这个网站以获取代理地址。基本上,我用 AngleSharp 和 IBrowsingContext 打开网站(我的代码中的页面)
然后我 SubmitAsync Forms[0] 以获得完整的代理列表(请参阅网站链接以了解我的意思)并阅读那里的不同代理[这部分未在此处介绍]。
当我想在不同的页面中导航时,它变得更加复杂(通常大约 60 个页面,底部有一个导航栏,即页面中的表格1)。
按照 Florian Rappl 的建议,我根据他给出的示例打开了资源加载(请参见此处)。在下面发布的代码中,我评论了内存使用情况,因为似乎资源加载循环下载了一些内存使用量猛增的东西。为了比较,我提供了没有加载资源的内存使用情况。这是控制台应用程序的完全可行的代码。
static void Main(string[] args)
{
ASTester().GetAwaiter().GetResult();
Console.ReadKey();
}
.
static async Task ASTester()
{
var Handler = new HttpClientHandler()
{
PreAuthenticate = true,
UseDefaultCredentials = false,
};
var Client = new HttpClient(Handler);
Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
var Requester = new HttpClientRequester(Client);
var Configuration = AngleSharp.Configuration.Default.WithDefaultLoader(setup =>
{
setup.IsResourceLoadingEnabled = true;
}, requesters: new[] { Requester }).WithJavaScript().WithCss();
var Page = BrowsingContext.New(Configuration);
/*At this point :
* Mem usage : ~15 MB
*/
/*Open the page with the proxy list
* with setup.IsResourceLoadingEnabled = true;
* Mem usage : ~80 MB
* without
* Mem usage : ~35 MB
*/
await Page.OpenAsync("http://www.gatherproxy.com/proxylist/anonymity/?t=Elite");
/*Submit the first form (id = 0) which will activate the bar to navigate within the different pages
* with setup.IsResourceLoadingEnabled = true;
* Mem usage : 300 MB
* without
* Mem usage : ~50 MB
*/
await Page.Active.Forms[0].SubmitAsync();
/*Activate the script to go to page 2
* with setup.IsResourceLoadingEnabled = true;
* Mem usage : 1.5 GB
* without
* Mem usage : >> Exception
*/
Page.Active.ExecuteScript("gp.pageClick(2);");
//Giving time for the script to execute
Thread.Sleep(40000);
}
脚本执行有一半的时间会引发异常。其余的 Page.Active 评估是'((AngleSharp.Dom.Document)((AngleSharp.BrowsingContext)Page).Active).ActiveElement' threw an exception of type 'System.NullReferenceException'