2011-06-19 72 views
1

我正在使用HttpWebrequest从google.I使用代理获取数据。现在有一个奇怪的问题,对于某些查询它返回的数据和一些它会抛出异常The remote server returned an error: (503) Server Unavailable. 。有人可能会认为代理是坏的,但是当你把它在Internet Explorer,然后打开Goog​​le是there.no 503错误then.but httpwebrequest赋予它某些query.ie如果你打算让Httpwebrequest问题(503)

http://www.google.com/search?q=site:http://www.yahoo.com 

它会抛出异常,如果你去为

http://www.google.com/search?q=info:http://www.yahoo.com 

它的工作原理。

到目前为止我的代码是

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(file); 
       request.ProtocolVersion = HttpVersion.Version11; 
       request.Method = "GET"; 
       request.KeepAlive = false; 
       request.ContentType = "text/html"; 
       request.Timeout = 1000000000; 
       request.ReadWriteTimeout = 1000000000; 
       request.UseDefaultCredentials = true; 
       request.Credentials = CredentialCache.DefaultCredentials; 
    Uri newUri = new Uri("http://" + proxy[selectedProxy].ProxyAddress.Trim() + "/"); 
        WebProxy myProxy = new WebProxy(); 
        myProxy.Credentials = CredentialCache.DefaultCredentials; 
        myProxy.Address = newUri; 
        request.Proxy = myProxy; 
WebResponse response = request.GetResponse(); 
        // System.Threading.Thread.Sleep(Delay); 
        StreamReader reader = null; 
        string data = null; 
        reader = new StreamReader(response.GetResponseStream()); 
         data = reader.ReadToEnd(); 

回答

2

这是奇怪的。也许一些URL编码问题。试试这应该正确地处理所有事情如下:你被打的“对不起,你是一个垃圾邮件机器人的消息”,将需要输入验证码继续或更改代理

using System; 
using System.Net; 
using System.Web; 

class Program 
{ 
    static void Main() 
    { 
     using (var client = new WebClient()) 
     { 
      var newUri = new Uri("http://proxy.foo.com/"); 
      var myProxy = new WebProxy(); 
      myProxy.Credentials = CredentialCache.DefaultCredentials; 
      myProxy.Address = newUri; 
      client.Proxy = myProxy; 

      var query = HttpUtility.ParseQueryString(string.Empty); 
      query["q"] = "info:http://www.yahoo.com"; 
      var url = new UriBuilder("http://www.google.com/search"); 
      url.Query = query.ToString(); 
      Console.WriteLine(client.DownloadString(url.ToString())); 
     } 
    } 
} 
+0

'HttpUtility'不可见它是一个winform应用程序 –

+0

@Lagrangian,添加对'System.Web'的引用,如果这是一个.NET 4.0客户端配置文件只是在使用完整框架配置文件的单独应用程序中进行测试。我很想知道结果。如果这有效,则可以使用类似的技术来为客户端配置文件使用。 –

+0

同样的例外。我不知道为什么,但如果你替换信息与网站的查询它不工作,并与信息它与我的方法相同的结果,所以编码不是我认为的问题 –

2

。出于某种原因,当您收到503错误时,您无法默认拉出页面内容,但如果您在浏览器中执行相同的操作,内容将显示给您。

0

这取决于您使用相同的IP地址向Google发送查询的频率。如果您向Google发送查询的速度太快,Google会阻止您的IP地址。发生这种情况时,Google会返回一个503错误,并将其重定向到其抱歉页面。

做这样的事情:

try 
      { 
       response = (HttpWebResponse) webRequest.GetResponse(); 
      } 
      catch (WebException ex) 
      { 
       using (var sr = new StreamReader(ex.Response.GetResponseStream())) 
       { 
        var html = sr.ReadToEnd(); 
       } 
      } 

当调试,检查这在HTML变量的值。你会发现这是一个HTML页面,你应该填写一个验证码