C#中的Html Agility Pack,Web Scraping和欺骗

Mik*_*ynn 7 c# spoofing web-scraping html-agility-pack

有没有办法欺骗来自C#代码的Web请求,因此它看起来不像机器人或垃圾邮件到网站?我正在尝试网络抓取我的网站,但在一定数量的电话后不断被阻止.我想表现得像一个真正的浏览器.我在HTML Agility Pack中使用此代码.

 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";
Run Code Online (Sandbox Code Playgroud)

Aar*_*son 24

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

        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";
Run Code Online (Sandbox Code Playgroud)

(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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我通常使用它.使用您可能具有的所有解析功能将静态副本添加到基础站点类:

    protected static CookieWebClient wc = new CookieWebClient();
Run Code Online (Sandbox Code Playgroud)

并称之为:

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;
    }
Run Code Online (Sandbox Code Playgroud)

您可能崩溃的另一个主要原因是服务器正在关闭连接,因为您已经打开连接太长时间了.您可以通过在上面的下载部分添加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);
                            }
Run Code Online (Sandbox Code Playgroud)

这样可以随时保存我的屁股,即使服务器拒绝了你,这也可以重新开始.Cookie被清除,您可以自由漫游.如果真的变得更糟 - 添加代理支持并获得每50个请求应用的新代理.

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

对我说吧!


Ode*_*ded 8

使用常规浏览器和fiddler(如果开发人员工具不能解决问题)并查看请求和响应标头.

构建您的请求并请求标头以匹配浏览器发送的内容(您可以使用几个不同的浏览器来评估这是否有所不同).

关于"在一定数量的通话后被阻止" - 限制你的通话.每x秒只拨一个电话.对网站表现得很好,它会对你表现得很好.

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