google地图大规模下载防屏蔽手段

最近需要大规模下载google地图(需要几十万张图片的规模),该怎么办呢?

 .

首先要有下载程序嘛,工欲善其事,必先利其器

.

c#代码可以很容易的实现

.

void downloadFile(string url,string localPath)
        {
            try
            {
                var request = HttpWebRequest.Create(url);
                request.Headers.Add("cookie", "khcookie=fzwq2qFFXpeBQ3lUygacJVzS8pSXFknR02LwWA; rememberme=true; PREF=ID=092f8e3b732e1bfd:U=10b13387c44535ee:FF=0:LD=en:NW=1:CR=2:TM=1313217539:LM=1319457716:GM=1:IG=4:S=n36T5WxY0Ky8lO3j; HSID=AvfT-czml1Jj1MlTe; APISID=XOphmR9lEnjRRpJN/Alsn0LcocxoR3x9mV; NID=52=KITQ783WQywC29reXSuqSRF4ij5-Lv8T5_4CjB6QRpmGglTa0rA6xPFifJ86DRshBulJdLm8mjlRCYCZ7jG5qqjDiHjtCl17-7SGRNQV-ZZd3LsgcFXzIRPUYqyEtZcc; SID=DQAAALkAAAAB6wVsuiqESra9YBnbPy6yG2P0aamI8yo_37UD0HYC71gWNiqq6x5cDbjQoBSa2dIIZxiZJjElLlvq08yjtdGI1uiIDenhF9CKnOkhC7GJoNR_jCt4gYLufoWX5djLI-VUmjpSZ0byfp91bZ5mm9AY-qMlUmRmnu32Ld5mYkJCd-sAsDpdIXH0gaIAomKbW0p1YTl6vzw9bd_Cx0AoBuVBt_8nIxXuGSn2Tb7usk8afi0T6ADeGZl52ca7w-_1f0Y; GDSESS=ID=09a0ec5363532e8c:TM=1320337601:C=c:IP=****-:S=ADSvE-eKmoE7YIepKdB1lL6v9wdv-qNtUQ");
                var response = request.GetResponse();
                long totalBytes = response.ContentLength;
                //proDownload.Maximum = (int)totalBytes;
                var si = response.GetResponseStream();
                var so = new FileStream(localPath, FileMode.Create);
                long downloadedBytes = 0;
                byte[] buffer = new byte[1024*10];
 
                int readSize;
                do
                {
                    readSize = si.Read(buffer, 0, (int)buffer.Length);
                    downloadedBytes += readSize;
                    so.Write(buffer, 0, readSize);
                    //proDownload.Value = (int)downloadedBytes;
                    //Application.DoEvents();
                } while (readSize>0);
                si.Close();
                so.Close();
            }
            catch (System.Exception ex)
            {
                if (ex.Message.Contains("503"))
                    throw ex;
                if (ex.Message.Contains("404"))
                    return;
                txtStatus.Text += string.Format("{0}",ex.Message);
            }
        }

注意,代码里有一个****的东西,代表了我自己的IP,故给隐掉了,至于那一段有什么用,暂且不表

其他的部分都很好理解,创建一个HttpWebRequest对象,访问图片网址,用10k的buffer来下载,保存到本地

其中有两个比较重要的异常,一个是503,那很不幸,你被屏蔽了;另一个是404,你懂得

.

 那么怎么获得google地图的图片地址呢?google提供给了我们一个静态图片api(http://code.google.com/apis/maps/documentation/staticmaps/),可惜每天的访问限制是1000次,如果要下载20万幅的话,恐怕得等上一年半载的,是可忍孰不可忍?我们必须另觅蹊径.

.

ok,发动我们强大的chrome技能吧!

 打开google map,启动chrome 开发者工具,切换到Resources选项卡,在左边的树形文件夹中找到形如 v=**&x=**&y=**&z=** 的东西,不要急,慢慢翻,随便点开一个看看,呵呵,这不就是我们寻找的玩意嘛~

 

每一个图都是 256*256大小的,图片是通过get方式获取,参数意义很明确,z代表缩放级别,取值范围是2~19, x,y代表这块图在当前级别下在全球范围内的坐标,要下载大宗图片,循环遍历x和y就行了.

 

一切显得是那么顺利,但是google肯定不会让你白白下载. 大概到第25000张左右的时候,google开始发飙了,伟大的503异常横空出世!不给你服务,就是不给你提供服务!

这可如何是好?

 我们用浏览器打开一幅图片对应的网址,原因昭然若揭:小样,要验证码是吧!

 

我们的程序可没有智能到处理验证码的地步,知道原因又能奈何?我们绝望的刷下页面看看,呵呵,google还是too young too simple,smetimes naive!输过一次验证码就可以畅通无阻了,哪像新浪微博这个二逼青年,微博上限一到,条条都要验证码.

.

既然验证通过了,那么我们的程序可以继续了吧,不幸的是,依然在苦逼的503.

.

那么哪里出岔子了呢?肯定是chrome这个小妮子和google在外面偷汉子,非得给她抓个现行不可.

.

 掏出家伙,切换到Network选项卡,刷新一下页面,点击我们的图片,看看它的http head.

呵呵,小样,背地里给google送了这么多甜心!小谷啊,吃不了可要兜着走啊...

.

把这一段加到我们的HttpWebRequest的head里,再次启动程序,呵呵,chrome这小蹄子果然把google迷得神魂颠倒了.ok,回去陪chrome睡觉吧~等着我们的google苦力干活吧.

.

不过,google这小子还是会变心,同样的甜心给他个三四万次他还是会吃腻的,当它再给你503时,让chrome给你重新更新一下甜心就好了.

不出一小时,我们就能够轻松获得5万幅图片,让google这个傻小子哭去吧

 

 

 程序代码:

https://files.cnblogs.com/dabaopku/GoogleMapDownload.rar

 

 

posted on   大宝pku  阅读(5056)  评论(16编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

导航

< 2011年11月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 1 2 3
4 5 6 7 8 9 10
点击右上角即可分享
微信分享提示