C# HttpWebRequest跳过网页中的特定下拉菜单
我目前正试图刮一个网站,它给了我一点麻烦。webscraper正在跳过网页中的特定下拉菜单 网页是用asp.net生成的。我可以加载带有url的第一个页面,然后需要使用带有url的cookie来加载其他页面。然后将这些页面保存为.html文件。我加载的第二个url缺少数据 一旦我有了.html文件,我就用HTMLAgilityPack解析它们 这是删除站点的代码C# HttpWebRequest跳过网页中的特定下拉菜单,c#,asp.net,httpwebrequest,web-scraping,C#,Asp.net,Httpwebrequest,Web Scraping,我目前正试图刮一个网站,它给了我一点麻烦。webscraper正在跳过网页中的特定下拉菜单 网页是用asp.net生成的。我可以加载带有url的第一个页面,然后需要使用带有url的cookie来加载其他页面。然后将这些页面保存为.html文件。我加载的第二个url缺少数据 一旦我有了.html文件,我就用HTMLAgilityPack解析它们 这是删除站点的代码 static void saveWebPage(int ID) { //The first page
static void saveWebPage(int ID)
{
//The first page can be loaded via the url.
//The rest need an url and a cookie to be loaded.
//1st page
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webPage + ID.ToString());
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
CookieContainer aCookie = new CookieContainer();
request.CookieContainer = aCookie;
WebResponse pageResponse = request.GetResponse();
Stream responseStream = pageResponse.GetResponseStream();
TextWriter textDoc = new StreamWriter(ID.ToString() + "Page1.html");
string html = string.Empty;
using (StreamReader streamRead = new StreamReader(responseStream))
{
html = streamRead.ReadToEnd();
}
textDoc.Write(html);
textDoc.Close();
//2nd page
HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(webPage2 + ID.ToString());
request2.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
request2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request2.CookieContainer = request.CookieContainer;
pageResponse = request2.GetResponse();
responseStream = pageResponse.GetResponseStream();
textDoc = new StreamWriter(ID.ToString() + "Page2.html");
html = string.Empty;
using (StreamReader streamRead = new StreamReader(responseStream))
{
html = streamRead.ReadToEnd();
}
textDoc.Write(html);
textDoc.Close();
//........ More code in the same style.
}
该网页有几个下拉菜单。除了一个特定的数据,我可以获取所有数据。我可以抓取的菜单的HTML代码可能如下所示:
<td ><select name="menuName" id="menuID" disabled="disabled" style="menuStyle">
<option selected="selected" value="-1">Title</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
//....... More options.
<td ><select name="menuName" onchange="javascript:setTimeout('__doPostBack(\'menuName\',\'\')', 0)" id="menuID" disabled="disabled" style="width:menuWidth; position:static">
<option selected="selected" value="-1">Title</option>
标题
A.
B
C
D
//....... 更多选择。
我可以解析这些数据。网站上的问题菜单如下所示:
<td ><select name="menuName" onchange="javascript:setTimeout('__doPostBack(\'menuName\',\'\')', 0)" id=*menuID disabled="disabled" style="width:menuWidth; position:static">
<option value="-1">Title</option>
<option value="1">A</option>
<option selected="selected" value="2">B</option>
<option value="3">C</option>
//..... More options.
标题
A.
B
C
//..... 更多选择。
我的scraper创建的.html文件如下所示:
<td ><select name="menuName" id="menuID" disabled="disabled" style="menuStyle">
<option selected="selected" value="-1">Title</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
//....... More options.
<td ><select name="menuName" onchange="javascript:setTimeout('__doPostBack(\'menuName\',\'\')', 0)" id="menuID" disabled="disabled" style="width:menuWidth; position:static">
<option selected="selected" value="-1">Title</option>
标题
我已经尝试过使用和不使用用户代理选项的scraper,但是没有任何区别。我还检查了网站,我可以抓取其他运行javascript:setTimeout on change的菜单。那么,我的scraper跳过菜单数据并将菜单标题作为所选值是否有任何原因
编辑:
用Fiddler重新加载页面将显示六个结果
请求头都如下所示:
<td ><select name="menuName" id="menuID" disabled="disabled" style="menuStyle">
<option selected="selected" value="-1">Title</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
//....... More options.
<td ><select name="menuName" onchange="javascript:setTimeout('__doPostBack(\'menuName\',\'\')', 0)" id="menuID" disabled="disabled" style="width:menuWidth; position:static">
<option selected="selected" value="-1">Title</option>
连接site.site.site:443http/1.1
客户端用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/31.0.1650.63 Safari/537.36
运输:
连接:保持活力
主持人:site.site.site
编辑2:来自Fiddler中响应的原始视图的信息
<td ><select name="menuName" onchange="javascript:setTimeout('__doPostBack(\'menuName\',\'\')', 0)" id="menuID" disabled="disabled" style="width:menuWidth; position:static">
<option value="-1">Title</option>
<option value="1">A</option>
<option selected="selected" value="2">B</option>
<option value="3">C</option>
//..... More options.
标题
A.
B
C
//..... 更多选择。
标题看起来与我在scraper中发送的内容略有不同,网站是https,而不是http
获取**asp.x?第2页HTTP/1.1
主持人:site.site.site
连接:保持活力
缓存控制:最大年龄=0
接受:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,/;q=0.8
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,如Gecko)
Chrome/32.0.1700.76 Safari/537.36
参考资料:*asp.x?第1页
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8
Cookie:ASP.NET_SessionId=***SessionId请使用Fiddler(或任何其他Http调试器)查看站点在每种情况下实际报告的内容。现在还不清楚“问题菜单在网站上的位置是这样的:”信息来自-可能来自完全呈现的页面。我将在Fiddler中查看它。问题菜单来自于在chrome中查看网站的源代码。我在标题选项卡上从Fiddler向主体添加了数据。我到底在找什么?我对Fiddler没有太多的经验。在响应的原始视图中查看-您正在查看服务器返回的HTML是什么样子(以及
HttpWebRequest
能够获得什么),而不是浏览器认为它是什么样子。好的,谢谢。我在HTML代码的原始视图中查看菜单。它看起来与chrome中的html代码一模一样。不过,请求头看起来略有不同。