gpt4 book ai didi

c# - C# 中的 Html Agility Pack、Web 抓取和欺骗

转载 作者:太空狗 更新时间:2023-10-29 19:49:14 24 4
gpt4 key购买 nike

有没有一种方法可以通过 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";

最佳答案

我做了太多的网络抓取,但这里有一些选择:我有一个我添加的默认 header 列表,因为所有这些都是浏览器所期望的:

        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;
}

您可能崩溃的另一个主要原因是连接被服务器关闭,因为您打开连接的时间太长了。您可以通过在下载部分周围添加一个 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 个请求应用一个新代理。

这应该足以让您启动自己的网站和任何其他网站。

评价我!

关于c# - C# 中的 Html Agility Pack、Web 抓取和欺骗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com