[编辑于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'
答案 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的行为。
希望这有帮助!