今日偶在抓取某个网站的数据。但是发现了一个奇怪的问题。。 //第一种抓取网页源代码方法:
                    MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
                    _xmlhttp.open("GET", Url, false, null, null);
                    _xmlhttp.send("");
                    if (_xmlhttp.readyState == 4)
                    {
                        s = System.Text.Encoding.UTF8.GetString((byte[]) _xmlhttp.responseBody);
                    }                
 //第二种抓取网页源代码方法:
                    System.Net.WebClient wc = new WebClient();
                wc.Encoding = System.Text.Encoding.GetEncoding("UTF-8"); 
                text1 = wc.DownloadString(url);
用上述代码读取回来的网页源代码有问题,其问题是该读取回来的源代码跟你在浏览器上看到的源代码有出入。。
于是用 winform 里面的webBrowser控件读取出来的代码才发现没有问题
但是使用webBrowser这个控件读取网页源代码很不方便。。因为我是用批量的URL进行抓取的。很容易会导致假死所以请大家帮忙解决以下问题
1.不知道大家有没有其他办法能够读取出正确的源代码。。
2.如果只能用 webBrowser 这种方式来读取源代码的话,不知道能否提供一个“利用多线程的方式去抓取并分析源代码”的 方法代码
3.我想知道那网站是怎么判断出我不是用浏览器去查看他们网页的(这个问题我只是想知道一下)

解决方案 »

  1.   

    没说有什么问题啊?是不是先要登录才能抓取?
    用HttpWebRequest
      

  2.   

    网站可以判断cookie, referer,use agent,甚至是分析你的IP在某一时段内的访问情况。用 webBrowser 是个不错的办法,慢慢抓,有的偷就不错了,就别想着偷出快感了
      

  3.   

    用“非webBrowser”方式读取回来的源代码,跟在你的IE上看到的源代码不同的。。
    打个比方:。。你在IE打开一个某一个网站,然后点击查看源代码的时候。你会看到有一个叫“ 啊开 ”的人名,但是如果你用“非webBrowser”方式的代码去读取同一个网址,你会找不到“啊开” 这个人名。
      

  4.   


    我抓取的网页是不需要登录的,
    用HttpWebRequest方式抓取的结果也是有问题的。。
      

  5.   


    “啊开”这个词可能是使用JAVASCRIPT来设置的
    如果网站的内容使用AJAX来获取,那你就得分析最终的数据是从哪个URL来的
      

  6.   

    你误解了,可能是我没说清楚的。。
    “啊开”这个关键词,有可能是执行JAVASCRIPT才显示的,你使用IE、WebBrowser打开网页,IE、WebBrowser都会执行JAVASCRIPT,所以都能看到啊开,但是XMLHTTP、WebClient 、HttpWebRequest这些方法都不会执行JAVASCRIPT,所以在源代码里看不到啊开,这些只是猜测
    明白?
      

  7.   

    谢谢 ZengHD 的解答
    你使用IE、WebBrowser打开网页,IE、WebBrowser都会执行JAVASCRIPT是这样的,我要的是源代码。。而不是看他前台显示什么哦(请忽略“前台显示”这个操作)。。现在我读取回来的源代码,跟我在IE浏览器中右键查看源代码不同。。
      

  8.   

    原来我也碰到这样的情况,你试下下面的,看能否解决你的问题:
    http://blog.csdn.net/sxldfang/archive/2010/04/12/5478078.aspx
      

  9.   

    你可这样获取html代码:string html = Encoding.Default.GetString(getBytes("http://bjtime.cn/header3.asp", null));
      

  10.   

    很好做,用socket连到对方服务器,然后封装个http消息,开始行用get就行,发给服务器。返回来肯定是最准最全的,呵呵。