C# 浏览Javascript生成的网页

C# 浏览Javascript生成的网页,c#,C#,有一个在线表单(),您可以在其中进行搜索(只需进行空白搜索)。对于它给出的每个结果,我需要单击结果并导出详细信息页面第5个表中的列表 所以基本上我想做一个软件,为我做到这一点: 使用我自己的条件提交搜索 访问结果项的每个页面 访问每个项目详细信息页面 获取第5个标记中的行,以便我可以将它们附加到列表中 当我单击“搜索”按钮时,我使用Fiddler检查POST请求中使用的参数,并尝试对.Net执行相同的操作。 如果我尝试使用HttpClient访问基址,它将返回搜索表单的正确HTML,但是当我提交

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

所以基本上我想做一个软件,为我做到这一点:

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

    如果我单独进行search POST调用,而没有首先访问主页,那么也会发生这种情况,因此我不确定这是否与在两个请求之间保持会话alibe有关

    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();
            }
    
    public主窗口()
    {
    初始化组件();
    var cookieJar=new CookieContainer();
    var handler=新的HttpClientHandler
    {
    CookieContainer=cookieJar,
    UseCookies=true,
    UseDefaultCredentials=false
    };
    client=新的HttpClient(处理程序)
    {
    BaseAddress=新Uri(“https://servizi.ivass.it/RuirPubblica/Search.faces")
    };
    }
    专用异步任务TryHttp()
    {
    //访问搜索页面
    var response=await client.GetAsync(client.BaseAddress);
    var responseString=await response.Content.ReadAsStringAsync();
    //执行搜索
    var值=新字典
    {
    {“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内容=新的FormUrlEncodedContent(值);
    响应=等待client.PostAsync(client.BaseAddress,content);
    //这里我得到一个网页,显示错误“警告:会话已过期”
    responseString=wait response.Content.ReadAsStringAsync();
    }
    private void按钮base_OnClick(对象发送方,RoutedEventTarget e)
    {
    TryHttp();
    }
    
    如果您可以定义它,它就可以完成。正如您从评论中了解到的,StackOverflow是关于编程问题的,所以我只会在这方面帮助您

    原则上,如果网页是“可解析”的HTML,并且使用HTTP进行通信,那么您可以使用它做任何普通web浏览器可以做的事情。你提到的网站一开始看起来确实做了一些不同寻常的事情

    对于解析DOM、导航和提取内容非常有用

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

    有一些比较老的选项,比如,有一个可以帮助您在两者之间做出选择



    为了快速参考,我也曾多次使用过它,并推荐使用它,尽管它可能会导致HTTPS通信和调试出现问题。

    堆栈溢出不是询问“如何开始…”问题的最佳场所。在你自己尝试之后,你需要做你自己的研究并在这里提出问题。请阅读您可以开始使用像Fiddler这样的代理并观察实际发出的请求。你可以看看在C#中复制这些。一旦可以获得页面,就可以使用类似的方法来解析DOM并允许提取值。如果你在某个特定的步骤上遇到困难,一定要问另一个问题——这个问题太难了。谢谢@Camilo。我将开始自己尝试一些代码,但这是一个广泛的问题,如果有更专业的人可以快速浏览一下网站,只要告诉我我需要什么是不可行的,这将节省我无用的浪费时间。谢谢你编辑我的问题。谢谢@stuartd给我的宝贵建议!Fiddler看起来是一个很有前途的入门工具!在我第一次使用C#测试之后,我添加了更多细节。由于某些原因,我无法获取返回值的搜索请求。不确定是因为我没有执行某些会话管理,还是因为我在帖子中使用了错误的参数call@CamiloTerevinto更好?