说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章: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、数据挖掘的更多相关文章

  1. 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???

    在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...

  2. Power BI FAQ

    关于Power BI,最近一直想写点什么,但是也想不到写什么.直到前几天,有个朋友在qq加我,问了我好几个问题,我发现都是一些很有代表性的问题,所以都记录了下来,特意整理了一下分享出来,希望能帮到更多 ...

  3. 第一篇:Power BI数据可视化概述

    前言 "可视化之工具,可爱者甚蕃.统计学家独爱R,自Python来,世人盛爱matplotlib.余独爱Power BI之出微软而不染(免费),濯Office而不妖(够精简).......& ...

  4. Microsoft Power BI Desktop概念学习系列之Microsoft Power BI Desktop是什么?

    不多说,直接上干货! 官网 https://powerbi.microsoft.com/zh-cn/desktop/ Microsoft  Power BI Desktop是什么? https://p ...

  5. C#.NET开源项目、机器学习、Power BI (转载)

    .NET技术, 开源项目, 数据挖掘, 机器学习, 微软Power BI, 足球赛事分析, Matlab与C#编程 博客园 管理 本站首页 头条推荐 Power BI .NET开源 机器学习 博客美化 ...

  6. Power BI成功的背后

    Power BI成功的背后 魔力象限 又是一年Gartner数据分析与BI魔力象限报告的发布,Power BI毫无悬念的第一,并且拉开与其他产品的差距越来越大.在Power BI dataflows( ...

  7. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  8. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  9. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  10. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

随机推荐

  1. 多module project修改module名称

    1.mvn clean 2.project 去掉这个module 3.全局替换所有pom.xml文件的老module名为新module名 4.修改源代码文件夹目录名为新的module名 5.proje ...

  2. Android图片优化指南

    图片作为内存消耗大户,一直是开发人员尝试优化的重点对象.Bitmap的内存从3.0以前的位于native,到后来改成jvm,再到8.0又改回到native.fresco花费很多精力在5.0系统之前把B ...

  3. python安装报错error writing to file:......

    今天换了win10 64电脑,安装python3.6.8时,报错:error writing to file:...... 安装时,右键--以管理员身份运行,安装成功.

  4. es之对文档进行更新操作

    5.7.1:更新整个文档 ES中并不存在所谓的更新操作,而是用新文档替换旧文档: 在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引.旧版本文档不会立即消失 ,但 ...

  5. 第十周java学习总结

    目录 第十周java学习总结 学习内容 代码上传截图 代码链接 第十周java学习总结 学习内容 第12章 Java多线程机制 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 ...

  6. React Native商城项目实战02 - 主要框架部分(tabBar)

    1.安装插件,cd到项目根目录下执行: $ npm i react-native-tab-navigator --save 2.主框架文件Main.js /** * 主页面 */ import Rea ...

  7. 修改web项目发布路径

    Eclipse中用Tomcat发布的Web项目,更改其部署路径 我的Eclipse的工作目录是D:/workspace先配置Tomcat 选择你的tomcat版本 点击next 这里先不要把项目添加进 ...

  8. EMQ插件通过HTTP连接认证服务器实现认证

    需求 在EMQ中添加认证插件,将到来的MQTT连接的ClientID.UserName.Password通过HTTP协议发送到认证服务器,用返回的数据决定是否允许该连接: 在连接时和断开时向服务器发送 ...

  9. 在JavaScript中引用类型和值类型的区别

    一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...

  10. Linux_系统时间管理

    目录 目录 时间管理 date指令 系统时间设置timedatectl指令 本地时间同步 时间服务器NTP RHEL6 RHEL7 计划任务 一次性计划任务 at指令 限制用户建立一次性计划任务 周期 ...