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