HtmlAgilityPack实战代码
C#采集代理服务器ip并设置IE代理--HtmlAgilityPack实战代码
今天在博客园看到一篇文章,说是C#采集某某的数据,其实做采集小软件很久了,
用的最好的还是HtmlAgilityPack,真的没话说,非常方便快捷。
这里有详细介绍[.Net解析html文档类库HtmlAgilityPack完整使用说明--采集软件开发尤其好用].
本文不做详细说明了。主要还是上代码啊。毕竟业务应用才是我们开发人员努力编码的最终目的,
谁也不会为了单纯写点代码就自我满足了,满足业务需求才是主要的。
最近朋友叫我帮忙写一个小程序,获取某个网站的代理。也不怕大家知道了,就是这个网站
http://www.youdaili.cn/ 牛逼吧??好像你要批量的代理ip还得花钱买的。
但是现在我就告诉你不用花钱的方法,就是自己去复制,哈哈,开玩笑。
程序员都是懒人,谁会去复制,还是交给程序自动实现吧--那就是采集程序。
言归正传,今天就是主要介绍使用C#组件HtmlAgilityPack进行获取代理服务器ip和端口,
并手动设置到IE中的一个小程序。当然咯,开源哦。
代码萌点这里。百度网盘 http://pan.baidu.com/share/link?shareid=2118473016&uk=1765114824
流程很简单:打开主页,获取今天最新的代理网站地址,打开该链接,再去获取代理ip即可。
道理很简单,实现也很简单。
用程序打开网站主页http://www.youdaili.cn/ ,里面会有一个new的标示,但是我们不用这个标示,
我们用日期!这个最准确的。
我们可以看到08-19的最新代理就在那里。但是怎么让程序得到那?
首先我们可以用chrome的代码工具查看源代码,
我们想要得到的链接是在ul的li下面。
所有我们可以得到这样的正则表达式Xpath://ul/li/a
对应程序代码就是:
iplist = new List<Model.IpModel>();//我的实体 HtmlAgilityPack.HtmlWeb hw = new HtmlAgilityPack.HtmlWeb();//用的HtmlAgilityPack hw.AutoDetectEncoding = false; //现在下面的代码很重要。 HttpWebRequest req; req = WebRequest.Create(new Uri(@"http://www.youdaili.cn/")) as HttpWebRequest; req.Method = "GET"; HttpWebResponse rs = (HttpWebResponse)req.GetResponse(); System.IO.StreamReader sr = new StreamReader(rs.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8")); try { HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.Load(sr); GetHrefs(doc); //然后就是上面所说的用的正则表达式了。 } catch (Exception e) { Console.WriteLine(e.Message.ToString()); Console.WriteLine(e.StackTrace); } |
大家可能注意到上面标红的地方说明很重要。主要是youdaili.cn的网站编码有点问题。只有这样才能得出gb2312的网页源代码。
然后就是上面所说的用的正则表达式了。
private void GetHrefs(HtmlAgilityPack.HtmlDocument _doc) { string todaydaili = DateTime.Now.ToString("MM-dd"); HtmlNodeCollection hrefs = _doc.DocumentNode.SelectNodes("//ul/li/a"); if (hrefs == null) return; foreach (HtmlNode href in hrefs) { if (href.Attributes["title"] != null && href.Attributes["href"] != null) { string tilte = href.Attributes["title"].Value; string urll = href.Attributes["href"].Value; if (tilte.IndexOf(todaydaili) >= 0 && urll.Length > 0) { IpUrl model = new IpUrl(); if (urll.IndexOf("guonei") > 0) { model.DaiLi = 0; model.Url = urll; IpUrlList.Add(model); } if (urll.IndexOf("guowai") > 0) { model.DaiLi = 1; model.Url = urll; IpUrlList.Add(model); } } } } string url = ""; int tmppage = 1; foreach(IpUrl urla in IpUrlList) { for (int startpage = 1; startpage <= 10; startpage++) { this.lb_result.Text = "正在采集第" + tmppage.ToString() + "页IP列表请稍后........."; url = urla.Url.Replace(".html",""); if (tmppage != 1) { url = url + "_" + startpage.ToString() + ".html"; } else { url = url + ".html"; } CaiJiIp(url, tmppage, urla.DaiLi); tmppage++; } } this.lb_result.Text = "本次采集采集完毕!"; this.btn_caiji.Enabled = true; this.timer1.Stop(); } |
采集之后,我现在是保存到内存,还没有实际保存数据,各位自行解决数据保存问题吧。
采集之后的代理数据,怎么使用概不负责。haha。
转发注明来源哦:IT分享 ***
HtmlAgilityPack实战代码的更多相关文章
- 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)
1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...
- DOM基础操作实战代码
对于已经讲解给大家的DOM实战,我今天给大家几个实战代码,可以让大家加深对此的理解! 1.用DOM动态生成这样一个结构: <div class=”example”> <p class ...
- Magenta Demos Magenta 实战代码
Magenta 实战代码 这个仓库包含了很多 Magenta 模型的实现.看 Magenta 库以及模型,看我们的主仓库:https://github.com/tensorflow/magenta A ...
- Scala零基础教学【90-101】Akka 实战-代码实现
第90讲:基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验 akka在业界使用非常广泛 spark背后就是由akka驱动的 要写消息驱动的编程模型都首推akka 下面将用30讲讲解 ...
- JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码
JavaScript正则表达式的模式匹配 引言 正文 一.正则表达式定义 二.正则表达式的使用 三.RegExp直接量 (1)正则表达式初体验 (2)深入了解正则 字符类 重复 选择 分组与引用 指定 ...
- 【实战代码】PHP实现读取一个1G的文件大小
本文地址:http://www.cnblogs.com/aiweixiao/p/7535351.html 欢迎关注我的微信公众号哈 “ 程序员的文娱情怀” http://t.cn/RotyZtu [背 ...
- dubbo项目实战代码展示
最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...
- python实战===代码
#!/usr/bin/env python # encoding:utf-8 import requests import json from conf import STORE_DICT_LIST ...
- C基础 时间业务实战代码
引言 业务代码中遇到这样需求, 1. 二者是同一天吗, 2. 时间戳和时间串来回转, 3. 其它扩展需求 等. C写代码同样需要处理这方面时间问题. 本文就是为了解决这个问题. 相比其它时间库, 这里 ...
随机推荐
- Android 它们的定义ListView实现底部和页下拉刷新刷新的顶
在项目开发.由于数据量过大,寻呼需要加载或下拉刷新.为了缓解长期等待-time负载.这个博客的评论中被自己的定义实例ListView实现底部的下拉刷新页面正在加载结果和顶部. 其效果图: 一.List ...
- vim跳转
w 跳到下一个单词的开始 e 跳到单词的结束 b 向后跳 gg 跳到文件的开始 G 跳到文件的结束 10gg 或10G 跳到第10行 ta 跳到下一个a 前面 fa 跳到下一个a 大写的意思相反 另外 ...
- 解决OUTLOOK 533错误问题
OutLook中“553 sorry, that domain isn‘t in my list of allowed rcpthosts (#5.7.1)”,无法发送邮件错误,解决方法 最近我在给徐 ...
- iOS 开发者必不可少的 75 个工具
如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断 ...
- Cocos2d-x Lua 阅读Csv文件,使用数据更方便
在我的书或出售之前,我的源代码,有Csvshadow文件. 也许这是偏见.我与工作将是最长的轮廓Csv,所以,我会帮助不大喜欢它的游戏. Csv文件,非常格式easy,也就是说,一个数据线,字段之间用 ...
- 【phpMyAdmin】更改配置文件连接到其他server
默认phpMyAdmin安装完毕后对机器的访问mysql,但有时我们需要访问其它server的mysql数据库,所以我们需要配置. 真,phpMyAdmin已经为我们做了配置的选项.可是须要我们进行一 ...
- 第三记“晋IT”分享成长沙龙
2014年8月17日下午4点-7点,第三期"晋IT"分享成长沙龙在太原大自然蒙特梭利幼儿园多功能厅成功举办. 8月17日下午两点.小编领先来到场地,提前探訪一下准备情况. &quo ...
- Android高效的应用程序开发工具集1---ant构建一个简单的Android工程
在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,an ...
- C++中出现的计算机术语2
C-style strings(C 风格字符串) C 程序把指向以空字符结束的字符数组的指针视为字符串.在 C++ 中,字符串字面值就是 C 风格字符串.C 标准库定义了一系列处理这样的字符串的库函数 ...
- Web应用程序整体测试基础——单元测试
近年来,随着基于B/S结构的大型应用越来越多,Web应用程序测试问题也在逐步完善中.但Web应用程序测试既可以在系统开发中实施,也可以独立于系统单独完成,这取决于Web应用程序的复杂性和多样性.同时程 ...