2012-12-22 36 views
4

有没有一种方法可以欺骗来自C#代码的网络请求,使其看起来不像是一个bot或垃圾邮件的网站?我正在尝试通过网络抓取我的网站,但在经过一定的通话后仍然阻止。我想要像一个真正的浏览器。我使用HTML敏捷包中的这段代码。Html敏捷包,网页抓取和C欺骗#

var web = new HtmlWeb(); 
       web.UserAgent = 
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"; 

回答

7

使用普通浏览器和fiddler(如果开发工具是没有达到标准),并看一看的请求和响应头。

构建您的请求和请求标头以匹配浏览器发送的内容(如果这有所帮助,您可以使用几个不同的浏览器进行评估)。

关于“在一定数量的呼叫后被阻止” - 限制您的呼叫。每x秒只拨打一个电话。对网站行为良好,它对您的行为会很好。

机会很好,他们只需查看每秒IP地址的呼叫次数,并且如果通过阈值,IP地址就会被阻止。

+0

我在其他答案之前首先尝试了您的答案,并且确实有效。我将网络通话之间的延迟时间延长了30秒,并在我的请求中添加了一个useragent,accept和referrer。 –

20

我做了太多的网页抓取,但这里的选项: 我有标题的默认列表我添加为所有这些从浏览器预计:

 wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"; 
     wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
     wc.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     wc.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate,sdch"; 
     wc.Headers[HttpRequestHeader.AcceptLanguage] = "en-GB,en-US;q=0.8,en;q=0.6"; 
     wc.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.3"; 

(WC是我的WebClient )。

作为进一步的帮助 - 这是我的WebClient类,保持存储的cookie - 这也是一个巨大的帮助:

public class CookieWebClient : WebClient 
{ 

    public CookieContainer m_container = new CookieContainer(); 
    public WebProxy proxy = null; 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     try 
     { 
      ServicePointManager.DefaultConnectionLimit = 1000000; 
      WebRequest request = base.GetWebRequest(address); 
      request.Proxy = proxy; 

      HttpWebRequest webRequest = request as HttpWebRequest; 
      webRequest.Pipelined = true; 
      webRequest.KeepAlive = true; 
      if (webRequest != null) 
      { 
       webRequest.CookieContainer = m_container; 
      } 

      return request; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
} 

这是我为它日常的使用。静态副本添加到您的基址类与所有的解析功能,你可能有:

protected static CookieWebClient wc = new CookieWebClient(); 

并调用它是这样:

public HtmlDocument Download(string url) 
    { 
     HtmlDocument hdoc = new HtmlDocument(); 
     HtmlNode.ElementsFlags.Remove("option"); 
     HtmlNode.ElementsFlags.Remove("select"); 
     Stream read = null; 
     try 
     { 
      read = wc.OpenRead(url); 
     } 
     catch (ArgumentException) 
     { 
      read = wc.OpenRead(HttpHelper.HTTPEncode(url)); 
     } 

     hdoc.Load(read, true); 


     return hdoc; 
    } 

你可能会崩溃了另一个主要原因是连接正在被服务器关闭,因为你有一个打开的连接太久了。您可以通过添加周围的下载部分如上一试捕证明了这一点,如果失败,重置Web客户端,并尝试重新下载:

HtmlDocument d = new HtmlDocument(); 
          try 
          { 
           d = this.Download(prp.PropertyUrl); 
          } 
          catch (WebException e) 
          { 
           this.Msg(Site.ErrorSeverity.Severe, "Error connecting to " + this.URL + " : Resubmitting.."); 
           wc = new CookieWebClient(); 
           d = this.Download(prp.PropertyUrl); 
          } 

这节省了我的屁股的时候,即使是服务器拒绝你,这可以重新调整这个地段。 Cookies已被清除,您可以自由漫游。如果情况变得更糟 - 增加代理支持并获得每50个IHS请求申请的新代理。

这应该是足以让你踢你自己和任何其他网站的屁股。

RATE ME!

+0

这些年来仍然有帮助!出于好奇,如果您最终需要使用代理服务器,您会从哪里获得无限量的代理服务?似乎这可能会变得昂贵。 –

+0

HideMyAss。大量的免费代理 –