利用Python爬取8684公交路线查询网站中全国公交站点信息

利用python语言结合requests、BeautifulSoup等类库爬取https://api.8684.cn/v3/api.php?do=citys&act=province对应接口中所有城市公交路线信息以及公交站点信息。

import time
import requests
import json, re
from bs4 import BeautifulSoup# 定义一个函数,传入线路名称相当于在高德地图搜索,来获取每趟公交的站点名称和经纬度
def get_city():""":rtype: object"""city_url = 'https://api.8684.cn/v3/api.php?do=citys&act=province'city_data = requests.get(city_url).textprint(city_data)city_res = json.loads(city_data)# print(city_res['stations'])for province in range(0, len(city_res['stations'])):for city in range(0, len(city_res['stations'][province]['childs'])):# print(city_res['stations'][province]['childs'][city])city_py = city_res['stations'][province]['childs'][city]['e']city_name = city_res['stations'][province]['childs'][city]['c']if city_name in ('广州'):for k in range(1, 200):url = 'https://{}.8684.cn/line{}'.format(city_py, k)  # 今天就只先演示获取一种线路类型下所有公交的信息,要想拿到整个城市的,其实就加个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')if div is not None:lists = div.find_all('a')for item in lists:lines = item.text  # 获取a标签下的公交线路line = re.split(r' |\(', lines)[0]print(lines, "++++++++++++++++++++++++++++++++++",line )res_dir = 'E:\全国公交站点信息数据\\'url_api = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=“替换高德创作平台个人Key”&output=json&city={}&offset=2&keywords={}&platform=JS'.format(city_name, line)while requests.get(url_api).status_code != 200:print(url_api)res = requests.get(url_api).texttime.sleep(2)# print(res) #可以用于检验传回的信息里面是否有自己需要的数据rt = json.loads(res)if 'buslines' in rt:if len(rt['buslines']) >= 1:for i in range(0, len(rt['buslines'])):line_id = rt['buslines'][i]['id']line_type = rt['buslines'][i]['type']line_name = rt['buslines'][i]['name']polyline = rt['buslines'][i]['polyline']city_code = rt['buslines'][i]['citycode']start_stop = rt['buslines'][i]['start_stop']end_stop = rt['buslines'][i]['end_stop']start_time = rt['buslines'][i]['start_time']end_time = rt['buslines'][i]['end_time']status = rt['buslines'][i]['status']company = rt['buslines'][i]['company']info = (str(line_id) + '\u0001' + str(line_type) + '\u0001' + str(line_name) + '\u0001' +str(polyline) + '\u0001' + str(city_code) + '\u0001' + str(start_stop) + '\u0001' +str(end_stop) + '\u0001' + str(start_time) + '\u0001' + str(end_time) + '\u0001'+ str(status) + '\u0001' + str(company))print(info)output_dir = res_dir + str(city_name) + '公交导航信息数据.txt'with open(output_dir, 'a', encoding="utf-8") as file:file.write(info + "\n")stop = rt['buslines'][i]['busstops']for j in range(len(stop)):station_id = stop[j]['id']station = stop[j]['name']location = stop[j]['location']sequence = stop[j]['sequence']info_ = (str(station_id) + '\u0001' + str(line) + '\u0001' + str(station) + '\u0001' +str(location) + '\u0001' + str(sequence))print(info_)output_dir = res_dir + str(city_name) + '公交站点信息数据.txt'with open(output_dir, 'a', encoding="utf-8") as file:file.write(info_ + "\n")j += 1else:passelse:passelse:print(url_api)res = requests.get(url_api).texttime.sleep(2)# print(res) #可以用于检验传回的信息里面是否有自己需要的数据rt = json.loads(res)if 'buslines' in rt:if len(rt['buslines']) >= 1:for i in range(0, len(rt['buslines'])):line_id = rt['buslines'][i]['id']line_type = rt['buslines'][i]['type']line_name = rt['buslines'][i]['name']polyline = rt['buslines'][i]['polyline']city_code = rt['buslines'][i]['citycode']start_stop = rt['buslines'][i]['start_stop']end_stop = rt['buslines'][i]['end_stop']start_time = rt['buslines'][i]['start_time']end_time = rt['buslines'][i]['end_time']status = rt['buslines'][i]['status']company = rt['buslines'][i]['company']info = (str(line_id) + '\u0001' + str(line_type) + '\u0001' + str(line_name) + '\u0001' +str(polyline) + '\u0001' + str(city_code) + '\u0001' + str(start_stop) + '\u0001' +str(end_stop) + '\u0001' + str(start_time) + '\u0001' + str(end_time) + '\u0001'+ str(status) + '\u0001' + str(company))print(info)output_dir = res_dir + str(city_name) + '公交导航信息数据.txt'with open(output_dir, 'a', encoding="utf-8") as file:file.write(info + "\n")stop = rt['buslines'][i]['busstops']for j in range(len(stop)):station_id = stop[j]['id']station = stop[j]['name']location = stop[j]['location']sequence = stop[j]['sequence']info_ = (str(station_id) + '\u0001' + str(line) + '\u0001' + str(station) + '\u0001' +str(location) + '\u0001' + str(sequence))print(info_)output_dir = res_dir + str(city_name) + '公交站点信息数据.txt'with open(output_dir, 'a', encoding="utf-8") as file:file.write(info_ + "\n")j += 1else:passelse:passelse:passelse:passif __name__ == '__main__':result = get_city()

