C# C语言中的Html敏捷包、Web抓取和欺骗#

C# C语言中的Html敏捷包、Web抓取和欺骗#,c#,web-scraping,html-agility-pack,spoofing,C#,Web Scraping,Html Agility Pack,Spoofing,有没有一种方法可以欺骗来自C代码的web请求,使其看起来不像是机器人或垃圾邮件攻击网站?我正试图从网站上搜刮我的网站,但在打了一定数量的电话后一直被屏蔽。我想表现得像一个真正的浏览器。我使用的代码来自HTML敏捷包 var web = new HtmlWeb(); web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML,

有没有一种方法可以欺骗来自C代码的web请求,使其看起来不像是机器人或垃圾邮件攻击网站?我正试图从网站上搜刮我的网站,但在打了一定数量的电话后一直被屏蔽。我想表现得像一个真正的浏览器。我使用的代码来自HTML敏捷包

 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";
使用常规浏览器和(如果开发人员工具不符合标准)查看请求和响应标题

建立您的请求和请求头,以匹配浏览器发送的内容(如果这有区别,您可以使用两种不同的浏览器进行评估)

关于“在一定数量的通话后被阻塞”,请限制您的通话。每x秒只打一次电话。善待网站,网站也会善待你


很有可能他们只是查看每秒来自您IP地址的呼叫数,如果超过阈值,IP地址就会被阻止。

我确实做了太多的网页抓取,但以下是选项: 我有一个默认添加的标题列表,因为所有这些标题都是从浏览器中预期的:

        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类,它保存cookies-这也是一个巨大的帮助:

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;
    }
您可能崩溃的另一个主要原因是服务器正在关闭连接,因为您的连接已打开太长时间。您可以通过如上所述在下载部分添加一个try-catch来证明这一点,如果失败,请重置webclient并再次尝试下载:

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);
                            }
这一直在帮我省钱,即使是服务器拒绝了你,这也能让我重新振作起来。Cookie被清除,您可以再次自由漫游。如果情况真的变得更糟-添加代理支持,每50个ish请求应用一个新的代理

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


给我打分

在其他答案之前,我先尝试了你的答案,它确实起了作用。我将两次网络呼叫之间的延迟增加了30秒,并为我的请求添加了一个useragent、accept和referer。这些年来仍然很有用!出于好奇,如果您最终需要使用代理,您从哪里获得无限量的代理?看起来那可能会很贵,希德米亚斯。大量免费代理