0

    寻根究底:截获器为啥不好使【2018-005】

    2023.07.10 | admin | 135次围观

    硬广)

    【前言:都是废话可以不看】

    嗨~多磨,出差回来赶紧更新一篇。计划没有变化快无法找到网络配适器的驱动程序,眼下急需解决的可能还是软件的运行问题(矢量化操作也会有的,莫慌),原本想给大家提供一个便利的工具,结果遇到运行问题的同学的人数远超预期,虽然从0.3beta到0.5beta三个版本已经通过调整浏览器调用方式、外置可升级的geckodriver等方法简化了环境配置步骤、提高了对新版本Firefox浏览器的支持周期,但从结果上看还不够理想,所以临时加一篇推文尽量集中解答一下。(年终岁尾还更新多敬业啊,众:噫~失踪5个月的账还没算呢)

    每个问题一般包括三个部分:问题阐述,解决办法,错误办法,其中问题阐述如果觉得啰嗦可以跳过。

    【关于系统环境】

    软件在开发过程中使用了3部电脑(2部笔记本,1部台式机)进行测试,系统分别是Windows7 x64、Windows8.1 x64和Windows10 x64,需要注意的是,测试环境均为64位系统,因此目前无法承诺在32位系统上的兼容性,但考虑到调用的Firefox浏览器均为32位,geckodriver又是外置可自行升级的,所以理论上应该还有不少转还的余地才对。

    顺带一提,说明书中的测试环境配置仅供参考,并非最低需求,本软件对于性能要求并不高,对于网速要求倒是有一些,输出结果有缺损的话多数是网速的锅。

    【问题1:没有D盘】

    【问题阐述】先说一个最大的盲点,分区问题。由于近一两年固态硬盘的普及正处于过渡期,512GB及以上的固态还不是很常见(壕另当别论),在256GB固态大行其道的当下,部分电脑——特别是笔记本——可能只有C盘一个分区,本软件的数据输出路径为D盘根目录的BDMCTEMP或MCTEMP文件夹(软件版本不同则路径略有区别),软件运行最初就会检测是否有所需的路径,如果没有文件夹那么软件会自行创建,但如果连D盘都没有,那就肯定闪退了。另外需要注意的是,分区盘符和分区名字并不是一回事儿,不要以为把分区名字改成D就完事儿了。这并不能怪大家电脑知识不足,这些细枝末节确实不太容易分清楚。

    【解决办法】第一种,最简单的办法就是接个U盘或者移动硬盘,接入后如果移动存储设备的盘符不是D盘(比如D盘已被光驱占用,或者以前曾同时接入多个移动存储设备,只有一个被系统记作D盘等情况),那么需要在“我的电脑”图标上点击右键,点击“管理”,在磁盘管理页面修改盘符(图1)(官方称之为更改驱动器号),可以把占用D盘的设备先设置为其他盘符,再把接入的存储设备设置为D盘。

    图1 在计算机管理界面中更改驱动器号

    第二种,创建一个虚拟磁盘(VHD)(图2),在C盘建立一个文件并把它虚拟成一个分区,类似于虚拟光驱(呃,可能也没多少人用过吧,以前很多光盘版的游戏都是用这个玩意儿才能玩的)。这个比较方便,对于固态硬盘的用户也有利于减少读写次数延长硬盘寿命,缺点是重启电脑后可能需要手动挂载该分区(其实也就是一次双击的事儿)。

    图2 在计算机管理界面中创建VHD

    第三种,调整分区,由于分区写入数据一般是从前往后占用空间,所以一些比较聪明的软件可以把后面的空间切出新的分区(如果有数据会在改变分区时将数据移动到靠前的位置),此方法风险较大,我从来没实践过,非电脑达人不要轻易尝试。稳妥的办法是等什么时候想要重装系统了,记得请帮你装机的技术宅分出个D盘就可以了。

    【错误办法】把分区的名字改为D,这个方法没有用,完全不是一回事儿哦。

    【问题2:Firefox版本不合适】

    【问题阐述】由于geckodriver和Firefox浏览器需要搭配使用,而二者却是分开更新和维护的,自然就产生了版本匹配的问题。需要特别说明的是,0.5beta版本的地图截获器采用了无头浏览器(Headless Browser),开发时我用的是PhantomJS,后来发布时为了避免单独配置PhantomJS的麻烦,改用Firefox的无头模式(Headless Mode),该功能需要较高版本的Firefox才能运行。而前两个版本调用Firefox的方式与较高版本Firefox的远程劫持检测存在冲突,所以使用早期的地图截获器时,Firefox的版本又不能太高。

    【解决办法】核对您正在使用的地图截获器说明书,安装说明书中通过测试的那个版本的Firefox,安装时不要勾选后台维护服务(那玩意儿会偷偷更新Firefox),并且安装后请先断开网络,在Firefox的选项中关闭自动更新(现在大家的网速都太快了,打开浏览器没一会儿功夫就下载完更新,所以请安装后断网调整选项)。各版本的Firefox浏览器可以在这里找到:,以Firefox 61.0 x64简体中文版为例,,其他版本可以参考此路径在第一个链接里面找一下(ftp服务的目录结构都是列表方式显示的,不要慌,慢慢找

    )。

    【错误办法】装完对应版本的Firefox就不管了,万一自动更新了,就可能影响运行。(比如刚拿到地图截获器并装好Firefox时,发现第一次可以顺利运行,但之后就不好使了)

    【问题3:Firefox路径配置不当】

    【问题阐述】0.3beta版本的截获器对于Firefox路径要求最高,需要配置系统环境变量中的path参数才可以顺利运行(图3),后两个版本对该环境变量要求似乎不那么严格(这是geckodriver的特性,并不是我写的程序有什么变化),反正0.3beta也没有什么特别的功能,0.4beta和0.5beta基本都是它的超集,能不用0.3beta就尽量不用吧。

    图3 环境变量path中的Firefox浏览器路径

    【解决办法】无论使用哪个版本的地图截获器都应遵守该要求,Firefox应安装在默认路径,形如C:\Program Files (x86)\Mozilla Firefox,有些同学可能不习惯在C盘安装软件,那么在改变安装位置时请只更改盘符而不要更改后续的目录层级,形如D:\Program Files (x86)\Mozilla Firefox。我只在C盘和D盘的默认目录层级下安装并测试通过,其余情况不能保证可以运行。另外,更不要安装到任何带有中文或者特殊字符的路径下,否则更难排查错误原因。

    【错误办法】第一种,配置path参数时需要注意,参数中的路径应该指向Firefox浏览器主程序所在目录,而不应该指向Firefox浏览器主程序本身,正确的路径形如D:\Program Files (x86)\Mozilla Firefox,错误的路径形如D:\Program Files (x86)\Mozilla Firefox\firefox.exe。

    第二种,把说明书的示例路径直接写到了path中,这个写入path的路径应该是你的电脑上安装Firefox的目录,可能与说明书的示例一致,也可能略有区别,例如在32位系统中安装Firefox,则路径形如D:\Program Files\Mozilla Firefox,在64位系统中安装32位的Firefox,则路径形如D:\Program Files (x86)\Mozilla Firefox,在64位系统中安装64位的Firefox,则路径形如D:\Program Files\Mozilla Firefox。

    【问题4:用户名含有中文或特殊字符】

    【问题阐述】用户名影响很多系统文件的路径,在桌面随便新建个文档,右键菜单看属性,位置路径中User之后、Desktop之前的部分就是当前用户的名称(比如我的桌面路径C:\Users\Administrator\Desktop,其中Administrato就是用户名了)。如果在创建新用户时录入的是中文名会导致这一重要路径含有中文,这可能会影响一些系统文件的调用,进而导致软件崩溃。理论上确实可以通过文字编码解决,但一来我不是专业程序员,不太会处理中文编码,二来我自己的用户名都是英文,特意建一个测试用的中文名用户会导致我目前使用的超级管理员账户被隐藏,只好作罢(Win7那台笔记本在爬别的数据,所以也不能拿来做测试),据我观察,恰好存在这个情况的同学比例不高,也就不专门做软件的适配了。

    【解决办法】第一种,新建一个用户名为纯英文的用户(最好连数字都别用,或者至少用户名开头不要用数字,都是些个人经验和颇为玄学的说法,仅供参考啦),切换到该用户再次运行地图截获器,看看是否可以顺利运行。截完图再切回原来的用户就可以了,虽然麻烦,但毕竟地图截获器这玩意儿不是天天用,通过这样折衷的方法至少可以解燃眉之急(5个月啊,5个月还燃眉之急,早就此身为灰,随风乱飞了)。

    第二种,什么时候重装系统的话,登陆首个用户的时候就设置一个全英文的名字,这样做对于保证更多软件可以正常运行很有好处。

    【错误办法】将当前用户名改为纯英文,这种改名只影响表面显示的用户名,实际的用户文件夹路径中仍然是建立用户时候采用的用户名。

    【问题5:需要管理员权限】

    【问题阐述】本软件不涉及C盘的读写,理论上不需要管理员权限(这也是把D盘根目录文件夹作为默认输出路径的主要目的),然而部分电脑的默认用户权限可能还是不够高,特定情况下可能导致软件运行失败。例如把软件放到了C盘或者桌面(桌面也在C盘,考虑到可能有同学不清楚这一点,所以再单独强调一下,并不是我不知道啊

    ),因为软件通过selenium调用Firefox时会生成一个geckodriver.log日志文件,权限不足可能会导致软件崩溃(APP横行的时代大家都叫闪退

    再早些时候叫死机)。

    【解决办法】第一种,不要把软件放在C盘(光秀:敌在C盘寺),也不要把软件放到桌面(因为等同于放C盘)。

    第二种,右键点击本软件,点击“以管理员身份运行”。

    【错误办法】若无其事地将软件解压到桌面,直接双击运行(检验人品的时候到了)。

    【问题6:需要网络通信权限】

    【问题阐述】本软件两个版本中,普通版的设计思路是通过selenium调用浏览器访问html模板并截图,矢量版的设计思路是通过urllib(或urllib2)直接访问瓦片链接并拼接瓦片,前者不需要直接进行网络访问,而后者则有此需要。然而根据实际情况来看,无论哪个版本首次运行软件时都可能会提示“Windows Defender 防火墙已经阻止此应用的部分功能”,并询问允许通信的网络类型(如公共网络、专用网络),更要命的时这个见鬼的窗口标题栏上写的是“Windows安全警报”,不知道的同学还以为软件报毒了,战战兢兢地点了取消或者直接点右上角的X给关掉了,导致软件未能取得必要的访问权限,也可能进而影响正常运行。

    【解决办法】第一种,对于一台从没运行过本软件的电脑,首次运行请静下心、仔细看好弹出的窗口(也有可能是由其他安全管家、杀毒软件之类的弹出提示),勾选专用网络和公共网络两个选项,然后点击确定(图4)(或根据不同安全软件的提示进行操作,总之请对本软件的网络访问予以允许。我不能要求大家不装第三方杀毒软件,但Windows8以上自带的Windows Defender加上良好的上网习惯确实足以回避绝大多数主流病毒)。

    图4 Windows安全警报

    第二种,对于已经运行过本软件且存在运行问题的电脑,通过控制面板找到“Windows防火墙”,找到“允许应用通过防火墙”,点击“更改设置”,找到“地图截获器”或“mapcapturer”等类似字样,把专用和公用两列的复选框勾选上,并点击确定(图5)。

    图5 设置Windows防火墙应用通信权限

    【错误办法】首次运行软件遇到提示框假装没看见,并强行关闭了安全警告提示

    至此,理论上,绝大部分运行问题都可以得到解决,然而对于矢量版(这个行将就木的版本)还有一些操作中的小问题(或者大问题?)需要说明一下。

    【问题7:截取范围异常 for 矢量版】

    【问题阐述】运行软件后,应当先设置好缩放级别,然后查询行列号,再然后运行所需的数字命令。如果查询完行列号,突然觉得缩放级别不合适,回头改了一下缩放级别直接运行数字命令,你…会…发…现…反正输出的图片肯定不是你要的就是了,截取范围指不定飞到哪儿去了。这是因为,不同缩放级别的瓦片行列号也不同,改变了缩放级别而不重新查询、设定行列号的话,截取范围肯定就不对了。理论上同一个位置不同级别的行列号相差2的n次方倍(n为两个缩放级别之间的差值),级别越高,行列号数值越大无法找到网络配适器的驱动程序,反之亦然。普通版虽然不如矢量版效率高,但在工作范围定位上更好一些,普通版则是基于中心点+窗口尺寸确定工作范围的,中心点坐标在不同级别下可以通用,所以两个版本各有利弊吧。

    【解决办法】使用矢量版时请遵循以下操作流程,运行软件→设定缩放级别→查询行列号→设置行列号→执行任意数字命令→重设缩放级别→查询行列号→重设行列号→执行任意数字命令,总之如果需要截取不同级别的内容,那么每次改变缩放级别后务必重新查询行列号。

    【错误办法】先查询行列号,后改变缩放级别……(我是谁?我在哪儿?我要做什么?)

    【问题8:行列号输入异常 for 矢量版】

    【问题阐述】百度地图国外的数据由Here地图提供(诺基亚不仅能造子弹,还会画地图,那么你们什么时候做全面屏手机

    ),所以一些同学想要拼接国外的地图要素,好不容易设定完缩放级别、查询完行列号之后发现,输入带有负号的数字并不能顺利完成设定,总会提示“请输入整数作为行号/列号”。由于最初开发工具时仅在国内范围做了测试,没有考虑到国外行列号为负数的情况,所以,风中残烛的矢量版1.0Beta并不能截取行号、列号为负数的区域的地图要素,非常抱歉。

    【解决办法】换用地图截获器(普通版)0.5Beta(),普通版都是中心坐标定位,所以哪儿都可以用。

    【错误办法】第一种,按说明书中留下的邮箱发送咨询邮件(逐一回复真的忙乎不过来,虽然求助来信算不上多,但精力有限无暇照顾邮箱,现在只能通过发布集中答疑的推文解决问题

    真是不好意思)。

    第二种,按说明书中留下的网址访问网易博客(网易博客已经去见上帝了,虽然按操作转移到了Lofter,但毕竟不方便转发,以后也只会在公众号这边活动)。

    【问题9:矢量折点抓取异常 for 矢量版】

    【问题阐述】百度地图于2017年12月20日召开AIM地图生态大会,之后不久对矢量瓦片服务器进行了升级,矢量瓦片的URL规则发生改变(加密加到亲妈都认不出来),原来编写的功能自然就不好使啦,由于开发时没有考虑到访问失败的情况(IT业更新速度日新月异,这个真的跟不上

    ),结果就是一直反馈建筑物数量为0,实际上是根本没有访问到任何数据(什么?你说是我的小工具引发的服务器更迭?我有这么厉害我怎么不知道

    ,我要真有这么厉害,我还用在这吭吃瘪肚读博士么

    )。然后到了今年上半年,百度地图似乎完成了地图产品的革新,左下角的数据来源也只剩长地万方了(如果对国内各种电子地图的前世今生感兴趣,请移步知乎话题“百度地图、高德地图的数据从哪里得到的?”),新版地图全面进入矢量时代,比起以前的栅格瓦片精细不知道多少倍(前提是你的屏幕像素密度够高,反正我的是不够高,看不出啥区别

    ),同时也加强了对数据的保护(URL加密后已无法判读行列号,也就无法进行拼接,而且瓦片内容也都是���之类的,毫无用处),所以对百度地图矢量数据“图谋不轨”的各位可以洗洗睡了。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论