再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入

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

快速发现问题并能有解决方案是很重要的一个方面。

  方案整体代码不能提供,不过从百度拔的一些公共代码都在上面了,以及前面一篇文章中有介绍。其他都是细节问题,主要是这个方案过程比较曲折一点点。

时间: 2024-10-23 02:17:07

再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入的相关文章

Another Look at Events(再谈Events)

转载:http://www.qtcn.org/bbs/simple/?t31383.html Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文章的翻译版,但是感觉部分地方翻译的比较粗糙,不是很明确.索性重新翻译了一遍,并引用了原翻译版的一段译注.以下都是用自己能理解的方式来翻译的,由于水平有限,有很多不足的地方,希望大家指正. Another Look at Events (再谈Event

一个菜鸟程序员--再谈六月坚持英语学习

有时候想想,这人生就是一个又一个车站,走到一个站点,累了,歇一歇,明天还得继续出发,而一路上,也会遇到不同的人来陪我们一起走,大家或陌生,或熟悉,总会给我们孤独的心里一种温暖的陪伴.一个人的路,走的再坚强,再执着,也会感到寂寞,疲惫,无助.同行的人一个善意的微笑,一声热情的问候,一个关注的眼神,一句温馨的话语,都会让我们心中泛起阵阵暖意,心存感激. 英语的学习就是这样一种感觉,每当英语学习感到有些疲倦了看着为知笔记上大家的分享每天的学习内容,发现不是一个人在战斗,于是瞬间满血复活,继续投入到英语

再谈如何学习Linux,一线Linux专家学习经验谈

记得最早接触linux是在2000年,那个时候,还在上大学,一个同学从荷兰回来,带回来了一个Linux的拷贝版,记得版本还是Redhat6.2.曾经为安装一个系统让我们忘记疲劳,挑灯夜战,不亦乐乎.那时Linux的学习资料还很少,能够学习的书籍也不多,网上Linux技术社区也很少,就凭着Redhat6.2自带的几页使用说明开始了学习linux的生涯. 转眼间,10几年过去了,我也与Linux相伴了10多年,10年间,随着虚拟化.云计算时代的来临,Linux迅猛发展,在服务器领域已经占据半壁江山,

浅谈:SEO拼的就是高质量的原创文章

说来说去都是这个话题SEO.那么怎样能把SEO给做好呢,邵连虎信任许多兄弟都想晓得的.咱们为了把SEO学好,拼命的学习,实习.但是,有些SEO我感觉我现已做的够好了,为何网站即是没有作用呢.录入不多,关键字排行低.假如咱们换个方位思考一下的话,你就会理解啥才是真实的SEO. 换个思想思考啥是SEO 比如邵连虎搏客这个网站.我站在站长的方位思考SEO的话即是想尽一切办法度录入,让关键字排行让升.每天不断的发外链,不断的做伪自创.没事啰嗦一些自个烦躁的心里.假如我站在用户的方位上看到这样的网站文章都

再谈:为什么开源C/C++开源框架极昂贵?

今天读了一篇文章:<腾讯前员工创业笔记:那些跟钱有关的事儿>(http://tech.163.com/14/0515/08/9S9975C5000915BF.html),摘录两段: 刚开工的时候买办公电脑,我心想创业公司应该省钱,就把机箱CPU硬盘内存显卡买来自己装.虽然"科班出身,基本功扎实",但因为缺乏经验,装一台机器要花费足足半天时间.于是我上网百度了一番,发现选择上门装机服务,装一台要100块,装好了送过来要花50块.如果我用这半天时间做点产品设计,亦或写几行代码,

Unity教程之再谈Unity中的优化技术

这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点处理“一项.这里的几何体就是指组成场景中对象的网格结构. 3D游戏制作都由模型制作开始.而在建模时,有一条我们需要记住:尽可能减少模型中三角形的数目,一些对于模型没有影响.或是肉眼非常难察觉到区别的顶点都要尽可能去掉.例如在下面左图中,正方体内部很多顶点都是不需要的,而把这个模型导入到Unity里就会是

再谈消息队列技术

上周,我们举办了第二届技术沙龙,我这边主要演讲了消息队列技术的议题,现分享给大家: 在我们团队内部,随着消息应用中心(任务中心)的广泛应用,有时候我们感觉不到消息队列的存在,但这不影响消息队列在高可用.分布式.高并发架构下的核心地位. 消息队列都应用到了哪些实际的应用场景中? 一.再谈消息队列的应用场景 异步处理:例如短信通知.终端状态推送.App推送.用户注册等 数据同步:业务数据推送同步 重试补偿:记账失败重试 系统解耦:通讯上下行.终端异常监控.分布式事件中心 流量消峰:秒杀场景下的下单处

GoF设计模式三作者15年后再谈模式

Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85,000 iPhone的小应用遍布全球,使用PHP就能够写一个简单的"Hello, World! The time is X"Web网页,那么,面向对象设计是难的,这句话是否还正确呢? Richard Helm: 软件设计总是很难的,尽管大多数现代开发环境已经降低了复杂性,通过重用库和工具

APP创业西游记:做到这五点,再谈取真经

近几年来,无数创业者相继涌入APP开发领域.然而残酷的现实却是大量的APP还未研发上线便胎死腹中,有些出生即死亡,更多的虽然仍在应用市场上,却早已无人问津.APP涌现的死亡潮让开发们的创业之路堪比八十一难西行,得真经者屈指可数,在大成者的背后,究竟是什么帮助他们翻难越阻?笔者所在的公司与大量的APP创业者进行过合作,通过与他们交流后,初有拙见,望抛出与各位一起讨论. “唐僧西行坚定不移”,创业之途不可动摇 作为创业发起人的你,不一定必须要拥有多么雄厚的资产基础或是人脉资源(实际就笔者看来,大部分