架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 76078|回复: 24

[WinForm] ASP.NET网络爬虫

[复制链接]
发表于 2017-11-6 18:36:20 | 显示全部楼层 |阅读模式
网络上很多爬虫都是用python写的,前段时间,也写了个aps.net的简单爬虫,可以爬取你想要爬的数据。现在很多网站都做了反爬的机制,这让爬虫抓取数据难度变得很大。大多数网站的反爬方式大概有几种:有加验证码的,记录IP地址,黑名单等,还有一些更高级的反爬手段。
这个爬虫也有做了一些应对反爬的措施,绕过验证码,使用代理等,下面贴上部分代码,和大家一起探讨学习,不对的地方请大家指正!
这个爬虫主要是针对某个网站进行爬取。
a无标题.png
输入网址后,可以根据网址将数据爬取回来,再通过XPath将数据进行筛选清洗,获得自己想要的数据
  1. private void ReceivedData(IAsyncResult ar)
  2.         {
  3.             RequestState rs = (RequestState)ar.AsyncState;//获取参数
  4.             HttpWebRequest req = rs.Req;
  5.             Stream resStream = rs.ResStream;
  6.             string url = rs.Url;
  7.             int depth = rs.Depth;
  8.             string html = null;
  9.             int index = rs.Index;
  10.             int read = 0;

  11.             try
  12.             {
  13.                 read = resStream.EndRead(ar);//获得数据读取结果
  14.                 if (_stop)//判断是否中止下载
  15.                 {
  16.                     rs.ResStream.Close();
  17.                     req.Abort();
  18.                     return;
  19.                 }
  20.                 if (read > 0)
  21.                 {
  22.                     HttpWebResponse res = (HttpWebResponse)req.GetResponse();

  23.                     if (res.LastModified < DateTime.Now.AddDays(-7))
  24.                     {
  25.                         return;//判断页面修改时间是否在当前时间的上一个月内,不是的话不下载当前页面
  26.                     }
  27.                     if (res.CharacterSet == "ISO-8859-1")
  28.                         _encoding = Encoding.GetEncoding("GB2312");
  29.                     else
  30.                         _encoding = Encoding.GetEncoding(res.CharacterSet);
  31.                     StreamReader reader = new StreamReader(res.GetResponseStream());
  32.                  
  33.                     string str = reader.ReadToEnd();//读取所有字符
  34.                
  35.                     rs.Html.Append(str);// 添加到之前的末尾
  36.                                        
  37.                     var result = resStream.BeginRead(rs.Data, 0, rs.BufferSize,
  38.                         new AsyncCallback(ReceivedData), rs);//再次异步请求读取数据
  39.                     return;
  40.                 }
  41.                 html = rs.Html.ToString();

  42.                 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
  43.                 doc.LoadHtml(html);
  44.                 HtmlNode rootnode = doc.DocumentNode;    //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num
  45.                 //根据网页的内容设置XPath路径表达式
  46.                 string xpathstring = "//*[@id='wrap']/div[8]/div[1]/div[2]/ul/li[2]/div/div[2]/h3/a";
  47.                 HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring);    //所有找到的节点都是一个集合              

  48.                 if (aa != null)
  49.                 {
  50.                     string innertext = aa[0].InnerText;
  51.                 }
复制代码
要绕过反爬,可以用代理IP去访问,可以在网上先下载或者抓取一份高匿IP,然后随机切换代理IP去抓取
  1. //验证ip:端口是否能访问目标网站
  2.         public static string Check(string strip, int port)
  3.         {
  4.             WebProxy proxyObject = new WebProxy(strip, port);//str为IP地址 port为端口号
  5.             HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("http://news.sina.com.cn/");
  6.             string ip = "http://" + strip + ":" + port + "/";
  7.             proxyObject.Address = new Uri(ip);
  8.             Req.Proxy = proxyObject; //设置代理

  9.             HttpWebResponse Resp = (HttpWebResponse)Req.GetResponse();
  10.             string str = "";
  11.             string OkStr = "";
  12.             Encoding code = Encoding.GetEncoding("UTF-8");
  13.             using (StreamReader sr = new StreamReader(Resp.GetResponseStream(), code))
  14.             {
  15.                 string IPpoxy = "";
  16.                 if (sr != null)
  17.                 {
  18.                     try
  19.                     {
  20.                         str = sr.ReadToEnd();
  21.                         //StringSub.substr(str, "<h2>", "</h2>", 0);
  22.                         //str = str.Substring(str.IndexOf(start) + start.Length);
  23.                         //OkStr = str.Substring(0, str.IndexOf(last));
  24.                         //MessageBox.Show("验证成功!显示IP为" + OkStr);
  25.                         if (str != "")
  26.                         {
  27.                             IPpoxy = strip + ":" + port;
  28.                         }
  29.                         else
  30.                         {
  31.                             IPpoxy = "";
  32.                         }
  33.                     }
  34.                     catch
  35.                     {
  36.                         //MessageBox.Show("文件读取失败!");
  37.                         return "";
  38.                     }
  39.                     finally
  40.                     {
  41.                         sr.Close();
  42.                     }
  43.                 }
  44.                 return IPpoxy;
  45.             }
  46.         }
复制代码
上面这段代码是先判断切换的IP是否能访问
具体代码看源码吧,把源码提供出来!

源码下载
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 3MB +3 贡献 +3 收起 理由
爱学习的小小白 + 1 + 1 很给力!
moxuan + 1 + 1 支持楼主发好帖
小渣渣 + 1 + 1 很给力!

查看全部评分





上一篇:{:1_7:}{:1_9:}
下一篇:重置vs2017 开发环境
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-11-7 09:30:14 | 显示全部楼层
小渣渣 发表于 2017-11-6 18:44
帮你整理了一下帖子内容

谢谢,刚想删除一条重复的呢!辛苦了!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-12-13 10:32:09 | 显示全部楼层
我想知道你写的那个存储过程是什么样的,老哥。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-6 18:44:57 | 显示全部楼层
帮你整理了一下帖子内容   
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-7 15:00:04 | 显示全部楼层
谢谢分享,来看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-8 15:46:42 | 显示全部楼层
看看源码先
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-10 17:14:31 | 显示全部楼层
ASP.NET网络爬虫
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-12-8 22:15:43 | 显示全部楼层
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-12-10 08:25:22 | 显示全部楼层
ASP.NET网络爬虫 不错的思路!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-12-23 20:54:35 | 显示全部楼层
ASP.NET网络爬虫
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-4-16 11:46:03 | 显示全部楼层
感谢分享,学习一下。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-1-17 02:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表