python爬取城市公交线路及公交站点坐标

       现实工作中可能会碰到分析城市交通等方面的需求,这就不仅仅需要获取公交线路和站点的字段属性,更重要的是获取经纬度,便于arcgis上图。所以今天这篇文章就来讲讲怎么获取一个城市的所有的公交线路、公交站点、经纬度信息以及如何生成arcgis中的shp文件。首先明确以下几个问题:

  1. 选取公交信息网站——8684网站
  2. 获取经纬度——通过调用高德地图API
  3. 坐标转换——高德坐标系(又称火星坐标系) to WGS84/国家大地2000 

 一、解析8684网站网页信息

       可以查询公交信息的网站其实也挺多的,像8684、公交查询网、坐车网等等,这里我就用8684了(看起来顺眼一点hhhhhh)。打开8684网站,定义城市(这里默认武汉市),选择【公交】→【线路查询】→【线路分类】,可以看到武汉市有很多类型的线路,先选择一个汉阳线路,可以看到下面有很多路线的公交。

python爬取城市公交线路及公交站点坐标_第1张图片

       老规矩,打开开发人员工具,发现所有的公交线路都存在

里,一个站点名称在一个标签下。那接下的事情就好办了。

python爬取城市公交线路及公交站点坐标_第2张图片

#导入需要的库,模块报错在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是经纬度。

python爬取城市公交线路及公交站点坐标_第3张图片

python爬取城市公交线路及公交站点坐标_第4张图片

       接下来就是调用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)



python爬取城市公交线路及公交站点坐标_第5张图片

       最后没有写入文件,凑合能用就行。这里要注意的是,高德坐标采用的是火星坐标系(是国测局通过特殊算法加密而成的坐标),所以得到的经纬度根据实际需要还要转成WGS84或者国家大地2000坐标系才能用,我这边是转成了2000的。家人们可以自行问度娘,后续我可能也会分享一下我的方法。

三、上图,根据经纬度生成arcgis里的点文件

       完成上述步骤后,在excel中整理好数据,打开arcgis选择添加XY数据即可。

python爬取城市公交线路及公交站点坐标_第6张图片

      这里放一张我昨天做的另一个城市的效果图吧(不想再折腾一遍做武汉的哈哈哈哈)

python爬取城市公交线路及公交站点坐标_第7张图片

       跟我现有的道路网路数据对照了一下,应该是没问题的,但是道路数据现在还处于保密状态,所以我就只展示一下公交站点的数据。第一篇博客就到这里啦,我们下次再见~

你可能感兴趣的:(python爬虫,python,爬虫)