一个页面我用右键查看源码可以看到我想要的信息。但为什么我用这个下载下来的东西。
WebClient wc = new WebClient();
string s = wc.DownloadString(stUrl);
里面只有简单的几个html代码。跟我右键看到的内容完全不同。为什么。我怎样才可以实现
我这样也只有简单的几个htnl源码,网上找的
Uri uri = new Uri(url); HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri); myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705"; myReq.Accept = "*/*"; myReq.KeepAlive = true; myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5"); HttpWebResponse result = (HttpWebResponse)myReq.GetResponse(); Stream receviceStream = result.GetResponseStream(); StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.Default); string strHTML = readerOfStream.ReadToEnd(); readerOfStream.Close(); receviceStream.Close(); result.Close(); return strHTML;
WebClient client = new WebClient();
var data = client.DownloadData(url);
var str = Encoding.Default.GetString(data);
也不是哦。这获取的就那么就脚本,样式。其他的div都没有。我右键看到的div一个都没有。
@糯米粥:
你地址是什么,发出来看看
@糯米粥:
你是要这些数据?
@Rich.T: 嗯。是啊。我要匹配航班的信息。
@糯米粥:
那你就得去监控并分析一下他是从哪里获取的这些数据了
他肯定是通过js文件然后获取到航班信息然后赋值给DIV
@Rich.T: 我就是不知道分析那些。能说下思路吗?
@糯米粥:
用IE9或者chorme的开发工具监控一下他访问了哪些JS,然后看看这些JS会访问哪些地址并赋值给某个DIV
你也可以先找到这个DIV,然后再到JS找有没有这个DIV
大概就是这样的思路
@Rich.T: 当我找到js访问的路径。我怎么请求呢?client.DownloadData(url);这个路径就是我找到的那个路径吗。
@糯米粥:
整了这么久,用POST方式,编码用GZIP,可以拿到
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; using System.Drawing.Drawing2D; using System.Data; using System.Text.RegularExpressions; using System.Reflection; using System.Xml.Serialization; using System.Xml; using System.Threading; using System.Net; using System.IO.Compression; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var url = "http://flights.ctrip.com/booking/bjs-sha----adu-1/"; var param = "dcityname1=北京&acityname1=上海"; var str = GetHTML(url, param); Console.Read(); } /// <summary> /// 获取HTML /// </summary> /// <param name="url"></param> /// <returns></returns> static string GetHTML(string url, string param) { Uri uri = new Uri(url); HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri); myReq.Headers.Add("Accept-Encoding", "gzip,deflate,sdch"); byte[] byData = Encoding.Default.GetBytes(param); myReq.Method = "Post"; myReq.ContentLength = byData.Length; Stream reqStrem = myReq.GetRequestStream(); reqStrem.Write(byData, 0, byData.Length); reqStrem.Close(); HttpWebResponse result = (HttpWebResponse)myReq.GetResponse(); Stream recStream = result.GetResponseStream(); //如果是Gzip方式则需要解压 recStream = new GZipStream(recStream, CompressionMode.Decompress); StreamReader redStream = new StreamReader(recStream, System.Text.Encoding.Default); string strHTML = redStream.ReadToEnd(); redStream.Close(); recStream.Close(); result.Close(); return strHTML; } } }
@糯米粥:
我靠,这样也可以
var url = "http://flights.ctrip.com/booking/bjs-sha----adu-1/"; var param = "dcityname1=北京&acityname1=上海"; byte[] byData = Encoding.Default.GetBytes(param); var client = new WebClient(); var data = client.UploadData(url, "Post", byData); var str = Encoding.Default.GetString(data);
@Rich.T: 呵呵。谢谢你哦。我试了,可以解决了。谢谢大家积极讨论。通过讨论。于人于己都收获好多好多。。IT人以分享代码为快乐,谢谢分享。
@糯米粥:
很好,上分,^_^
@Rich.T: 哈哈。好咯。但我发现一个问题呢。还给你一个难题。你思考下咯。动态生成的代码。还是没获取呢。你试试看。你 进网站。不是有个 更多舱位吗? 下面的源码还是没获取。
@糯米粥:
哥,这是点击触发的,地址在这
/Domestic/Search/ShowAllSubClass/?DCity1=bjs&ACity1=sha&DDate1=2013-01-12&passengerQuantity=1&PassengerType=adu&SearchType=S&RouteIndex=1&ClassType=&Flight1=HU7605&FirstSubClass=N&fltID=FlightListItem8你得根据你拿到的参数再次获取,下班了
@Rich.T: 你好哦。在打扰一下哦。这个点击事件就是这样改是么。
var url = "http://flights.ctrip.com/Domestic/Search/ShowAllSubClass/";
var param = "DCity1=bjs&ACity1=sha&DDate1=2013-01-12&passengerQuantity=1&PassengerType=adu&SearchType=S&RouteIndex=1&ClassType=&Flight1=HU7605&FirstSubClass=N&fltID=FlightListItem8";
其他条件不变。但我匹配到的是这些
<tr style="display: none"><script language="javascript" type="text/javascript"> var gift = { }; CombineFlightGifts(gift)</script></tr>
我依葫芦画瓢也画错了?
@糯米粥:
WebClient client = new WebClient();
var data = client.DownloadData(url);
var str = Encoding.Default.GetString(data);
这个直接这样拿就行了
@Rich.T: 呵呵。你也还没睡哦。嗯。试了。可行。我这脑子就不会转转。谢谢了。也该睡了呢。晚安咯
也许其他html等等是后台在访问的时候动态生成的?
后台访问时候生成的就获取不到是吗?
@糯米粥: 是的,像IFrame或者js的请求,这些是浏览器(比如IE)在解析已经收到的HTML时再去请求的。而你用 WebClient,它只负责把 HTML 下载下来,并没有去解析。
@Launcher: 你能说说要怎样才能解析吗。说下思路。
@糯米粥: 是桌面程序吗,看看考虑另一种办法。使用WebBrowser
this.webBrowser1.Navigate("http://www.baidu.com/"); this.webBrowser1.Navigated += (object sender, WebBrowserNavigatedEventArgs e) => { string html = this.webBrowser1.DocumentText; };
@滴答的雨: 不是。我是直接在控制台访问页面。然后匹配,那个strUrl就是我的页面。获取不到。现在我是保存在本地在获取的。那方法好笨,保存在本地,但动态生成的也保存不到本地哦。你说呢
static void Main(string[] args) { string stUrl = "http://flights.ctrip.com/booking/bjs-sha----adu-1/?dayoffset=7&ddate1=2013-01-12&dcityname1=%u5317%u4eac&acityname1=%u4e0a%u6d77"; WebClient wc = new WebClient(); string html = wc.DownloadString("fly.htm"); string regex = @"[\s\S]*?<strong class="".*"">([\s\S]*?)</strong>[\s\S]*?<span class="".*""></span>([\s\S].*)<label style="".*"">/([\s\S].*)</label>[\s\S]*?<li><strong>更改条件:</strong><span>(.*?)</span></li><li><strong>退票条件:</strong><span>(.*?)</span></li><li><strong>签转条件:</strong><span>(.*?)</span></li>"; MatchCollection mc = Regex.Matches(html, regex); Console.WriteLine("正在提取数据....."); XDocument xdoc = new XDocument(); XElement xRoot = new XElement("Root"); xdoc.Add(xRoot); foreach (Match m in mc) { if (m.Success) { XElement FlyInfo = new XElement("FlyInfo"); XElement xAirLine = new XElement("AirLine"); XElement xSeat = new XElement("Seat"); XElement xChuan = new XElement("Chuan"); XElement xGai = new XElement("Gai"); XElement xTui = new XElement("Tui"); XElement xQian = new XElement("Qian"); xAirLine.Value = m.Groups[1].Value; xSeat.Value = m.Groups[2].Value; xChuan.Value = m.Groups[3].Value; xGai.Value = m.Groups[4].Value; xTui.Value = m.Groups[5].Value; xQian.Value = m.Groups[6].Value; FlyInfo.Add(xAirLine, xSeat, xChuan, xGai, xTui, xQian); xRoot.Add(FlyInfo); } } xdoc.Save("fly.xml"); Console.WriteLine("提取成功。按任意键退出"); Console.ReadKey(); }
@糯米粥: 帮你纠结了下终于找到一个办法,虽然笨但是可以达到效果(经测试)……来源:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/57a7cacb-9b89-4d69-a3f3-ff143e0ad2fc
using System.Windows.Forms; class Program { static void Main(string[] args) { System.Threading.Thread t = new System.Threading.Thread(ThreadStart); t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); Console.Read(); } static string html = string.Empty; private static void ThreadStart() { WebBrowser browser = new WebBrowser();
browser.Dock = DockStyle.Fill; browser.Name = "webBrowser"; browser.ScrollBarsEnabled = false; browser.TabIndex = 0; browser.Url = new Uri("http://www.microsoft.com"); browser.Navigated += browser_Navigated; Form form = new Form(); form.WindowState = FormWindowState.Minimized; form.Controls.Add(browser); form.Name = "Browser"; Application.Run(form); } static void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e) { html = (sender as WebBrowser).DocumentText; } }
@滴答的雨: 先谢谢你哦。我刚试了哦。但还是没抓取到呢。你把路径改成这个你自己试试下
string stUrl = "http://flights.ctrip.com/booking/bjs-sha----adu-1/?dayoffset=7&ddate1=2013-01-12&dcityname1=%u5317%u4eac&acityname1=%u4e0a%u6d77";
在页面右键看源码。跟程序获取的完全不一样呢。
额。下下来怎么都是dll。我都不会用。
@糯米粥: 有资料学习的,需要找找
@chenping2008: 或者也可以试试这个:
@chenping2008: 插件是么。全是dll哦。