c#爬虫窗体Demo

开发工具:vs2017,sql server 2014
框架版本:.net framework 4.6.1
开发模式:三层、orm PetaPoco

思路:
爬虫最为关键的一环就是读取网页的源码,其核心内容也是对网页源码的处理,因此获取到完整的网页源码是极为重要的(或者是要爬取的信息列表源码)。通过对网页源码进行字符串的处理,以便于获取需要的字段信息。

1.分析网页网址
例:https://www.shicimingju.com/shicimark/aiqingshi_1_0__0.html
这个网址翻页时会发生变动如果是第6页,网址为:
https://www.shicimingju.com/shicimark/aiqingshi_6_0__0.html
这时候,写一个循环拼接网址即可

2.分析网页(通过webBrowser加载网页)
(1).首先获取详情页的网址链接,主要是对a标签的处理,并拼接出一个完整的详情页网址,入库
注:详情页指的是,比如逛淘宝时,你点进去查看的就是商品的详情
(2).通过webBrowser循环加载第一步收入的网址,并提取需要的信息(主要是通过对字符串的截取实现)

实现过程
1.创建一个winform窗体程序,使用webBrowser控件
页面加载实例代码

 //阻止网页js弹窗webBrowser1.ScriptErrorsSuppressed = true;
//加载网页   webBrowser1.Navigate("https://www.shicimingju.com/shicimark/aiqingshi_1_0__0.html");
//获取当前webBrowser加载的网页源码
string htmlString = webBrowser1.Document.Body.OuterHtml;

因为webBrowser控件的内核是ie,所以对网页的兼容性比较差,好多网址在这个控件中加载时,会有js的错误弹窗,影响程序运行,所以需要阻止弹窗的弹出。

