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 2011-11-04 01:29  大宝pku  阅读(5015)  评论(16编辑  收藏  举报

导航