You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Selenium爬取的两地驾车时长存入元组列表?

问题

我正在编写基于Selenium的爬虫程序,用于爬取房产网站的价格、位置、土地等数据,后续将导入谷歌表格,目前已将各类数据存入独立列表。现在需要遍历小镇名称列表,调用已创建的地图数据类方法,计算每个小镇与Ljubljana、Maribor两大城市的驾车时长,并将结果存入形如all_distance_data = [[52min, 34min], [65min, 57min]...]的元组列表(每个元组对应一个小镇,第一个元素为到Ljubljana的时长,第二个为到Maribor的时长)。我已写出部分代码,但不知道如何保存数据,现寻求解决方案。

现有代码

MAPS = "https://www.google.com/maps/"
CAPITALS = ["Ljubljana", "Maribor"]
SMALL_TOWNS_EXAMPLE = ["Celje", "Kranj", "Bled"]

....
    def get_map_info(self, city):
        self.driver.find_element(By.XPATH, '//*[@id="searchboxinput"]').send_keys(city)
        self.driver.find_element(By.XPATH, '//*[@id="searchboxinput"]').send_keys(Keys.ENTER)
        sleep(3)
        self.driver.find_element(By.XPATH, '//*[@id="QA0Szd"]/div/div/div[1]/div[2]/div/div[1]/div/div/div[4]/div[1]/button/span/img').click()
        sleep(2)
        for capital in CAPITALS:
            self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').clear()
            self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').send_keys(capital)
            self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').send_keys(Keys.ENTER)
            sleep(3)
            total_time = self.driver.find_element(By.XPATH, '//*[@id="section-directions-trip-0"]/div[1]/div[1]/div[1]/div[1]/span[1]')
解决方案

步骤1:修改get_map_info方法,返回单个小镇的时长元组

在方法内部临时存储当前小镇到两个城市的时长,循环结束后返回元组:

def get_map_info(self, city):
    self.driver.find_element(By.XPATH, '//*[@id="searchboxinput"]').send_keys(city)
    self.driver.find_element(By.XPATH, '//*[@id="searchboxinput"]').send_keys(Keys.ENTER)
    sleep(3)
    # 点击路线按钮
    self.driver.find_element(By.XPATH, '//*[@id="QA0Szd"]/div/div/div[1]/div[2]/div/div[1]/div/div/div[4]/div[1]/button/span/img').click()
    sleep(2)
    
    town_times = []  # 存储当前小镇到两个首都的时长
    for capital in CAPITALS:
        self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').clear()
        self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').send_keys(capital)
        self.driver.find_element(By.XPATH, '//*[@id="sb_ifc51"]/input').send_keys(Keys.ENTER)
        sleep(3)
        # 获取时长文本(必须加.text才能拿到实际内容)
        total_time = self.driver.find_element(By.XPATH, '//*[@id="section-directions-trip-0"]/div[1]/div[1]/div[1]/div[1]/span[1]').text
        town_times.append(total_time)
    
    return tuple(town_times)  # 返回元组,匹配需求格式

步骤2:遍历小镇列表,收集所有结果

在主逻辑中初始化存储列表,循环调用方法并将结果存入:

all_distance_data = []
# 替换成你实际的地图类实例化代码
map_scraper = 你的地图数据类()

for town in SMALL_TOWNS_EXAMPLE:
    time_tuple = map_scraper.get_map_info(town)
    all_distance_data.append(time_tuple)

# 最终all_distance_data就是目标格式:[(到Ljubljana时长, 到Maribor时长), ...]
print(all_distance_data)

额外优化建议

  • 用Selenium的WebDriverWait显式等待替代sleep,避免页面加载慢导致的元素定位失败
  • 给元素定位代码加上try-except异常捕获,防止单个小镇爬取失败中断整个程序

内容的提问来源于stack exchange,提问作者Pavle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:23:13