Skip to content

一个基于openpyxl和selenium实现地铁站坐标半自动查询并保存到excel电子表的小程序。使用百度地图的坐标拾取系统。

Notifications You must be signed in to change notification settings

Sumsky21/Subway-station_Coordinate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 

Repository files navigation

Subway-station_Coordinate

概述

一个基于openpyxl和selenium实现地铁站坐标半自动查询并保存到excel电子表的小程序。使用百度地图的坐标拾取系统。这个python程序基于这样一个特定的场景:一个储存全国各大城市地铁站坐标(经纬度)的数据库需要更新。

需要优化的这个数据库只更新到2017年下半年,它需要为一个程序的用户提供基于位置的推荐服务。对轨道交通稍微有点了解的朋友都知道最近的几年是国内各大城市的地铁系统飞速发展的几年,这么重要的数据库落后了两年多,实在是难以容忍,因此打算把它更新到2020年年初。

那么更新主要做的有两方面工作:

  1. 列出近两年给定城市新开通的地铁线路和站点
  2. 通过一些坐标查询系统(本程序选用百度地图坐标拾取器)来获取经纬度
  3. 把信息按数据库格式集中到电子表内,转换格式,导入数据库

事实上,本程序只完成了上面的第二步。列出新开通站点的工作,是本人凭借对轨道交通的兴趣通过查询百度百科相关词条和地铁族论坛搜集到的。我把这些站点的城市、线路、站名列在了一个excel电子表里。

之后,程序发挥作用的时候就到了。

程序概述

程序通过openpyxl库提供的功能从前述电子表中获取车站和所在城市,利用selenium库提供的webdriver在浏览器打开坐标拾取系统,模拟搜索地铁站。由于目前的坐标拾取无法专门设置为只搜索地铁站,所以在提供的众多相似地点中根据显示文字“途径地铁”来定位属于地铁站的地点(采用xpath表达式在程序中实现)。之后模拟点击复制坐标,利用pyperclip库提取出剪切板中刚复制的内容,通过openpyxl库再将其写入excel表格特定的单元格。

为什么半自动?

这主要基于两点:

  • 一是在整个更新数据库的工作中这个程序只是完成了后半步,前面需要手动将待查询的地铁站收集起来;
  • 二是程序源代码要根据excel电子表中地铁站所在的单元格行列数调整开始处理和结束处理的行列。

开发心得

  • 善用Webdriverwait。 一开始面对可能在元素加载完成前就去定位的冲突,采用手动估算时间进行测试,然而总会有一些站点因为加载缓慢,在执行定位和操作的时候还没在网页上显示出来,这就会导致报错(常见的是无法定位元素和元素不可交互)。后来在这个地方改用webdriverwait,设定为在搜索结果的元素出现在页面上之后,再去定位属于地铁站的地点,这就可以“一站一时间”,一劳永逸的解决了上面所说的问题。
  • 善用try-except。 虽说在上一条改进后,几乎不大可能再在程序中用到这个结构了,但这一点还是有必要的,因为在无法预见代码可能出现错误的时候要有止损的意识,不能让一个站点的偶然错误耽误了后面站点的操作。
  • 通过设计搜索词来规避可能出现的多种情况下的定位,减少代码量。 这一条是说,因为我们是要通过搜索地铁站名,在页面给出的搜索结果中定位地铁站的地点。而各大坐标拾取系统往往有两个问题:
    • 首先不会自动切换城市,如果你搜索了另一个城市的地铁站,它会提示你当前城市没找到,要手动切换城市;
    • 其次是可能在一些情况下地铁站没有出现来结果第一页里面,需要手动换页;

如果按照常规的程序设计上的思路,可能会在这里根据可能的异常情况单独设计定位方案,这样就会分出三种定位方式,其实这样是需要浪费一些时间和精力的。而测试发现,在站名后加“站”字,几乎可以保证地铁站的结果排在前三的位置;而在搜索词中加入地铁站所在城市,则可以使坐标拾取系统自动切换城市。这样一来,只需要在代码中修改向搜索框填充的词,就可以把三种情况最大限度的归于一种,“合三为一”了。针对可能的极端情况,再结合“try-except”单独处理,就可以完美的解决这一问题。

About

一个基于openpyxl和selenium实现地铁站坐标半自动查询并保存到excel电子表的小程序。使用百度地图的坐标拾取系统。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages