jony413

多媒体信息发布、排队叫号、医院分诊、电子班牌

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

针对数据采集的工作已经有一段时间了,最近遇到一些新的问题,并将整个解决思路写下来,以做思路备份。:)

最近因项目需求,需要在google地图上进行抓取上百万条地址数据(根据地址采集地址的地理坐标以便定位到地图上)。

第一阶段:简单程序

写了个简单的采集程序,然后噼里啪啦的爬数据,几分钟后,提示OVER_QUERY_LIMIT了,超出访问量了,后面查了一下发现原来google maps api对每个ip每天调用google地图接口不能超过2500次,照这样计算,100万的数据要采集一年多。这种效率采到金子都没用了。

有解决方法,那就是使用Google Maps API Premier

What is the cost of Google Maps API Premier?

Google Maps API Premier is extremely cost-effective, starting at just $10,000 per year. Pricing is based on the number of map page views for externally facing websites. For internal uses, it is based on page views or number of vehicles being tracked.

并且很多数据都没办法查出来,一查原因,发现只要带“江”字的查询条件一扔过去,比如“江西”,“江苏”等返回都是错误页面,被墙掉了。

第二阶段:解决敏感字

没有找到http代理可以翻 墙,找来一个socks代理服务器,但是通过程序去调用发现找了很久C#通过调用socks代理去爬数据好像很麻烦,不是太成熟。

继续修改程序,通过调用ie,然后由ie通过socks代理去爬数据,成功,可以解决了敏感字问题。但问题是这种socks代理很少,可以翻 墙的代理更少,并且调用不方便。

每天采集2500都成功也没什么意义了。后来又用了GAE,虽说是用google服务器做代理,网上是说是google自己的服务器,没有限制它自己访问地图的次数,一开始挺顺畅,后来还是不行。

第三阶段:采用多代理采集

发现网上提供的国外代理服务器很多,并且都是支持http代理,一下子找了几百个免费代理服务器,也没那个时间去判断哪些可以用哪些不行,因为条件太多了,哈,不管了,而且要放国庆,不能白白浪费了国庆几天的时间,几百个代理都拿来采集,反正那样的话服务器可以不用休息的爬,一天几百个几分钟,怎么爬都不止之前那个2500个了。

于是对原程序继续改造,使支持通过多个代理服务器进行采集,每个代理处理100条数据那样轮询的工作,又噼里啪啦的进行采集。

国庆几天,通过android的remote rdp进行观察,并且也不能浪费掉每天可以通过socks代理几分钟就可以爬2500条数据,有时候夜里睡醒也开来看一下运行得怎么样,几天过去了,100左右万的数据还没跑一半,纠结。采集到有效数据6万左右,还包括上万条是通过那个socks去爬回来的,晕倒。

重新启动进行第二次采集,这次采集的失败率非常大。主要原因是那些代理服务器大多数还是被墙了敏感字。

第四阶段:多线程多代理采集

总结原因,发现通过那些参差不齐的代理服务器运行的效率真不咋的,特别遇到失败的时候还要等待,弄清楚原因就开始改造了,采用多线程多代理服务器进行同步采集。

主要的思路是:每次拿出1000个要查询的地址来循环,最简单的,有多少个代理就跑多少个线程吧,为了防止过密的对代理服务器进行请求以免被拒绝,每个地址找一个有空的线程来处理,每个线程又去找一个有空的代理来采集。

找了几百个代理,执行速度很不错,一天可以跑几次全部数据。

两天下来,爬了差不多10万数据,之后,又开始跑不动了,主要是一些代理拒绝或者失效,大部分代理还是没有翻 墙功能的,因此将那些带有敏感字的地址提交给它们时根本得不到结果,庆幸有小部分代理可以处理到这些问题,但目前来说我不清楚那些可以翻 墙。程序处理的能力越来越差。必须改进了

第五阶段:打破砂锅问到底

思路是:每一个需要查询的地址,按照之前那种算法,通过指派的那个代理去调用google maps api失败了也就失败了,这次改进了,失败了就扔给另一个代理去处理,直到成功或者没有代理可以用为止,并且把成功的代理给记录下来,保证每个地址都尽可能的成功,即使慢一点也无所谓,一两天跑它一遍就够了。

于是又改程序,尽情的采集吧。

程序还可以继续改善,到这里基本就够用了,数据也采集得差不多了,剩下的就是多找一些比较高效率的代理服务器进行轰炸了,哈

posted on 2011-10-13 14:57  jony413  阅读(3796)  评论(1编辑  收藏  举报