最近一个项目有需求如下:确定一批地址的具体信息(精确到省市区),有些地址是很模糊的,需要百度搜索。但是数量很大所以如果用百度一个个查会很慢。于是想到利用selenium操纵百度地图,通过自动输入地址和获取搜索结果加上一定的字符串处理就可以批量完成这个任务。
先上代码:
# coding: utf-8
# 作者(@Author): Messimeimei
# 创建时间(@Created_time): 2024/1/15 16:01
""""""
def getAddress(locations: list) -> list:
"""
输入待查询的地址列表,以列表形式返回每个地址在百度地图查询到的第一个地址
:param locations:地址列表
:return:列表形式的地址
"""
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
searched_arr = [] # 保存搜索到的内容
options = webdriver.ChromeOptions()
options.add_argument("-headless") # 不显示浏览器
driver = webdriver.Chrome() # 添加options就不显示,这里没添加
driver.get("https://map.baidu.com/@12713770.095,3547943.7200000007,19z")
print(locations)
for i in range(len(locations)):
time.sleep(3)
driver.find_element(By.ID, "sole-input").send_keys(Keys.CONTROL, "a") # 全选输入框
driver.find_element(By.ID, "sole-input").send_keys(Keys.BACKSPACE) # 删除全选的输入框内容,即上次输入的地址
driver.find_element(By.ID, "sole-input").send_keys(locations[i]) # 输入新的地址
driver.find_element(By.XPATH, '//*[@id="search-button"]').click() # 点击搜索
time.sleep(5) # 等待加载结果
# driver.switch_to.window(driver.current_window_handle) # 切换到最新的句柄
print(driver.current_url) # 查看当前url
driver.get(driver.current_url) # 跳转到当前的搜索结果页面
time.sleep(2)
# 能搜索到的地区用简化替代或者不简化
try:
place = driver.find_element(By.CLASS_NAME, 'poilist').find_element(By.TAG_NAME, 'li').find_element(By.XPATH,
'//*[@id="card-1"]/div/div[1]/ul/li/div[1]/div[3]/div[2]').text
print(place)
# 搜索不到的地区则名称不变
except Exception:
place = locations[i]
print(place)
searched_arr.append(place) # 保存百度地图搜索到的内容
driver.quit()
return searched_arr
print(getAddress(["武汉大学","北京大学"]))
讲解下思路:在打开百度地图url后,因为是循环操作输入地址查找,所以每找完一个地址后需要删掉输入框内的地址,所以循环前都先用“Ctrl + A”加删除。然后输入地址并点击查找。需要注意的是百度地图搜索到的结果页面url会发生变化,所以要跳转到新的url页面中。最后定位到结果所在的元素,提取里面的文字即可。对于没找到的地址则使用原地址名称。