本文介绍了“如何用python爬城市公交站”的相关知识。很多人在实际办案过程中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!
页面分析
https://guiyang.8684.cn/line1
爬虫
我们使用请求来解析和获取我们的网站数据,方法是使用美化组。拿到公交站牌后,我们用高德api获取站牌的经纬度坐标,用熊猫分析json文件。接下来,我推荐使用面向对象的方法编写代码。
导入请求
importjson
frombs4importBeautifulSoup
importpandasaspd
classbus_stop:
# #定义一个类来获取站点名称和每辆车的经纬度。
def__init__(self):
self.url=贵阳. 8684.cn/line{} '
self.starnum=[]
forstar _ num range(1,17):
self.starnum.append(start_num)
self.payload={}
self . headers={ 0
cookie ' : ' JSESSIONID=48304 F9 E8 d 55 a9 f2f 8 ACC 14 B7 EC 5a 02d ' }
# #致电高德api获取公交线路的经纬度
# # #每个人都可以自己申请这把钥匙。
defget_location(自身,线路):
URL _ API=' https://restapi . AMAP.com/v3/bus/line name?S=rsv3扩展=all key=559 bdffe 35ee c8c 8 F4 DAE 959451d 705 c输出=JSON城市=贵阳偏移=2关键字={}平台=js '。格式(
行)
res=requests.get(url_api)。文本
#print(res)可用于检查返回的信息是否包含您需要的数据。
rt=json.loads(res)
dicts=rt['总线'][0]
#返回df对象
df=pd。data frame . from _ dict([dict])
返回f
# #获取每个汽车站的名称。
defget_line(self):
forstartisen self . star num :
开始=字符串(开始)
#构建网址
url=self.url.format(开始)
res=requests.request(
' GET ',url,标头=self.headers,数据=self.payload)
soup=美化组(res.text,' lxml ')
div=soup.find('div ',class_='listclearfix ')
list=div . find _ all(' a ')
foriteminlists:
亚麻布
bsp;= item.text # 获取a标签下的公交线路
lines.append(line)
return lines
if __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)
数据清洗
我们先来看效果,我需要对busstops列进行清洗。我们的总体思路,分列->逆透视->分列。我会接受两种方法,一是Excel PQ,二是python。
Excel PQ 数据清洗
这一方法完全利用PQ,纯界面操作,问题不大,所以我们看看流程就可以了,核心步骤就是和上面一样的。
python数据清洗
## 我们需要处理的busstops列和ID列 data = stop_df[['id','busstops']] data.head()
## 字典或者列表分列 df_pol = data.copy() ### 设置索引列 df_pol.set_index('id',inplace=True) df_pol.head()
## 逆透视 ### 释放索引 df_pol.reset_index(inplace=True) ### 逆透视操作 df_pol_ps = df_pol.melt(id_vars=['id'], value_name='busstops') df_pol_ps.head()
## 删除空行 df_pol_ps.dropna(inplace=True,axis=0) df_pol_ps.shape
## 分列 ### 设置line_id df_parse['line_id'] = df_pol_ps['id'] df_parse = df_pol_ps['busstops'].apply(pd.Series) df_parse
我这里补充一下,我们一般还要对location列进行分列,把Long,lat分列出来,但是我们这里就不做了,都是重复劳动,而且我用的pq清洗,快很多。
## 写入文件 df_parse.to_excel('贵阳市公交站点分布.xlsx', index=False)</pre>
QGIS坐标纠偏
QGIS基础操作,我就不说了,顺便说一下QGIS对csv格式支持较好,我推荐我们导入QGIS的文件为csv格式的文件。
导入csv文件
坐标纠偏
以前说了很多,我们高德地图上的坐标是GCJ02坐标,我们需要转成WGS 1984坐标,我们在QGIS里面需要借助GeoHey插件。
“怎么利用python爬取城市公交站点”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/140958.html