zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    .net 用户控件ascx.cs注册js脚本代码无效果
    Sql-exec
    C# 复制指定节点的所有子孙节点到新建的节点下
    C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录
    svn 命令
    C语言运算符优先级
    两级宏&&字符串化宏
    [C++]#if !defined 的作用
    四面体ply格式文件图和数据对应关系分析
    PLY格式介绍
  • 原文地址:https://www.cnblogs.com/dabaopku/p/2235209.html
Copyright © 2011-2022 走看看