C# C语言中的Html敏捷包、Web抓取和欺骗#
有没有一种方法可以欺骗来自C代码的web请求,使其看起来不像是机器人或垃圾邮件攻击网站?我正试图从网站上搜刮我的网站,但在打了一定数量的电话后一直被屏蔽。我想表现得像一个真正的浏览器。我使用的代码来自HTML敏捷包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,
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。这些年来仍然很有用!出于好奇,如果您最终需要使用代理,您从哪里获得无限量的代理?看起来那可能会很贵,希德米亚斯。大量免费代理