2010-01-18 46 views
1

我正在構建一個需要從合作伙伴網站刮取信息的網站。現在我的刮碼與其他網站很好,但不是這個。它是一個普通的.html網站。我的想法是,它可能會產生一些如何與PHP(網站是用PHP構建的)。爲什麼我不能刮網站的任何想法?

我不知道我只是猜測生成的部分,我需要你的專業人士幫助。如果重要的話,我使用的是我的代碼。 htmlDocument是htmlAgilityPack,但與它無關。結果在我嘗試的網站上爲空。

 string result; 
     var objRequest = System.Net.HttpWebRequest.Create(strUrl); 
     var objResponse = objRequest.GetResponse(); 

     using (var sr = new StreamReader(objResponse.GetResponseStream())) 
     { 
      result = sr.ReadToEnd(); 
      sr.Close(); 

      var doc = new HtmlDocument(); 
      doc.LoadHtml(result);     

      foreach (var c in doc.DocumentNode.SelectNodes("//a[@href]")) 
      { 
       litStatus.Text += c.Attributes["href"].Value + "<br />"; 
      } 
     } 

編輯:

這是從W3驗證,可能有這個東西嗎?

對不起,我無法驗證該文檔,因爲上線422是包含在一個或 更多,我不能解釋爲UTF-8字節(換言之,發現字節不是在指定的字符編碼有效 值)。請檢查文件內容和 字符編碼指示。

錯誤是:UTF8「版權所有\ xA9」不映射到Unicode

+1

那麼'result'的值是什麼? – 2010-01-18 12:42:49

+0

@Marc:OP狀態「結果爲null,我試着在網站上」 – 2010-01-18 12:44:35

+0

我試過用maby 15個網站,我需要的是唯一一個null .. – 2010-01-18 12:46:06

回答

2

我會通過看我從一些簡單的像wget有什麼反應或使用工具,如http://www.fiddler2.com啓動/ fiddler2來檢測響應並檢查你收到的任何頭文件

有時網站會返回來自不同代理字符串的不同響應等等,所以你可能需要調整你的請求頭文件和僞裝成一個使用不同的瀏覽器來獲取您正在查找的數據如果您在運行腳本的同一臺機器上使用Fiddler,您應該能夠看到從瀏覽器請求頁面的確切內容並從您的腳本請求頁面。

甚至有可能是一個簡單的302重定向或類似的情況,你的代碼沒有遵循。

如果您可以通過瀏覽器訪問該頁面,那麼您將一定能夠通過發送與您的瀏覽器發送的請求完全相同的請求來訪問它。

編輯Fiddler從您自己的代碼中使用起來有點棘手,因爲它的行爲像一個代理 - 它使用普通瀏覽器設置自己,但是您必須手動告訴代碼通過127.0.0.1端口上的代理運行8888爲了讓Fiddler看到你的結果。

+0

我得到了螢火蟲,但我不知道在標題中看什麼? srry – 2010-01-18 13:03:16

+0

這就是爲什麼Fiddler是有用的,因爲你想要的是找到你的asp.net腳本所做的請求和瀏覽器的請求之間的_difference_。每個方向的頭文件都很有用 - 你可能會從asp.net代碼中的請求和響應對象中找到這些頭文件。 – glenatron 2010-01-18 14:22:42

+0

我得到了提琴手現在運行,我看了一些視頻,但我沒有得到任何不同的請求,而不是從我能看到的。如果你只花了一分鐘時間,並且看到它們不同,我會非常棒。你不必,但我會appriciate它。 addy是 http://www.raggarportalen.se/Kalender.html – 2010-01-18 15:18:55

1

要排除故障,請檢查objResponse.StatusCode和objResponse的值。狀態說明:

string result; 
var objRequest = System.Net.HttpWebRequest.Create(strUrl); 
var objResponse = (System.Net.HttpWebResponse) objRequest.GetResponse(); 

Console.WriteLine(objResponse.StatusCode); 
Console.WriteLine(objResponse.StatusDescription); 
... 
+0

我無法訪問objResponse.StatusCode和objResponse.StatusDescription。 – 2010-01-18 12:53:29

+0

爲什麼不呢?我假設你在使用語句之前已經嘗試過類似於''Console.WriteLine(objResponse.StatusCode);''。當你嘗試時會發生什麼?代碼是否不能編譯?它在運行時崩潰嗎?打印什麼值? – codeape 2010-01-18 12:57:30

+0

objResponse不包含該選項,StatusCode。 – 2010-01-18 12:59:58

1

的問題似乎是在上線421的註釋字符:

<!-- KalenderMx v1.4 � by shiba-design.de --> 

這是聲明的字符編碼的外ISO-8859-1

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 

您可能會嘗試通過過濾器運行解析的文檔字符串到convertremove違規ch字符串中的字符,然後用htmlAgilityPackLoadHtml()進行評估。

+0

我的問題是我可以用htmlAgilityPack做任何事情。當我颳去網站時,結果爲空。我敢打賭,這與評論有關,但我不知道如何解決它 – 2010-01-18 14:38:53

相關問題