1

HttpWebrequest用来从谷歌获取结果。我使用代理来获取数据。现在有一个奇怪的问题,对于某些查询它返回数据,而对于某些它抛出异常The remote server returned an error: (503) Server Unavailable.。有人可能认为代理不好,但是当你把它放在 Internet Explorer 中然后你打开谷歌它就在那里。没有 503 错误然后httpwebrequest。但是在某些查询上给出它。即如果你打算得到

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();
4

3 回答 3

3

您被“对不起,您是垃圾邮件消息”所击中,需要输入验证码才能继续或更改代理。由于某种原因,当您收到 503 错误时,默认情况下您无法提取页面内容,尽管如果您在浏览器中执行相同的操作,内容将显示给您。

于 2011-10-03T05:29:00.023 回答
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()));
        }
    }
}
于 2011-06-19T21:07:17.617 回答
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 页面,您应该在其中填写验证码

于 2016-05-11T07:28:21.510 回答