C#.NET、Power BI、数据挖掘
说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析Html,用开源的HtmlAgilityPack就很快解决问题了。我个人并不是技术特别深,所以只要是解决问题就OK了。但每一次需求并不是完全一致的,对上面那篇文章的采集,无需登录,是非常灵活的,但是这次碰到的稍微有点变态,虽然最后任务完成,但总结方案还是很low的,但觉得还是有必要分享出来,希望对以后碰到这个问题的人有用。
1.采集目目标特点与分析
由于采集目标比较商业性,不便于透露。所以文字多一点。大家仔细看。
目标网站特点以及初始需求:
1) 要求登录,并且登录安全验证非常严,怎么严就不说了,就是非常困难,动不动还得手机验证。
2) 网站数据经过分析,都是直接登录后通过https请求来获取JSON数据,解析就可以用,但是里面也有变态的地方,就是有些参数是加密的,直接扒历史数据有困难;
3) 初期网站每天需要采集的URL类型超过60+左右,但总的采集链接数超过2000+,因为一个类型的URL,有很多不同的区域的数据需要采集;
最需要说明的是该项目所有的页面分析,解析和采集入库工作由2个毕业生来做,我也没时间去做很深入的研究,他们C#语法还不是很熟练,所以技术方案上不能太复杂,越简单越好。
先看看我这方案的过程,由于工作太多,刚开始想法是很好的,但是越做到后面,发现越麻烦。
2.方案第一版-Low到爆,别笑话
该采集最大的难点就是登录的问题,由于安全性太高,所以一开始我就彻底放弃了程序模拟登录的思路,虽然后面的过程有点曲折,但这也是新人很快能搞定所有采集的关键。否则在前面就不知道要花费多少时间。说说初步的想法:
1.既然登录后就可以采集数据,那就人工登录一次,做一个asp.net web页面,点击开始,就可以使用WebClient请求JSON数据。因为在同一个浏览器,登录的session啥都可以共享,我是这么想的。
2.请求数据后直接解析到数据库;
3.大量的URL多线程执行应该速度很不错,So,没啥压力;
大神一眼都能看出问题哈,想法很美好,现实是很残酷。
3.碰壁后的第二版方案
基本JSON的解析工作差不多让新人完成后,自己做了个asp.net 的web测试,真是xxx,获取不到JSON数据,一调试,才知道,WebClient请求这样搞是不行的,在web页面直接请求url也是不行的,就是所谓的跨域问题,虽然没搞过前端,但也能理解。好吧,这么low的问题,真的不好意思拿出来说,谁叫没动手试一下呢。那怎么破?所以有了第二版方案:
1.既然不能跨域,那就让你跨。在大石头和邱哥的提示下,用webbrowse来搞吧。
2.使用webbrowse控件手动登录后,直接在控件中请求新的URL,获取JSON值;对,这样看你跨不跨过去。。。测试一个链接也是可行的。
然后发现真的是 万事开头难,中间难,结尾更难。。。想法很美好,现实是很残酷!
4.最终方案第三版
4.1 该死的completed事件
按照方案2,很快所有的链接加进去了,开始采集,又杯具了。只有第一个链接能执行。。。调试,很快发现问题,也怪学艺不精,以前没用过webbrowse啊:
webbrowse请求url后,是不能马上获取到请求的html文本的,要在completed事件中处理获取到的html文本(JSON字符串)才行。怎么破?
既然要用事件,那也挺好,不断请求,不断解析,把处理逻辑加到事件中就好了。很OK,继续进行中。。。
4.2 没想到URL请求太快
没跑几个URL,xxx,问题又来了:当初由于采集的页面和链接太多,所以做了几个菜单,点击后分别采集不同的任务,但是点击后这个请求不断的发,这个事件执行是有问题的,很多没执行到,有一些中间变量值被覆盖了,请求太快啊。。。怎么破?那我就设置个长一点的时间,确保每次加载并处理完成才去请求下一次。好,说干就干,看了一下每个页面的解析,10秒足够了,那就搞10秒请求一次。。。。继续进行中
还是xxx,过几天这个网站改版了,改动很多,很无奈啊,但生活还得继续。还好我们的解析都是利用工具生成的东西,改起来很快。具体可以参考这篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)。
改版的一个主要变化是URL类型增加了很多,所以数据也增加了很多,以前是总共也就50-60个类型的链接需要采集,但是改版后,上升到2000+,增加了很多子类型的数据,你懂的。然后发现这个10秒一次,啥时候能采集完成啊。。。而且很明显,10秒对很多URL来说多很多,不是白白浪费吗。。。好吧,知道问题,那就想办法解决,如果连问题都不知道,那就杯具了。
都搞10秒不公平,那就搞个timer吧,定时执行,但是在请求之前和解析之后,动态修改这个timer的间隔执行时间,一秒也不浪费啊。比如请求之前设置间隔是10秒,事件里面解析之后设置为1毫秒。。。哈哈,So easy 。。。。
4.3 想开得和飞机一样快,但火车的速度都没到
xxx,跑了上百个之后,发现还是太慢,任务太多啊。。。每一个好几秒也hold不足。。。。那怎么破,分析一下原因,很明显请求加载速度很快,慢在处理那里,主要是事件处理那里不好加多线程。那怎么破,办法总比问题多。。。怕啥。。。
反正就是每天采集下,那弄个中间缓存呗。当然本地缓存也是可以的啊,这里特意用了一个windows版的redis做了个测试,目的是有2个,因为我们组的项目中redis用的比较广泛,新的毕业生来虽然没玩过,但我们日常也在说,以后项目也会用到,所以特意在这个地方教他们使用了一下,比使用Oracle当然更简单,平时他们都是用Oracle,所以理解起来也不费劲。所以新的方案又来了:
使用timer来控制发送请求的间隔,在完成事件中,把json值和相关解析要用到的变量缓存到redis中,然后开一个多线程从redis里面取值进行解析工作。。。所干就干,用了30行代码改造了一下,很快就测试。。。不得不说,Paralller.For好用啊,请求的速度提高到60-80个/秒,速度很快了,解析4个线程开起来,速度也杠杆的,没计算具体的时间,但是解析完也就比请求完多个几分钟。开发机安装东西太多,而且CPU比较鸡肋,所以开4个线程已经100%了,所以这个效率也够了。至此,整个系统的核心工作让2个新人折腾来折腾去,给他们思路,和简单的示例代码,就搞定了。
5.总结
当然过程的细节还有很多要注意,特别是解析工作,在前一篇文章中说过了。
其实从分析页面链接,到解析,到最后数据入库,代码给他们过指导,但大部分工作是新人完成的。这个过程让他们也对项目和数据有了很深的了解,自己也会更轻松一些,毕竟从头接触,出了问题,他们可以排查。在从头到尾的过程中,还有很多细节,他们自己也排查和发现了很多bug,但总归要给他们试错的机会,能改正就好。在总体方案的变化下,从解决碰到的问题,要简单的优化,多线程,redis使用,都有了直观的了解和认识(为什么要用,什么时候要用,为什么一开始不考虑?),多几行代码,速度瞬间提升。。。
解决问题的方法比问题要多,思路决定出路,用简单的方法解决问题就OK!
快速发现问题并能有解决方案是很重要的一个方面。
方案整体代码不能提供,不过从百度拔的一些公共代码都在上面了,以及前面一篇文章中有介绍。其他都是细节问题,主要是这个方案过程比较曲折一点点。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
C#.NET、Power BI、数据挖掘的更多相关文章
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- Power BI FAQ
关于Power BI,最近一直想写点什么,但是也想不到写什么.直到前几天,有个朋友在qq加我,问了我好几个问题,我发现都是一些很有代表性的问题,所以都记录了下来,特意整理了一下分享出来,希望能帮到更多 ...
- 第一篇:Power BI数据可视化概述
前言 "可视化之工具,可爱者甚蕃.统计学家独爱R,自Python来,世人盛爱matplotlib.余独爱Power BI之出微软而不染(免费),濯Office而不妖(够精简).......& ...
- Microsoft Power BI Desktop概念学习系列之Microsoft Power BI Desktop是什么?
不多说,直接上干货! 官网 https://powerbi.microsoft.com/zh-cn/desktop/ Microsoft Power BI Desktop是什么? https://p ...
- C#.NET开源项目、机器学习、Power BI (转载)
.NET技术, 开源项目, 数据挖掘, 机器学习, 微软Power BI, 足球赛事分析, Matlab与C#编程 博客园 管理 本站首页 头条推荐 Power BI .NET开源 机器学习 博客美化 ...
- Power BI成功的背后
Power BI成功的背后 魔力象限 又是一年Gartner数据分析与BI魔力象限报告的发布,Power BI毫无悬念的第一,并且拉开与其他产品的差距越来越大.在Power BI dataflows( ...
- 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
- 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题
千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...
- 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验
Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...
- Power BI官方视频(3) Power BI Desktop 8月份更新功能概述
Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...
随机推荐
- 多module project修改module名称
1.mvn clean 2.project 去掉这个module 3.全局替换所有pom.xml文件的老module名为新module名 4.修改源代码文件夹目录名为新的module名 5.proje ...
- Android图片优化指南
图片作为内存消耗大户,一直是开发人员尝试优化的重点对象.Bitmap的内存从3.0以前的位于native,到后来改成jvm,再到8.0又改回到native.fresco花费很多精力在5.0系统之前把B ...
- python安装报错error writing to file:......
今天换了win10 64电脑,安装python3.6.8时,报错:error writing to file:...... 安装时,右键--以管理员身份运行,安装成功.
- es之对文档进行更新操作
5.7.1:更新整个文档 ES中并不存在所谓的更新操作,而是用新文档替换旧文档: 在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引.旧版本文档不会立即消失 ,但 ...
- 第十周java学习总结
目录 第十周java学习总结 学习内容 代码上传截图 代码链接 第十周java学习总结 学习内容 第12章 Java多线程机制 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 ...
- React Native商城项目实战02 - 主要框架部分(tabBar)
1.安装插件,cd到项目根目录下执行: $ npm i react-native-tab-navigator --save 2.主框架文件Main.js /** * 主页面 */ import Rea ...
- 修改web项目发布路径
Eclipse中用Tomcat发布的Web项目,更改其部署路径 我的Eclipse的工作目录是D:/workspace先配置Tomcat 选择你的tomcat版本 点击next 这里先不要把项目添加进 ...
- EMQ插件通过HTTP连接认证服务器实现认证
需求 在EMQ中添加认证插件,将到来的MQTT连接的ClientID.UserName.Password通过HTTP协议发送到认证服务器,用返回的数据决定是否允许该连接: 在连接时和断开时向服务器发送 ...
- 在JavaScript中引用类型和值类型的区别
一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...
- Linux_系统时间管理
目录 目录 时间管理 date指令 系统时间设置timedatectl指令 本地时间同步 时间服务器NTP RHEL6 RHEL7 计划任务 一次性计划任务 at指令 限制用户建立一次性计划任务 周期 ...