c# & Fizzler to crawl web page in a certain website domain
2014-04-09 20:14
537 查看
使用fizzler [HtmlAgilityPackExtension]和c#进行网页数据提取;fizzler是HtmlAgilityPack的一个扩展,支持jQuery Selector;
提取数据一般都是有规律url拼凑,然后挨个儿发request得到response进行解析:
1.假如一个website下的所有xxx.sample.com/contactus.html里边存在邮箱字段(准备提取的数据)
a)当有子域名的时候,比如:a.sample.com, aadr.sample.com, 135dj.sample.com,随机性比较强;
解决方法:bing search engine中使用 site:b2b.sample.com搜索得到的result页面可以提取所有子域名,然后拼凑成xxx.sample.com/contactus.html,继而发送请求到这个url,得 到response进行解析;
NOTE:关于site:b2b.sample.com的搜索url拼凑如下,
http://www.bing.com/search?q=site%3A{b2b.sample.com}&go=Submit&qs=n&form=QBRE&pq=site%3A{b2b.sample.com}&sc=1-19&sp=-1&sk=&cvid=6165a189f5354b1982fb8cd6933abb6f&first={pageIndex}&FORM=PERE
2.像www.sample.com/1456.html的页面可以直接平凑1456.html/1457.html/1458.html etc.此处不列举;
Fizzler使用方法:
1.从nuget上安装Fizzler;
2.使用方法参考code.google.com;
3.使用bing提取website下的所有子域:
4.获取网页节点:
5.获取某个网页中邮箱的方法:
最后的问题:当通过bing搜索子域时会有限制,发送100~150个请求后获取到的response就不是我想要的页面,而是要求输入验证码防止攻击的html;此问题暂时未解决,望大神指点!
提取数据一般都是有规律url拼凑,然后挨个儿发request得到response进行解析:
1.假如一个website下的所有xxx.sample.com/contactus.html里边存在邮箱字段(准备提取的数据)
a)当有子域名的时候,比如:a.sample.com, aadr.sample.com, 135dj.sample.com,随机性比较强;
解决方法:bing search engine中使用 site:b2b.sample.com搜索得到的result页面可以提取所有子域名,然后拼凑成xxx.sample.com/contactus.html,继而发送请求到这个url,得 到response进行解析;
NOTE:关于site:b2b.sample.com的搜索url拼凑如下,
http://www.bing.com/search?q=site%3A{b2b.sample.com}&go=Submit&qs=n&form=QBRE&pq=site%3A{b2b.sample.com}&sc=1-19&sp=-1&sk=&cvid=6165a189f5354b1982fb8cd6933abb6f&first={pageIndex}&FORM=PERE
2.像www.sample.com/1456.html的页面可以直接平凑1456.html/1457.html/1458.html etc.此处不列举;
Fizzler使用方法:
1.从nuget上安装Fizzler;
2.使用方法参考code.google.com;
3.使用bing提取website下的所有子域:
private static List<string> GetSubdomains(string websiteDomain, int startPageIndex = 1, int pageCount = 999, int pageSize = 14) { var list = new List<string>(); //using bind to search subdomains in a certain website var bingSearchUrlFormat = "http://www.bing.com/search?q=site%3a{0}&go=Submit&qs=n&pq=site%3a{0}&sc=1-100&sp=-1&sk=&cvid=a9b36439006f4b05b09f9202c5b784bd&first={1}&FORM=PQRE"; WebClient client = new WebClient(); client.Encoding = Encoding.UTF8; var doc = new HtmlDocument(); var first = (startPageIndex / 10) * 140 + 1; var stopIndex = first + pageCount*pageSize; var currentPageIndex = startPageIndex; for (var startItemSquenceNumber = first; startItemSquenceNumber < stopIndex; startItemSquenceNumber = startItemSquenceNumber + pageSize) { var response = client.DownloadString(string.Format(bingSearchUrlFormat, websiteDomain, startItemSquenceNumber)); HtmlDocumentExtensions.LoadHtml2(doc, response); var docNode = doc.DocumentNode; var subDomains = docNode.QuerySelectorAll(".sb_meta cite");foreach (var subDomain in subDomains) { list.Add(subDomain.InnerText); } }return list; }
4.获取网页节点:
private static List<HtmlNode> GetWebPageNodes(string url, string elementSelector, string attributeNameContained, string attributeNameContainedValueLike) { var client = new WebClient(); client.Encoding = Encoding.UTF8; var response = client.DownloadString(url); var doc = new HtmlDocument(); HtmlDocumentExtensions.LoadHtml2(doc, response); var docNode = doc.DocumentNode; var emailNode = docNode.QuerySelectorAll(elementSelector).Where(node => node.Attributes.Where(attr => attr.Name == attributeNameContained).FirstOrDefault().Value.Contains(attributeNameContainedValueLike)).FirstOrDefault(); var nodes = (from node in docNode.QuerySelectorAll(elementSelector) where node.HasAttributes && node.GetAttributeValue(attributeNameContained, string.Empty).Contains(attributeNameContainedValueLike) select node).ToList(); return nodes; }
5.获取某个网页中邮箱的方法:
var subdomains = GetSubdomains("b2b.sample.com", stopPageIndex, 10); var urlFormat = "http://{0}/contactus.html"; GetWebPageNodes(string.Format(urlFormat, item), "body table a", "href", "mailto").FirstOrDefault();
最后的问题:当通过bing搜索子域时会有限制,发送100~150个请求后获取到的response就不是我想要的页面,而是要求输入验证码防止攻击的html;此问题暂时未解决,望大神指点!
相关文章推荐
- C# 接口初探
- C#各种结束进程的方法详细介绍
- C# virtual override abstract new区别
- C# zedgraph利用另一窗口取得的串口数据绘图
- c# xml的增删改查操作 xmlDocument 的用法
- C# interface与abstract class区别
- c#中的反射
- C#使用XmlDocument操作XML进行查询、增加、修改、删除、保存应用的实例
- 01-C#入门(分支控制语句)
- C# 获取数组的子集
- 电子签章(Electronic Signature)在C#中的实现方法
- 一个很好的用C#导出数据到Excel模板的方法
- C#位操作符
- C# Windows - TabControl
- C# 调用百度地图Web服务API
- C# ActiveX 中static变量缓存的问题
- C#中使用MAPI发送E-Mail
- C#中Finally的一个不太常见的用法
- C#记事本
- c#程序编写规范