如何将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
相关产品推荐
相关产品推荐

