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