首页 新闻 会员 周边 捐助

webClient下载源码问题

0
悬赏园豆:60 [已解决问题] 解决于 2013-01-07 21:32

一个页面我用右键查看源码可以看到我想要的信息。但为什么我用这个下载下来的东西。

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; 
糯米粥的主页 糯米粥 | 初学一级 | 园豆:22
提问于:2013-01-07 14:22
< >
分享
最佳答案
0

WebClient client = new WebClient();
var data = client.DownloadData(url);
var str = Encoding.Default.GetString(data);

收获园豆:50
Rich.T | 老鸟四级 |园豆:3440 | 2013-01-07 14:32

也不是哦。这获取的就那么就脚本,样式。其他的div都没有。我右键看到的div一个都没有。

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:34

@糯米粥: 

你地址是什么,发出来看看

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 14:35

@糯米粥: 

你是要这些数据?

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 14:41

@Rich.T: 嗯。是啊。我要匹配航班的信息。

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:43

@糯米粥: 

那你就得去监控并分析一下他是从哪里获取的这些数据了

他肯定是通过js文件然后获取到航班信息然后赋值给DIV

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 14:45

@Rich.T: 我就是不知道分析那些。能说下思路吗?

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:46

@糯米粥: 

用IE9或者chorme的开发工具监控一下他访问了哪些JS,然后看看这些JS会访问哪些地址并赋值给某个DIV

你也可以先找到这个DIV,然后再到JS找有没有这个DIV

大概就是这样的思路

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 14:48

@Rich.T: 当我找到js访问的路径。我怎么请求呢?client.DownloadData(url);这个路径就是我找到的那个路径吗。

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:51

@糯米粥: 

整了这么久,用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; 
        }
    }
}

 

 

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 17:08

@糯米粥: 

我靠,这样也可以

            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 | 园豆:3440 (老鸟四级) | 2013-01-07 17:28

@Rich.T: 呵呵。谢谢你哦。我试了,可以解决了。谢谢大家积极讨论。通过讨论。于人于己都收获好多好多。。IT人以分享代码为快乐,谢谢分享。

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 17:37

@糯米粥: 

很好,上分,^_^

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 17:44

@Rich.T: 哈哈。好咯。但我发现一个问题呢。还给你一个难题。你思考下咯。动态生成的代码。还是没获取呢。你试试看。你 进网站。不是有个  更多舱位吗? 下面的源码还是没获取。

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 17:50

@糯米粥: 

哥,这是点击触发的,地址在这
/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 | 园豆:3440 (老鸟四级) | 2013-01-07 18:05

@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>   

我依葫芦画瓢也画错了?

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 23:47

@糯米粥: 

var url = "http://flights.ctrip.com/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";

WebClient client = new WebClient();
var data = client.DownloadData(url);
var str = Encoding.Default.GetString(data);

 

这个直接这样拿就行了

Rich.T | 园豆:3440 (老鸟四级) | 2013-01-07 23:51

@Rich.T: 呵呵。你也还没睡哦。嗯。试了。可行。我这脑子就不会转转。谢谢了。也该睡了呢。晚安咯

糯米粥 | 园豆:22 (初学一级) | 2013-01-07 23:56
其他回答(2)
0

也许其他html等等是后台在访问的时候动态生成的?

收获园豆:10
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-07 14:26

后台访问时候生成的就获取不到是吗?

支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:30

@糯米粥: 是的,像IFrame或者js的请求,这些是浏览器(比如IE)在解析已经收到的HTML时再去请求的。而你用 WebClient,它只负责把 HTML 下载下来,并没有去解析。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2013-01-07 14:34

@Launcher: 你能说说要怎样才能解析吗。说下思路。

支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:39

@糯米粥: 是桌面程序吗,看看考虑另一种办法。使用WebBrowser

            this.webBrowser1.Navigate("http://www.baidu.com/");

            this.webBrowser1.Navigated += (object sender, WebBrowserNavigatedEventArgs e) 
                => { string html = this.webBrowser1.DocumentText; };
支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-07 14:39

@滴答的雨: 不是。我是直接在控制台访问页面。然后匹配,那个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();
        }
支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 14:43

@糯米粥: 帮你纠结了下终于找到一个办法,虽然笨但是可以达到效果(经测试)……来源: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; } }
支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-07 15:48

@滴答的雨: 先谢谢你哦。我刚试了哦。但还是没抓取到呢。你把路径改成这个你自己试试下

 string stUrl = "http://flights.ctrip.com/booking/bjs-sha----adu-1/?dayoffset=7&ddate1=2013-01-12&dcityname1=%u5317%u4eac&acityname1=%u4e0a%u6d77";

在页面右键看源码。跟程序获取的完全不一样呢。

支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 16:13
0
chenping2008 | 园豆:9836 (大侠五级) | 2013-01-07 15:18

额。下下来怎么都是dll。我都不会用。

支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 15:22

@糯米粥: 有资料学习的,需要找找

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2013-01-07 15:43

@chenping2008: 或者也可以试试这个:

http://jumony.codeplex.com/

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2013-01-07 15:44

@chenping2008: 插件是么。全是dll哦。

支持(0) 反对(0) 糯米粥 | 园豆:22 (初学一级) | 2013-01-07 15:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册