没有试requests,直接上的Selenium。
# 序
有1000多个待查询地物名称,需要批量查询它们的经纬度。本来想找个在线平台批量查询的,但随便找了几个都是拾取百度地图的经纬度,笔者习惯高德地图,且不想把 BD09 转成 GCJ02 ,于是自己写了个使用 Selenium 的微型project来批量拾取这些地物的经纬度。
# 利用可视化界面打开Excel
在Python中利用可视化界面和用户进行交互是比 C# 困难一点的,但也不是完全不能实现。在此处可以利用 tkinter 进行文件选择,并将选择的Excel通过 pandas 读取。
from tkinter import filedialog
selected_file = filedialog.askopenfile()
if selected_file:
# 我把sheetname固定了,图个方便。
excel_df = pandas.read_excel(selected_file.name, sheet_name='Sheet1')
# Web自动化
结合 pandas 的函数,基于 Selenium 进行Web自动化操作,以批量拾取众多地物的经纬度信息。有关Web自动化的具体操作详见此处。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
coord_list = []
# Selenium自动化
chrome_driver_path = 'chromedriver.exe'
chrome_service = Service(executable_path=chrome_driver_path)
chrome_browser = webdriver.Chrome(service=chrome_service)
chrome_browser.get('https://lbs.amap.com/tools/picker')
# 元素定位
input_blank = chrome_browser.find_element(by=By.XPATH, value='//input[@id="txtSearch"]')
search_button = chrome_browser.find_element(by=By.XPATH, value='//a[@title="搜索"]')
copy_blank = chrome_browser.find_element(by=By.XPATH, value='//input[@id="txtCoordinate"]')
for item in excel_df.itertuples():
input_blank.clear()
input_blank.send_keys(str(item[0]))
search_button.click()
print(copy_blank.get_attribute('value'))
coord_list.append(copy_blank.get_attribute('value'))
由于是操作的浏览器进行数据请求,需要给予系统一定渲染的时间,在合适的位置添加等待函数。
# 输出Excel
由于该微型project仅用来批量拾取经纬度,因此输出也显得很简单。使用 pandas 的输出Excel方法便可。
...
import pandas
coord_list = []
...
...
...
output_excel_df = pandas.DataFrame({
'coord_xy': coord_list
})
output_excel_df.to_excel('Data/output_xy.xlsx', index=None)