在表单中提交项目

时间:2018-01-06 09:40:24

标签: c# html-form anglesharp

[编辑于18/01年1月18日提供有关代码的更多背景知识。此版本显示使用的完整代码]

我在使用AngleSharp提交表单时遇到了一些麻烦。

我使用AngleSharp来抓取此网站的Proxies地址。基本上我用AngleSharp和IBrowsingContext(我的代码中的页面)打开网站

然后我提交Async Forms [0]以获得完整的代理列表(请参阅网站链接以了解我的意思)并阅读其中的不同代理[此部分未在此处提供]。

当我想在不同的页面中导航时(通常大约60页,底部有一个导航栏,即页面中的表格1),它变得更加复杂。

根据Florian Rappl的建议,我根据他给出的一个例子(see here)打开了资源加载。在下面发布的代码中,我评论了内存使用情况,因为似乎ressource加载循环下载内存使用量急剧上升。为了比较,我提供了内存使用而没有加载资源。这是一个完全可用的控制台应用程序代码。

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'

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你在这里展示的主要元素依赖于JavaScript。看到这个部分print (jez1(s)) print (jez2(s)) In [173]: %timeit jez1(s) 1 loop, best of 3: 199 ms per loop In [174]: %timeit jez2(s) 10 loops, best of 3: 92 ms per loop - 当你导航时肯定没有执行(实际导航到这里只会转到定义的锚onclick="gp.pageClick(2);",通常不应该重新加载页面,但显然它确实 - 页面是空的,因为原始页面是通过表单POST检索的,而这个新页面是通过GET检索的,没有表格数据。)

AngleSharp脚本lib仅适用于(atm)非常简单的脚本。例如,一旦需要Angular,React等甚至特定版本的jQuery,脚本就不会起作用。您可以尝试#2查看这是否有效,document.ExecuteScript("gp.pageClick(2)")在您的示例中引用document

TL; DR:这些天很多页面需要(过量)使用JS。在将AngleSharp与浏览器进行比较之前,请确保AngleSharp在页面上没有JS问题,或者在浏览器中关闭JS以准确比较没有JS的行为。

希望这有帮助!