2.获取详情页链接
我们在抓取链接时,抓取有效链接也是十分重要的,这样做有利于数据规范。一般详情页的链接都是有规律的,包含通用的关键字,比如list(https://www.shicimingju.com/chaxun/list/3227.html)
(1).使用正则表达式提取a标签的href
优点,通用性比较强(对于多个网站来说,可适用于多个网站的a标签链接的提取)
缺点,因各个网站的差异性,提取的链接可能不准确
(2).使用字符串截取的方式提取a标签的href
优点,截取比较准确(指定网站)
缺点,通用性较差

代码示例(我这里采用的是字符串截取的方式)

string htmlString = webBrowser1.Document.Body.OuterHtml;string blUrl = "";string[] collArray = Regex.Split(htmlString, "</a>", RegexOptions.IgnoreCase);for (int i = 0; i < collArray.Length - 1; i++)
{try{//提取a标签blUrl = HtmlUnscramble.GetValue(collArray[i], "href=\"", "\"");if (blUrl == "") blUrl = HtmlUnscramble.GetValue(collArray[i], "href='", "'");if (blUrl == "") blUrl = HtmlUnscramble.GetValue(collArray[i], "href=", " ");if (blUrl.IndexOf("(") > -1 || blUrl.IndexOf("javascript") > -1 || blUrl.Length < 5) continue;if (blUrl.Substring(0, 2) == "//") blUrl = "http:" + blUrl;if (blUrl.Substring(0, 1) == "/" || blUrl.Substring(0, 1) == ".") blUrl = urlAdder + blUrl;if (!blUrl.Substring(0, 5).Contains("http") && blUrl.Substring(0, 1) != "/" && blUrl.Substring(0, 1) != "."){blUrl = urlAdder + "/" + blUrl;}if (blUrl.IndexOf(".com//") > -1) blUrl = blUrl.Replace(".com//", ".com/");if (blUrl.IndexOf(".cn//") > -1) blUrl = blUrl.Replace(".cn//", ".cn/");if (blUrl.IndexOf(".net//") > -1) blUrl = blUrl.Replace(".net//", ".net/");blUrl = blUrl.Replace("&amp;", "");if (!blUrl.Contains(urlAdderKey)) continue;string[] productKey = urlAdderKey.Split(';');bool blProductKey = false;for (int k = 0; k < productKey.Length; k++){if (blUrl.Contains(productKey[k])) { blProductKey = true; };}//符合关键字入库if (blProductKey){int hrefcount = GSDA.GetGushi(blUrl);if (hrefcount==0){GuShiInfo guShiInfo = new GuShiInfo{Href = blUrl};GSDA.InGushi(guShiInfo);}}}catch {}
}

3.获取详情页数据信息
(1).加载详情页面

加载示例代码(这里加载时长我设置了1分钟,目的是确保网页源码的完整性)

#region Loading
/// <summary>
/// 根据网址加载网页
/// </summary>
/// <param name="url">网址</param>
public void Loading(string url)
{bool loading = true;  //表示正在加载webBrowser1.Navigate(url);DateTime dtime = DateTime.Now.AddMinutes(1);while (loading){Application.DoEvents();//等待本次加载完毕才执行下次循环.        if (DateTime.Now > dtime){loading = false;}}if (loading == false){Application.DoEvents();//等待本次加载完毕才执行下次循环.   }}#endregion

(2).进行字符串处理,提取有效数据

数据提取代码示例(我这里使用的字符串截取的方式,也可使用正则)

IList<GuShiInfo> IGI = GSDA.GetAllGushi();
for (int i = 0; i < IGI.Count; i++)
{Loading(IGI[i].Href);html = webBrowser1.Document.Body.OuterHtml.ToLower();title = HtmlUnscramble.GetValue(html, "<h1 id=zs_title>", "</h1>");concent = HtmlUnscramble.GetValue(html, "<div id=zs_content class=item_content>", "</div>");authorandyears = Regex.Split(HtmlUnscramble.GetValue(html, "<div class=niandai_zuozhe>", "</div>",false), "<a", RegexOptions.IgnoreCase);years = HtmlUnscramble.ClearStyle(authorandyears[0]);author = HtmlUnscramble.GetValue(authorandyears[1], ">", "<");shangxi = HtmlUnscramble.GetValue(html, "<div class=item_title>作品赏析 </div>", "<div id=pre_next_div>");IGI[i].Html = html.Replace("'","");IGI[i].Title = title;IGI[i].Author = author;IGI[i].ShangXi = shangxi;IGI[i].Years = years;IGI[i].Concent = concent;IGI[i].State = 1;GSDA.UpdateGuShi(IGI[i]);Random random = new Random();int seconds = random.Next(1, 7) * 1000;Thread.Sleep(seconds);
}

4.注意事项
(1).注意控制网页抓取速率,访问太频繁,会被网站反扒检测到,ip会被封掉。因此控制页面时长就很重要了!
(2).如果网站有json源数据,抓取这个也是可以的,后期会出一个json数据抓取案例。
(3).webBrowser 由于是ie内核,所以网站兼容性很差。可以使用谷歌内核的类似插件,如CefSharp,使用nuget包下载即可。后期会出一个简单的教程使用CefSharp制作爬虫

c# winform 爬虫 小工具开发相关推荐

  1. jQuery开发之windows边栏小工具开发(Gadget development)- wi...

    为什么80%的码农都做不了架构师?>>>    jQuery开发之windows边栏小工具开发(Gadget development)- windows小工具实现的电话薄查询工具 作 ...

  2. 小工具开发笔记—IE自动填表器—第一篇:你好,世界

    系列导航: 小工具开发笔记-IE自动填表器-第零篇:序 小工具开发笔记-IE自动填表器-第一篇:你好,世界 继上篇博文初步介绍了小工具,本文就作为开发笔记正文第一篇,来叙述一下如何使用C++开发一个完 ...

  3. PyQt5制作一个爬虫小工具,爬取雪球网上市公司的财务数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于可以叫我才哥 ,作者:可以叫我才哥 最近有朋友需要帮忙写个爬虫脚本,爬取雪球网一些上 ...

  4. Java Swing实用小工具开发

    Java Swing实用桌面小工具开发 ------- 2018.7.11更新 --------- 步骤8中可能出现的问题,可尝试替换jarbundler为最新版本 jarbundler-2.2.0. ...

  5. PyQt5制作一个爬虫小工具,获取某网上市公司的财务数据可视化

    最近有朋友需要帮忙写个爬虫脚本,爬取雪球网一些上市公司的财务数据.盆友希望可以根据他自己的选择进行自由的抓取,所以简单给一份脚本交给盆友,盆友还需要自己搭建python环境,更需要去熟悉一些参数修改的 ...

  6. 基于Qt5.15的CRC校验小工具开发项目

    基于Qt5.15的CRC校验小工具开发项目 前言 一.开发准备 二.开发流程 1.Qt配置与界面设置 2.控件基本配置 3.CRC算法介绍 4.信号与槽的四个响应事件 5.打包发布 总结 前言 近期用 ...

  7. python+PyQt5 Excel小工具开发

    Excel小工具开发 openpyxl+xlwings+tkinter 操作Excel:包含文字和图片处理 具体功能:提取Excel清单表(源表)中目标信息,以指定格式(单文件多分表或者多文件单分表) ...

  8. [分享] jQuery开发之windows边栏小工具开发(Gadget development)- windows小工具实现的公司内部分机查询工具...

    作者:Terry li - GBin1.com 使用vista和win7的朋友可能都或多或少的使用过windows小工具,这些小工具可以被自由的添加到桌面上并且快速实现一定的功能,比如,天气预报,股票 ...

  9. 爬虫小工具合集|不会编程也能爬数据

    当前的主流爬虫手段是用Python编程,Python的强大毋庸置疑,但初学者学习Python还是需要一两个月时间的.有没有一些更简单的爬取数据方法呢?答案是有的,DataCastle为你准备了如下小工 ...

最新文章

  1. 小猿圈linux之运维工程师面试题(答案版)
  2. mac远程连接centos安装mysql_centos安装Mysql并远程连接
  3. 【LUA table 移除操作非常慢】
  4. MultiModel:跨领域多任务机器学习
  5. 玩转oracle 11g(26):误删表数据和误删表回滚
  6. 使用supervisor提高nodejs调试效率
  7. 关于Apt注解实践与总结【包含20篇博客】
  8. 【业务安全01】业务安全基础及测试流程
  9. java毕业设计开题报告基于SSM学生成绩管理系统
  10. Excel怎么批量将各数据复制填充指定次数
  11. 关键词排名的查询方法
  12. paranoid用法
  13. Linux centOS 7.2 命令行下 静默安装部署oracle11g数据库
  14. C++ 简单编程——两数相乘
  15. 互联网周刊:不痛不痒的信息安全
  16. 删除数组中的重复项(保留最后一次出现的重复元素并保证数组的原有顺序)
  17. Linux下R环境安装
  18. JVM设置对象直接进入年老代
  19. 新时期计算机网络通信发展现状与趋势
  20. 迁移wordpress_WordPress迁移变得容易

热门文章

  1. 植入木马获取网站权限
  2. VC宏定义 及常用宏定义说明
  3. 一些不错的svg素材
  4. 基于YOLOv5开源项目实现垃圾分类功能(2)
  5. 初学C语言怕了吗?别怕,我来教你捏~
  6. Joda-Time 的使用
  7. 北斗链张蕾:法定数字货币机制研究(上)
  8. 知道mysql单元测试答案_智慧树初识数据库—Mysql答案章节单元测试答案
  9. 软件测试(一)——入门篇知识要点总结
  10. 怎么调整html文本域宽度和高度,如何使用CSS设置textarea的宽度和高度?