这是一个在线表单(https://servizi.ivass.it/RuirPubblica/),您可以在其中进行搜索(只需进行空白搜索)。对于它给出的每个结果,我需要单击结果并导出详细信息页面的第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();
}
答案 0 :(得分:0)
如果你可以定义它,就可以完成。正如您将从评论中理解的那样,StackOverflow完全是关于编程问题的,所以我只会帮助您。
原则上,如果网页可以“解析”为HTML并使用HTTP进行通信,那么您可以使用普通的Web浏览器执行任何操作。您引用的网站最初似乎做了一些与众不同的事情。
HTMLAgilityPack对于解析DOM以及导航和提取内容非常有用。
要使用C#发出HTTP请求,您应该使用HttpClient类。
有HttpWebClient之类的旧选项,good answer here on SO可以帮助您在两者之间做出决定。
为了快速参考,Fiddler is available here,我也多次使用它并建议它,尽管它可能会导致HTTPS流量和调试问题。