分享一套抓数据小程序,客户资料、实时新闻、股票数据…随心抓
2013-01-09 10:57
211 查看
为了拓展公司业务,客服部需要大量相关行业的客户资料。由于公司规模不大,从成本上考虑购买数据不太现实,所以我们就开发了一套方案,从行业相关的商业网站上去抓取客户资料。
鉴于不同的网站在数据排版、字符编码、获取数据方式(get或post)不同。如要抓到自己想要的数据,针对每个网站都需要进行网页的分析,有效数据的提取。在这里主要分享关键代码,顺便把最近写的一个程序源代码贴出来供园友们下载研究,里面有抓取三个网站数据的例子(深市A股、三星手机、当当网微软技术丛书,抓取不同的网站需要修改运行入口)。掌握其中一个的技巧,便可以在所有类似网站上获取你想要的数据,比方你在炒股,你可以抓取股票网站数据到本地,做个报表分析,操作的好,能让你赚的盆满钵满;假若你自己有个淘宝网店,需要商品图片,copy别人店铺的图片多慢啊,抓取便是;如果你有博客或新闻网站,没有更新的数据怎么办,看中哪个网站抓取便是。说了这么多,回正题……
下面我以抓取其中一个网站为例来介绍这个小程序,首先抓取任务如下:
http://detail.zol.com.cn/cell_phone_index/subcate57_98_list_1.html 只要图片,手机名称,价格,网络模式,网络类型,其它信息不要
手机图片要下载下来
1.程序界面设计如下,只为达到抓取数据目的,界面比较鄙陋筒靴们将就看:-)。
2.用时信息通过Timer控件的tick事件来显示抓取用的时间,代码如下:
3.进度信息用的是委托显示抓取详情,代码如下:
4.拖放一个backgroundWorker控件,启动DoWork事件和RunWorkerCompleted事件。
DoWork代码如下(代码中标红的方法是几个关键的方法
):
RunWorkerCompleted代码如下:
5.点击窗体抓取数据启动Click事件,代码如下:
6.大功告成。启动程序效果如下:
7.运行完成后查看抓取的数据信息和手机图片如下(把Xml文件拖到Excel中显示):
总结:此例只是针对Get请求数据的情况,而且当前抓取的网站都是不需要登录的。而在实际生产中肯定有Post请求数据的,也有需要登录的,源码里面的Common类提供了各种场景需要的方法,有兴趣的可以深入研究。
源码下载
鉴于不同的网站在数据排版、字符编码、获取数据方式(get或post)不同。如要抓到自己想要的数据,针对每个网站都需要进行网页的分析,有效数据的提取。在这里主要分享关键代码,顺便把最近写的一个程序源代码贴出来供园友们下载研究,里面有抓取三个网站数据的例子(深市A股、三星手机、当当网微软技术丛书,抓取不同的网站需要修改运行入口)。掌握其中一个的技巧,便可以在所有类似网站上获取你想要的数据,比方你在炒股,你可以抓取股票网站数据到本地,做个报表分析,操作的好,能让你赚的盆满钵满;假若你自己有个淘宝网店,需要商品图片,copy别人店铺的图片多慢啊,抓取便是;如果你有博客或新闻网站,没有更新的数据怎么办,看中哪个网站抓取便是。说了这么多,回正题……
下面我以抓取其中一个网站为例来介绍这个小程序,首先抓取任务如下:
http://detail.zol.com.cn/cell_phone_index/subcate57_98_list_1.html 只要图片,手机名称,价格,网络模式,网络类型,其它信息不要
手机图片要下载下来
1.程序界面设计如下,只为达到抓取数据目的,界面比较鄙陋筒靴们将就看:-)。
2.用时信息通过Timer控件的tick事件来显示抓取用的时间,代码如下:
#region //时间处理 int duration = 0; private void timer1_Tick(object sender, EventArgs e) { duration++; lbTime.Text = "用时:" + GetTimeBySecount(int.Parse(duration.ToString().Trim())); } /// <summary> /// 通过秒返回时:分:秒格式的时间 /// </summary> /// <returns></returns> private string GetTimeBySecount(int s) { s = s + 1; TimeSpan timeSpan = new TimeSpan(0, 0, s); string hour = timeSpan.Hours < 10 ? timeSpan.Hours.ToString().Trim().PadLeft(2, '0') : timeSpan.Hours.ToString().Trim(); string minute = timeSpan.Minutes < 10 ? timeSpan.Minutes.ToString().Trim().PadLeft(2, '0') : timeSpan.Minutes.ToString().Trim(); string second = timeSpan.Seconds < 10 ? timeSpan.Seconds.ToString().Trim().PadLeft(2, '0') : timeSpan.Seconds.ToString().Trim(); return string.Format("{0}:{1}:{2}", hour, minute, second); } #endregion
3.进度信息用的是委托显示抓取详情,代码如下:
#region //委托显示用户提示信息 /// <summary> /// 为了进程之间通信,定义一个委托 /// </summary> /// <param name="displayString">实时处理的信息</param> /// <param name="lbl">接收实时处理信息的 Label 对象</param> /// <param name="ui">承载 Label 控件的窗体对象</param> delegate void SetText(string displayString, Label lbl, Form ui); /// <summary> /// 利用委托操作窗体线程上的 Lable 控件 /// </summary> /// <param name="str">实时处理的信息</param> /// <param name="lb">接收实时处理信息的 Label 对象</param> /// <param name="fui">承载 Label 控件的窗体对象</param> public static void SetLableText(string str, Label lb, Form fui) { if (lb.InvokeRequired) { SetText st = new SetText(SetLableText); fui.Invoke(st, str, lb, fui); } else { lb.Text = str; } } #endregion
4.拖放一个backgroundWorker控件,启动DoWork事件和RunWorkerCompleted事件。
DoWork代码如下(代码中标红的方法是几个关键的方法
Common.Get_HttpAll:根据网页地址,和字符编码获取网页源代码返回string
Common.ResolverAndOutput:从网页内容中获取关键信息,通常用于获取列表数据,table里面的tr数据。 参数1传入要分析的网页内容; 参数2传入要分析的网页内容的起始点,为空则表示从网页内容起始位置开始; 参数3传入要分析的网页内容的终结点,为空则表示截止到网页内容的最后位置; 参数4传入过滤规则,例如:<tr>(?<content>.+?)</tr>,表示获取参数2和参数3之间的字符串中所有<tr>开始,</tr>结束的所有字符串,这些字符串用$~拼接; 参数5默认传入1; 参数6默认传入false;
Common.JieQuString:截取字符串中A和B之间的数据。参数1传入带分析的字符串;参数2传入A(A在字符串中唯一);参数3传入B(B在字符串中唯一)
):
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { try { DataSet ds = new DataSet(); DataTable dtContact = new DataTable("tbl"); dtContact.Columns.Add("name"); dtContact.Columns.Add("price"); dtContact.Columns.Add("fileName"); dtContact.Columns.Add("model"); dtContact.Columns.Add("type"); DataRow dr; int i = 1; bool flag = true; do { string path = "http://detail.zol.com.cn/cell_phone_index/subcate57_98_list_" + i.ToString() + ".html"; string getHtml = Common.Get_HttpAll(path, "GB2312"); if (!getHtml.Contains("wrong")) { string useHtml = Common.ResolverAndOutput(getHtml, "", "", "<div class=\"list-item clearfix\">(?<content>.+?)target=\"_blank\">查询底价</a>", 1, false); string[] trItem = useHtml.Replace("~", "").Split('$'); flag = trItem.Length > 2; for (int j = 0; j < trItem.Length - 1; j++) { SetLableText("进度:当前正在分析第" + i + " 页,第"+(j+1)+"条数据", lbJD, this); dr = dtContact.NewRow(); string imgUrl = Common.JieQuString(trItem[j], "<div class=\"pic-box SP\" data-rel=\"", "\">"); int splitIndex=imgUrl.LastIndexOf('/'); if (splitIndex < 0) { break; } string fileName= imgUrl.Substring(splitIndex, imgUrl.Length - splitIndex).Replace("/",""); //下载当前产品图片 string filepath = "E:\\抓数据\\中关村三星手机图片\\"+fileName; WebClient mywebclient = new WebClient(); mywebclient.DownloadFile(imgUrl, filepath); //填充行值 dr["name"] = Common.JieQuString(Common.JieQuString(trItem[j], "<h3>", "</h3>"), ">", "</a>"); dr["price"] = Common.JieQuString(trItem[j],"<span class=\"price\">¥<b class=''>","</b></span>"); dr["fileName"] = fileName; dr["model"] = Common.JieQuString(trItem[j], "<span>网络模式:</span>", "</li>"); dr["type"] = Common.JieQuString(trItem[j], "<span>网络类型:</span>", "</li>"); dtContact.Rows.Add(dr); } ds.Tables.Add(dtContact.Copy()); string savePath = "E:\\抓数据\\中关村三星手机.xml"; ds.WriteXml(savePath); ds.Tables.Clear(); } else { continue; } i++; } while (flag); } catch (Exception ex) { MessageBox.Show("代码异常:" + ex); } }
RunWorkerCompleted代码如下:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { timer1.Stop(); timer1.Enabled = false; MessageBox.Show("ok,见 E:\\抓数据\\中关村三星手机.xml"); }
5.点击窗体抓取数据启动Click事件,代码如下:
private void btnGetData_Click(object sender, EventArgs e) { timer1.Enabled = true; timer1.Start(); backgroundWorker1.RunWorkerAsync(); }
6.大功告成。启动程序效果如下:
7.运行完成后查看抓取的数据信息和手机图片如下(把Xml文件拖到Excel中显示):
总结:此例只是针对Get请求数据的情况,而且当前抓取的网站都是不需要登录的。而在实际生产中肯定有Post请求数据的,也有需要登录的,源码里面的Common类提供了各种场景需要的方法,有兴趣的可以深入研究。
源码下载
相关文章推荐
- [转]分享一套抓数据小程序,客户资料、实时新闻、股票数据…随心抓
- 新闻管理模块(在程序中可以使用的一套完整的增添、修改、查询数据的思路)
- 【分享】信用卡客户基本资料数据
- 股票实时数据的获取
- 小程序登录页面实时更新数据,并用调用函数
- 微信小程序 数据封装,参数传值等经验分享
- 【云星数据---mesos实战系列003】:marathon实战008--marathon部署一套最简单的前端程序
- [资料分享]GIS+=地理信息+云计算+大数据+容器+物联网+...论文、会议、讲座资料分享
- 获取股票实时交易数据的方法
- 回射程序(客户端)——客户接收一行数据
- 获取股票实时交易数据的方法
- TOP100summit:【分享实录-Microsoft】基于Kafka与Spark的实时大数据质量监控平台
- 新浪实时股票数据接口http://hq.sinajs.cn/list=code
- [资料分享]GIS+=地理信息+云计算+大数据+容器+物联网+...论文、会议、讲座资料分享
- googlefinace 访问 纳斯达克 纽交所 实时 股票数据
- 实时股票数据接口大全
- 新浪实时股票数据接口1