0

[编辑于 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'

4

1 回答 1

0

我认为您的问题是您在此处显示的锚元素依赖于 JavaScript。请参阅这部分onclick="gp.pageClick(2);"- 当您导航时它肯定不会执行(实际上在这里导航只会转到定义的锚点#2,通常不应该重新加载页面,但显然它会 - 页面是空的,因为原始页面是通过检索的一个表单 POST,而这个新表单是通过 GET 获取的,没有表单数据)。

AngleSharp 脚本库仅适用于 (atm) 非常简单的脚本。一旦需要,例如 Angular、React 等,甚至需要特定版本的 jQuery,这些脚本将无法工作。您可以尝试document.ExecuteScript("gp.pageClick(2)")查看这是否有一些效果,在您的示例中document会提到哪里。Page.Active

TL;DR:如今,许多页面都需要(过度)使用 JS。在将 AngleSharp 与浏览器进行比较之前,请确保 AngleSharp 对页面上的 JS 没有问题,或者您在浏览器中关闭 JS 以准确比较没有 JS 的行为。

希望这可以帮助!

于 2018-01-06T12:25:11.900 回答