AngleSharp-如何浏览链接触发表单提交的网站

时间:2019-03-19 19:55:18

标签: asp.net web-scraping anglesharp

我正尝试从该网站的多个搜索结果页中抓取“更多”链接:https://www.cgg.com/en/31

没有指向搜索结果任何特定页面的规范链接。当您导航到页面2时,URL仍为https://www.cgg.com/en/31

检查基础HTML和JavaScript后,我发现单击分页链接会触发JavaScript函数。

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$ctl00$Layout-7-main-partial2$TmsPager1$ctl02$ctl00','')">NEXT</a>

这是被调用的函数:

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

因此,通过单击“下一步”,浏览器将重定向到相同的URL,但内容不同。

在单击“下一步”按钮后,我想从下一页抓取“更多内容”链接。由于单击“下一步”按钮实际上会提交表单并重新加载页面,因此我将如何使用AngleSharp进行此操作?

这是我到目前为止的内容:https://dotnetfiddle.net/3f6XZC

1 个答案:

答案 0 :(得分:1)

这里有两个可能的答案:

  1. 您需要JavaScript(例如,AngleSharp.JavaScript,对于最新版本的AngleSharp尚不可用),并且需要通过“点击”触发JavaScript的链接来触发表单提交。

(如前所述,该功能将无法正常工作-至少目前尚无法实现)

  1. (我想这是您要追求的目标-从部分问题来看)您将需要在C#中实现该特定JS。由于AngleSharp为您提供了动态DOM,因此您可以做到这一点。

在C#中,特定代码如下(假设您还调用document实例document):

Task SubmitForm(IDocument document, string eventTarget, string eventArgument)
{
    var theForm = document.Forms["form1"];

    if (!theForm) {
        throw new InvalidOperationException("The form cannot be found!");
    }

    void SetElement(string name, string value)
    {
        var element = theForm.Elements[name] as IHtmlInputElement;

        if (element != null)
        {
            element.value = value;
        }
    }

    SetValue("__EVENTTARGET", eventTarget);
    SetValue("__EVENTARGUMENT", eventArgument);
    return theForm.SubmitAsync();
}

希望有帮助!