文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么利用python爬取城市公交站点

2023-06-22 01:00

关注

本篇内容介绍了“怎么利用python爬取城市公交站点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

页面分析

https://guiyang.8684.cn/line1

怎么利用python爬取城市公交站点

怎么利用python爬取城市公交站点

爬虫

我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据。得到我们的公交站点以后,我们利用高德api来获取站点的经纬度坐标,利用pandas解析json文件。接下来开干,我推荐使用面向对象的方法来写代码。

import requestsimport jsonfrom bs4 import BeautifulSoupimport pandas as pdclass bus_stop: ## 定义一个类,用来获取每趟公交的站点名称和经纬度 def __init__(self): self.url = 'https://guiyang.8684.cn/line{}' self.starnum = [] for start_num in range(1, 17): self.starnum.append(start_num) self.payload = {} self.headers = { 'Cookie': 'JSESSIONID=48304F9E8D55A9F2F8ACC14B7EC5A02D'} ## 调用高德api获取公交线路的经纬度 ### 这个key大家可以自己去申请 def get_location(self, 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) dicts = rt['buslines'][0] # 返回df对象 df = pd.DataFrame.from_dict([dicts]) return df ## 获取每趟公交的站点名称 def get_line(self): for start in self.starnum: start = str(start) # 构造url url = self.url.format(start) res = requests.request( "GET", url, headers=self.headers, data=self.payload) 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标签下的公交线路  lines.append(line) return linesif __name__ == '__main__': bus_stop = bus_stop() stop_df = pd.DataFrame([]) lines = [] bus_stop.get_line() # 输出路线 print('一共有{}条公交路线'.format(len(lines))) print(lines) # 异常处理 error_lines = [] for line in lines: try: df = bus_stop.get_location(line) stop_df = pd.concat([stop_df, df], axis=0) except: error_lines.append(line) # 输出异常的路线  print('异常路线有{}条公交路线'.format(len(error_lines)))  print(error_lines) # 输出文件大小  print(stop_df.shape) stop_df.to_csv('bus_stop.csv', encoding='gbk', index=False)

怎么利用python爬取城市公交站点

数据清洗

我们先来看效果,我需要对busstops列进行清洗。我们的总体思路,分列->逆透视->分列。我会接受两种方法,一是Excel PQ,二是python。

怎么利用python爬取城市公交站点

怎么利用python爬取城市公交站点

Excel PQ 数据清洗

这一方法完全利用PQ,纯界面操作,问题不大,所以我们看看流程就可以了,核心步骤就是和上面一样的。

怎么利用python爬取城市公交站点

python数据清洗

## 我们需要处理的busstops列和ID列data = stop_df[['id','busstops']]data.head()

怎么利用python爬取城市公交站点

## 字典或者列表分列df_pol = data.copy()### 设置索引列df_pol.set_index('id',inplace=True)df_pol.head()

怎么利用python爬取城市公交站点

## 逆透视### 释放索引df_pol.reset_index(inplace=True)### 逆透视操作df_pol_ps = df_pol.melt(id_vars=['id'], value_name='busstops')df_pol_ps.head()

怎么利用python爬取城市公交站点

## 删除空行df_pol_ps.dropna(inplace=True,axis=0)df_pol_ps.shape

怎么利用python爬取城市公交站点

## 分列### 设置line_iddf_parse['line_id'] = df_pol_ps['id']df_parse = df_pol_ps['busstops'].apply(pd.Series)df_parse

怎么利用python爬取城市公交站点

我这里补充一下,我们一般还要对location列进行分列,把Long,lat分列出来,但是我们这里就不做了,都是重复劳动,而且我用的pq清洗,快很多。

## 写入文件df_parse.to_excel('贵阳市公交站点分布.xlsx', index=False)</pre>

QGIS坐标纠偏

QGIS基础操作,我就不说了,顺便说一下QGIS对csv格式支持较好,我推荐我们导入QGIS的文件为csv格式的文件。

导入csv文件

怎么利用python爬取城市公交站点

坐标纠偏

以前说了很多,我们高德地图上的坐标是GCJ02坐标,我们需要转成WGS 1984坐标,我们在QGIS里面需要借助GeoHey插件。

怎么利用python爬取城市公交站点

怎么利用python爬取城市公交站点

“怎么利用python爬取城市公交站点”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