|
网络上很多爬虫都是用python写的,前段时间,也写了个aps.net的简单爬虫,可以爬取你想要爬的数据。现在很多网站都做了反爬的机制,这让爬虫抓取数据难度变得很大。大多数网站的反爬方式大概有几种:有加验证码的,记录IP地址,黑名单等,还有一些更高级的反爬手段。
这个爬虫也有做了一些应对反爬的措施,绕过验证码,使用代理等,下面贴上部分代码,和大家一起探讨学习,不对的地方请大家指正!
这个爬虫主要是针对某个网站进行爬取。
输入网址后,可以根据网址将数据爬取回来,再通过XPath将数据进行筛选清洗,获得自己想要的数据
- private void ReceivedData(IAsyncResult ar)
- {
- RequestState rs = (RequestState)ar.AsyncState;//获取参数
- HttpWebRequest req = rs.Req;
- Stream resStream = rs.ResStream;
- string url = rs.Url;
- int depth = rs.Depth;
- string html = null;
- int index = rs.Index;
- int read = 0;
- try
- {
- read = resStream.EndRead(ar);//获得数据读取结果
- if (_stop)//判断是否中止下载
- {
- rs.ResStream.Close();
- req.Abort();
- return;
- }
- if (read > 0)
- {
- HttpWebResponse res = (HttpWebResponse)req.GetResponse();
- if (res.LastModified < DateTime.Now.AddDays(-7))
- {
- return;//判断页面修改时间是否在当前时间的上一个月内,不是的话不下载当前页面
- }
- if (res.CharacterSet == "ISO-8859-1")
- _encoding = Encoding.GetEncoding("GB2312");
- else
- _encoding = Encoding.GetEncoding(res.CharacterSet);
- StreamReader reader = new StreamReader(res.GetResponseStream());
-
- string str = reader.ReadToEnd();//读取所有字符
-
- rs.Html.Append(str);// 添加到之前的末尾
-
- var result = resStream.BeginRead(rs.Data, 0, rs.BufferSize,
- new AsyncCallback(ReceivedData), rs);//再次异步请求读取数据
- return;
- }
- html = rs.Html.ToString();
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(html);
- HtmlNode rootnode = doc.DocumentNode; //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num
- //根据网页的内容设置XPath路径表达式
- string xpathstring = "//*[@id='wrap']/div[8]/div[1]/div[2]/ul/li[2]/div/div[2]/h3/a";
- HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring); //所有找到的节点都是一个集合
- if (aa != null)
- {
- string innertext = aa[0].InnerText;
- }
复制代码 要绕过反爬,可以用代理IP去访问,可以在网上先下载或者抓取一份高匿IP,然后随机切换代理IP去抓取
- //验证ip:端口是否能访问目标网站
- public static string Check(string strip, int port)
- {
- WebProxy proxyObject = new WebProxy(strip, port);//str为IP地址 port为端口号
- HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("http://news.sina.com.cn/");
- string ip = "http://" + strip + ":" + port + "/";
- proxyObject.Address = new Uri(ip);
- Req.Proxy = proxyObject; //设置代理
- HttpWebResponse Resp = (HttpWebResponse)Req.GetResponse();
- string str = "";
- string OkStr = "";
- Encoding code = Encoding.GetEncoding("UTF-8");
- using (StreamReader sr = new StreamReader(Resp.GetResponseStream(), code))
- {
- string IPpoxy = "";
- if (sr != null)
- {
- try
- {
- str = sr.ReadToEnd();
- //StringSub.substr(str, "<h2>", "</h2>", 0);
- //str = str.Substring(str.IndexOf(start) + start.Length);
- //OkStr = str.Substring(0, str.IndexOf(last));
- //MessageBox.Show("验证成功!显示IP为" + OkStr);
- if (str != "")
- {
- IPpoxy = strip + ":" + port;
- }
- else
- {
- IPpoxy = "";
- }
- }
- catch
- {
- //MessageBox.Show("文件读取失败!");
- return "";
- }
- finally
- {
- sr.Close();
- }
- }
- return IPpoxy;
- }
- }
复制代码 上面这段代码是先判断切换的IP是否能访问
具体代码看源码吧,把源码提供出来!
源码下载
|
评分
-
查看全部评分
上一篇:{:1_7:}{:1_9:}下一篇:重置vs2017 开发环境
|