使用TaskManager爬取2万条代理IP实现自动投票功能
话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给XX投票,以前呢会很自觉打开链接帮忙投一票。可是这种事做多了就会考虑能不能使用工具来进行投票呢,身为一名程序猿决定研究解决这个问题。于是有了以下思考
1.是否能一个人投多票,如果不行又是什么限制了一人投多票?
答:投票网站限制了一个IP或者一个用户只能投一票,防止恶意刷票行为
2.如果是一个IP一票那是否代表着多个IP就能投多票了呢?
答:答案是肯定的
3.用什么方法能够在代码里面改变自己请求的IP?
答:HTTP请求的时候设置代理IP
4.多个代理IP从哪里获取,获取到之后我又该如何使用代码自动化投票?
答:请看文章后面内容
本篇将介绍TaskManager内置任务-代理IP爬虫实现细节,你需要准备的知识:HtmlAgilityPack解析HTML,Quart.net。
阅读目录
百度百科介绍:代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。
目前有很多厂商提供代理IP在线获取,但是很多都是提供几十个试用的,如果想使用更多的代理IP,则需付费购买。这里我找到了一个提供很多代理IP的网站,可以自行百度“代理ip”(以免认为我打广告),或者参考开源TaskManager介绍这篇文章。
有了这么多在线的代理IP可以解决文章开头的问题4了,可是还有个问题这些数据都是网页上的,我在代码里面怎么使用呢?这就用到了HtmlAgilityPack工具包,看名称就能猜到是用来解析HTML的。
HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手。
解析简单的HTML
string HTML = @"<html><head><title>简单解析测试</title></head><body> <div id='div1' title='div1'> <table> <tr> <td>1</td> <td title='cn'>cn</td> </tr> </table> </div> </body></html>"; var doc = new HtmlDocument(); doc.LoadHtml(HTML); //输出页面标题 Console.WriteLine("页面title:"+doc.DocumentNode.SelectSingleNode("/html/head/title").InnerText); //获取div1节点 方式1 HtmlNode divNode1 = doc.GetElementbyId("div1"); //获取div1节点 方式2 HtmlNode divNode2 = doc.DocumentNode.SelectSingleNode("//div[@id='div1']"); //判断节点1和节点2是否相同 Console.WriteLine("断节点1和节点2是否相同:" + (divNode1 == divNode2)); //获取页面所有table HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("//table"); Console.WriteLine("页面table数量:"+tableCollection.Count); //获取table下所有td并输出信息 HtmlNodeCollection tdCollection = tableCollection[0].SelectNodes("tr/td"); foreach (var td in tdCollection) { HtmlAttribute atr = td.Attributes["title"]; Console.WriteLine("td InnerText:" + td.InnerText + " | td title属性值:" + (atr == null ? "" : atr.Value)); } Console.Read();