大致思路
老师布置的一个实验,需要获取30个景点之间的距离。为了学到新知识,以及让工作过程不至于太枯燥,我选择使用爬虫来自动获取两点之间的距离。
爬取要用到selenium库,这是因为百度地图传送两点之间的距离用到了js,而博主对于js传输信息并不熟悉,另外百度地图用的js非常多,要找到相关的js文件也很难。
这时就体现出selenium库的重要性了。selenium库可以模拟鼠标点击,键入等操作。为了保证爬取的准确性,需要获取元素的xpath。
获取xpath
xpath是什么不懂的可以去百度,这里简单说一下怎么获取xpath。在这里先说一下我用的是Chrome浏览器。
Chrome浏览器中获取xpath最笨的方法就是按f12,找到元素的位置后手动确认xpath。当然还有更简单的方法:Chrome浏览器中有一个插件可以帮忙,叫做xpath helper。火狐浏览器中也有类似的插件。
注意事项
1、有时会出现地址不完全匹配的情况,即输入一个地址后百度地图表示地址不准确,提供若干地址后让你选择一个作为准确地址。解决这个问题需要让搜索的地址尽量准确,另外真的发生这种状况需要进行异常处理。
try:
driver.find_element_by_xpath("/html/body[@class='pc']/div[@id='app']/div[@id='left-panel']/ul[@id='cards-level1']/li[1]/div[@class='RouteAddressOuterBkg']/div[@class='RouteAddressInnerBkg']/div[@id='RouteAddress_DIV1']/div[@class='sel_body']/div[@id='RADIV_BODY1']/div[@id='RADiv_ResItem1']/div[@id='RA_ResItem_1']/table/tbody/tr[1]/td[2]").click()
except:
a = 1
time.sleep(0.5)
try:
driver.find_element_by_xpath("/html/body[@class='pc']/div[@id='app']/div[@id='left-panel']/ul[@id='cards-level1']/li[1]/div[@class='RouteAddressOuterBkg']/div[@class='RouteAddressInnerBkg']/div[@id='RouteAddress_DIV0']/div[@class='sel_body']/div[@id='RADIV_BODY0']/div[@id='RADiv_ResItem0']/div[@id='RA_ResItem_0']/table/tbody/tr[1]/td[2]").click()
except:
a = 1
上面的代码中a=1无意义,只是因为except部分必须要有执行语句,否则会报错。如果大家有更好的方法可以在评论区提出来,感激不尽。
2、有时搜索两点距离会出现bug,这时会显示两点之间没有步行方案。出现这种情况程序会停在那不动,这时就需要进行异常处理:只需要让程序再次点击搜索即可。
try:#超时异常处理
WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.XPATH, "/html/body[@class='pc']/div[@id='app']/div[@id='left-panel']/ul[@id='cards-level1']/li[1]/div[@id='nav_container']/div[@class='route_contentWrapper walk_cont']/div[@id='route_content_walk']/div[@class='special']/div[@