在结合文件写入等操作将采集到的站点信息以及导航信息保存至对应城市的文件中

数据样例展示, 分隔符为

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“祖传代码“的是是非非

程序员眼中的“祖传代码”,就像一本古老而神秘的魔法书,藏着无穷的智慧和技巧,有些代码像家传宝贝,有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 祖传代码的历史与文化价值 祖传代码通常指的是经过长时间使用和传承的代…

【DUSt3R】2张图2秒钟3D重建

【DUSt3R】2张图2秒钟3D重建 1. DUSt3R是一种用于稠密和无约束立体三维重建的方法,其实现步骤如下:2. 实际运行效果3. 运行结果4. 自问自答4.1 为社么这里要是使用transform模型呢?4.2 CroCo(通过跨视图完成3D视觉任务的自我监督预训练的一个研究)在DUSt3R的作用是什么,为…

打家劫舍(java版)

📑前言 本文主要是【动态规划】——打家劫舍(java版)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一…

17 easy 290. 单词规律

//给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 // // 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 // // // // 示例1: // // //输入: patte…

一款不错的多端SSH工具:Xterminal

1、不仅是强大的SSH工具,更提供本地控制台,以及更多即将推出的开发相关功能,让您专注于创造卓越的代码 2、AI赋能,智能命令提示,为大脑解压 AI解答,让你的疑问得到即时解答 AI智能提示,让每一…

CodeFlying 和 aixcoder两大免费软开平台,孰强孰弱?

今天为大家带来码上飞CodeFlying和aixcoder两款免费的软件开发平台效果的测评 一、产品介绍 首先简单介绍一下这两个平台 码上飞CodeFlying:码上飞 CodeFlying | AI 智能软件开发平台! 是一款革命性的软件开发平台,它通过将软件工程和大模…

Redis是AP的还是CP的?

redis是一个开源的内存数据库,那么他到底是AP的还是CP的呢? 有人说:单机的是redis是cp的,而集群的redis是ap的? 但是我不这么认为,我觉得redis就是ap的,虽然在单机redis中,因为只有…

Git 基本操作 ⼯作区、暂存区、版本库

创建本地仓库: 创建 Git 本地仓库 要提前说的是,仓库是进行版本控制的⼀个文件目录。我们要想对文件进行版本控制,就必须先创建⼀个仓库出来。 首先touch 一个文件: 初始化仓库: 创建完成后,我们会发现当前…

行列式错题本

《1800》 1 阶数和转置 A是三阶,B是4阶,还有2这个系数 2 怎么啥也不会呀,委屈 行列式的拆分+提取系数 3

uniapp 安装安卓、IOS模拟器并调试

一、安装Android模拟器并调试 1.下载并安装Android Studio。 2.创建简单project。 3.安装模拟器。 完成安卓模拟器的安装。 4.启动模拟器。 5.hbuilderx选择模拟器、运行。 点击刷新按钮后出现模拟器,勾选并运行。 6.调试。 在 HBuilderX 中,项目启…

每天一道leetcode:20.有效的括号(简单;栈的经典题目)

⭐今日份题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑,自动识别开发板端口,选择端口

【Java】查看class文件的jdk编译版本的两种方式

一、使用文本编辑工具EditPlus 使用EditPlus打开该class文件,字符集选择16进制(Hex viewer)。 仅看第一行数据,前面8个字节CA FE BA BE是固定的。 之后4个字节00 00 是次版本。 次版本后面的4个字节00 34 就是jdk版本。 jdk版本…

镜头畸变模型及去畸变的原理

1. OpenCV去畸变undistortPoints原理解析 Opencv中镜头畸变包含了径向畸变和切向畸变,本章节主要阐述镜头畸变模型以及去畸变的原理。 1.1 镜头畸变模型 参考opencv文档 https://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html,opencv…

基于SpringBoot+MYSQL的医护人员排班系统

基于springboot的医护人员排班系统录像 1、 前言介绍 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足,创建了一个计算机管理医护人员…

LSA头部结构简述

LSA(Link State Advertisement)是一种用于路由协议头部结构,用于在网络中传递路由信息。 LSA头部结构包含以下几个字段: 1、LSA类型(LSA Type):指示LSA的类型,不同类型的LSA用于传递…

Rabbitmq消息丢失-消费者消息丢失(二)

说明:消费端在处理消息的过程中出现异常,例如:业务逻辑异常,或者消费者被停机,或者网络断开连接等,以上等情况使消息没有得到正确恰当的处理,也会使消息丢失。 分析:分析就是说明中…

Composer基础使用 SDK包初始化

Composer 的工作原理 我们在使用 Composer 之前我们得了解一下它的实现原理,它主要由三个部分组成:命令行工具、包仓库、代码库: Packagist 它是官方仓库,也就是我们平常说的 Composer 源,它的作用是存储这些包的信息…

参数引入和全局变量引入实现-目标和

LCR 102. 目标和 - 力扣(LeetCode) 分析题意,画出决策树,其他的思路都跟前面讲过的类似: 全局变量引入实现: 全局变量的引入,需要手动处理回溯; class Solution {int ret; //…

从0到1全流程使用 segment-anything

从0到1全流程使用 segment-anything 一、安装 anaconda 一、下载 anaconda 二、以管理员身份运行安装 1、勾选 Just Me 2、统一安装路径(后续 python 等包也安装至此目录) 3、勾选 add to path 然后安装即可。 三、修改 Anaconda 默认路径及默认缓存路径 Anaconda 默认下…