浏览Javascript生成的网页

时间:2018-05-30 11:39:23

标签: c#

这是一个在线表单(https://servizi.ivass.it/RuirPubblica/),您可以在其中进行搜索(只需进行空白搜索)。对于它给出的每个结果,我需要单击结果并导出详细信息页面的第5个表中的列表。

所以基本上我想制作一个能为我做到这一点的软件:

  1. 使用我自己的标准提交搜索
  2. 访问结果项的每一页
  3. 访问每个项目详细信息页面
  4. 获取第5个标记中的行,以便我可以将它们附加到列表中
  5. 使用Fiddler我在单击“搜索”按钮时检查了POST请求中使用的参数,并尝试对.Net执行相同的操作。 如果我尝试使用HttpClient访问基地址,它会返回搜索表单的正确HTML,但是当我使用搜索参数提交以下POST请求时,我会看到一个显示错误“警告:会话已过期”的网页。

    如果我单独进行搜索POST调用,而不首先访问主页,也会发生这种情况,所以我不确定它是否与两个请求之间的会话保持一致。

    public MainWindow()
            {
                InitializeComponent();
    
                var cookieJar = new CookieContainer();
                var handler = new HttpClientHandler
                {
                    CookieContainer = cookieJar,
                    UseCookies = true,
                    UseDefaultCredentials = false
                };
    
                client = new HttpClient(handler)
                {
                    BaseAddress = new Uri("https://servizi.ivass.it/RuirPubblica/Search.faces")
                };
            }
    
            private async Task TryHttp()
            {
                // Access the search page
                var response = await client.GetAsync(client.BaseAddress);
    
                var responseString = await response.Content.ReadAsStringAsync();
    
                // Perform the search
                var values = new Dictionary<string, string>
                {
                    { "FormSearch", "FormSearch" },
                    { "FormSearch:j_id_jsp_558348152_13", "PG" },
                    { "FormSearch:j_id_jsp_558348152_16", "custom" },
                    { "FormSearch:SecE", "on" },
                    { "FormSearch:matricola", "" },
                    { "FormSearch:ragioneSociale", "" },
                    { "FormSearch:provincia", "NA" },
                    { "FormSearch:SearchButton", "Ricerca" },
                    { "javax.faces.ViewState", "j_id1:j_id5" },
                };
    
                var content = new FormUrlEncodedContent(values);
    
                response = await client.PostAsync(client.BaseAddress, content);
    
                // Here I'm getting a web page showing the error "Warning: Session expired"
                responseString = await response.Content.ReadAsStringAsync();
            }
    
            private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
            {
                TryHttp();
            }
    

1 个答案:

答案 0 :(得分:0)

如果你可以定义它,就可以完成。正如您将从评论中理解的那样,StackOverflow完全是关于编程问题的,所以我只会帮助您。

原则上,如果网页可以“解析”为HTML并使用HTTP进行通信,那么您可以使用普通的Web浏览器执行任何操作。您引用的网站最初似乎做了一些与众不同的事情。

HTMLAgilityPack对于解析DOM以及导航和提取内容非常有用。

要使用C#发出HTTP请求,您应该使用HttpClient类。

HttpWebClient之类的旧选项,good answer here on SO可以帮助您在两者之间做出决定。

为了快速参考,Fiddler is available here,我也多次使用它并建议它,尽管它可能会导致HTTPS流量和调试问题。