标签下。那接下的事情就好办了。
#导入需要的库,模块报错在setting里install一般能解决
import requests
import json
from bs4 import BeautifulSoup
url = "https://wuhan.8684.cn/line3" # 今天就只先演示获取一种线路类型下所有公交的信息,要想拿到整个城市的,其实就加个for循环:line1,line2,line3......
# 伪装请求头
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
}
# 通过requests模块模拟get请求
res = requests.get(url=url, headers=headers)
soup = BeautifulSoup(res.text, "lxml")
div = soup.find('div', class_='list clearfix')
lists = div.find_all('a')
for item in lists:
line = item.text #获取a标签下的公交线路
print(line)
上面这段代码得到的结果就是汉阳线路下的公交:309路、309路......
二、调用高德API获取公交站点及经纬度
其实百度也有API,至于我为什么会选择高德的呢,主要是因为之前看到某个博主说百度地图得到的坐标精度和准确度不如高德,加上去年也是用高德API做的课程实习,所以这次还是选择老朋友啦~
使用高德API首先需要在高德开放平台注册并申请一个key,具体操作家人们可以自行问度娘,可能我后面也会写一篇博客专门讲如何到底如何使用高德地图API,毕竟这个东西真的很香!!!
接下来打开高德地图,在武汉市范围内搜索一下306路,同样打开开发者工具,单纯在当前url查找经纬度信息其实是没有的,偶然发现poilnfo?query_type这个json文件下有东西!!打开【预览】分析一下,busline_list是所有搜索的结果,其实一般第一条就是我们需要的信息。继续往下看,第一条里面,stations存放着所有站点的信息,name是站点名称,xy_coords是经纬度。
接下来就是调用API传回需要的数据了,定义一个函数吧,方便后面调用。如果要拿到上面那个poilnfo文件下的东西,好像涉及到异步加载的问题,反正我是没有解决。这里调用API的时候所用字段和前面说的还是有点区别。线路列表是buslines,站点列表是busstops,经纬度是location。
#定义一个函数,传入线路名称相当于在高德地图搜索,来获取每趟公交的站点名称和经纬度
def get_location(line):
url_api = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=559bdffe35eec8c8f4dae959451d705c&output=json&city=武汉&offset=2&keywords={}&platform=JS'.format(
line)
res = requests.get(url_api).text
# print(res)
rt = json.loads(res)
#print(rt)
#print(rt['buslines'])
i = 0
line_name = rt['buslines'][0]['name']
polyline = rt['buslines'][0]['polyline']
info = [line_name, polyline]
print(info)
stop = rt['buslines'][0]['busstops']
for i in range(len(stop)):
station = stop[i]['name']
location = stop[i]['location']
info_ = [line, station, location]
print(info_)
i += 1
定义函数之后,把函数位置提前一点,在第一段代码for循环最后调用这个函数,完整代码和运行效果如下:
import requests
import json
from bs4 import BeautifulSoup
#定义一个函数,传入线路名称相当于在高德地图搜索,来获取每趟公交的站点名称和经纬度
def get_location(line):
url_api = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=559bdffe35eec8c8f4dae959451d705c&output=json&city=武汉&offset=2&keywords={}&platform=JS'.format(
line)
res = requests.get(url_api).text
# print(res) 可以用于检验传回的信息里面是否有自己需要的数据
rt = json.loads(res)
#print(rt)
#print(rt['buslines'])
i = 0
line_name = rt['buslines'][0]['name']
polyline = rt['buslines'][0]['polyline']
info = [line_name, polyline]
print(info)
stop = rt['buslines'][0]['busstops']
for i in range(len(stop)):
station = stop[i]['name']
location = stop[i]['location']
info_ = [line, station, location]
print(info_)
i += 1
url = "https://wuhan.8684.cn/line3" # 今天就只先演示获取一种线路类型下所有公交的信息,要想拿到整个城市的,其实就加个for循环:line1,line2,line3......
# 伪装请求头
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
}
# 通过requests模块模拟get请求
res = requests.get(url=url, headers=headers)
soup = BeautifulSoup(res.text, "lxml")
div = soup.find('div', class_='list clearfix')
lists = div.find_all('a')
for item in lists:
line = item.text #获取a标签下的公交线路
get_location(line)
最后没有写入文件,凑合能用就行。这里要注意的是,高德坐标采用的是火星坐标系(是国测局通过特殊算法加密而成的坐标),所以得到的经纬度根据实际需要还要转成WGS84或者国家大地2000坐标系才能用,我这边是转成了2000的。家人们可以自行问度娘,后续我可能也会分享一下我的方法。
三、上图,根据经纬度生成arcgis里的点文件
完成上述步骤后,在excel中整理好数据,打开arcgis选择添加XY数据即可。
这里放一张我昨天做的另一个城市的效果图吧(不想再折腾一遍做武汉的哈哈哈哈)
跟我现有的道路网路数据对照了一下,应该是没问题的,但是道路数据现在还处于保密状态,所以我就只展示一下公交站点的数据。第一篇博客就到这里啦,我们下次再见~