https://guiyang.8684.cn/line1
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出西固免費(fèi)做網(wǎng)站回饋大家。
我們利用requests請(qǐng)求,利用BeautifulSoup來(lái)解析,獲取我們的站點(diǎn)數(shù)據(jù)。得到我們的公交站點(diǎn)以后,我們利用高德api來(lái)獲取站點(diǎn)的經(jīng)緯度坐標(biāo),利用pandas解析json文件。接下來(lái)開(kāi)干,我推薦使用面向?qū)ο蟮姆椒▉?lái)寫(xiě)代碼。
import requests
import json
from bs4 import BeautifulSoup
import pandas as pd
?
?
class bus_stop:
## 定義一個(gè)類,用來(lái)獲取每趟公交的站點(diǎn)名稱和經(jīng)緯度
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=F9E8D55A9F2F8ACC14B7EC5A02D'}
## 調(diào)用高德api獲取公交線路的經(jīng)緯度
### 這個(gè)key大家可以自己去申請(qǐng)
def get_location(self, line):
url_api = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=559bdffe35eec8c8f4daed705c&output=json&city=貴陽(yáng)&offset=2&keywords={}&platform=JS'.format(
line)
res = requests.get(url_api).text
# print(res) 可以用于檢驗(yàn)傳回的信息里面是否有自己需要的數(shù)據(jù)
rt = json.loads(res)
dicts = rt['buslines'][0]
# 返回df對(duì)象
df = pd.DataFrame.from_dict([dicts])
return df
## 獲取每趟公交的站點(diǎn)名稱
def get_line(self):
for start in self.starnum:
start = str(start)
# 構(gòu)造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標(biāo)簽下的公交線路
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)
我們先來(lái)看效果,我需要對(duì)busstops列進(jìn)行清洗。我們的總體思路,分列->逆透視->分列。我會(huì)接受兩種方法,一是Excel PQ,二是python。
這一方法完全利用PQ,純界面操作,問(wèn)題不大,所以我們看看流程就可以了,核心步驟就是和上面一樣的。
## 我們需要處理的busstops列和ID列
data = stop_df[['id','busstops']]
data.head()
## 字典或者列表分列
df_pol = data.copy()
### 設(shè)置索引列
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
## 分列
### 設(shè)置line_id
df_parse['line_id'] = df_pol_ps['id']
df_parse = df_pol_ps['busstops'].apply(pd.Series)
df_parse
我這里補(bǔ)充一下,我們一般還要對(duì)location列進(jìn)行分列,把Long,lat分列出來(lái),但是我們這里就不做了,都是重復(fù)勞動(dòng),而且我用的pq清洗,快很多。
## 寫(xiě)入文件
df_parse.to_excel('貴陽(yáng)市公交站點(diǎn)分布.xlsx', index=False)
QGIS基礎(chǔ)操作,我就不說(shuō)了,順便說(shuō)一下QGIS對(duì)csv格式支持較好,我推薦我們導(dǎo)入QGIS的文件為csv格式的文件。
以前說(shuō)了很多,我們高德地圖上的坐標(biāo)是GCJ02坐標(biāo),我們需要轉(zhuǎn)成WGS 1984坐標(biāo),我們?cè)赒GIS里面需要借助GeoHey插件。
看一下這個(gè)坐標(biāo)糾偏,區(qū)別還是很大。
總的來(lái)說(shuō),我們還是推薦使用使用面向?qū)ο蟮姆椒▉?lái)寫(xiě)代碼,還有就是異常處理必不可少。我這次面對(duì)的問(wèn)題是某些公交路線,高德API里面沒(méi)有,這樣就會(huì)異常,所以這次的異常處理不可缺少。從數(shù)據(jù)處理的角度來(lái)看,這次從速度和方便來(lái)說(shuō),pq完勝python,我推薦大家數(shù)據(jù)清洗就用pq,有些時(shí)候,我都會(huì)給出多種處理方法,pq看起來(lái)復(fù)雜,但是其實(shí)pq是最簡(jiǎn)單的,總之,我高度推薦pq進(jìn)行數(shù)據(jù)清洗。還有一點(diǎn),python里面的索引比較麻煩,這次我要保證和bus_stop_id和line_id,這樣公交站點(diǎn)表和公交路線表才可以連接,其實(shí)這就是SQL里面的外鍵連接,所以我在python數(shù)據(jù)清洗的時(shí)候,涉及到大量的索引操作,在pq里面沒(méi)有這么復(fù)雜。說(shuō)到這個(gè)索引,感謝我的SQL老師,當(dāng)年她講解SQL里面的索引,約束,仿佛就在昨天。高德的這個(gè)key大家可以自己去申請(qǐng),這個(gè)key可能有數(shù)量的限制。我接下來(lái)會(huì)把代碼上傳到Gitee,這個(gè)代碼的管理還是很重要的,自己也學(xué)習(xí)一下代碼的管理。接下來(lái),感謝小學(xué)妹給的這個(gè)小項(xiàng)目,也感謝崔工對(duì)我的鼓勵(lì),其實(shí),我最近很忙,不太想寫(xiě)文章的。最后,感謝認(rèn)識(shí)的一個(gè)小學(xué)妹,她真的蠻優(yōu)秀的,最后希望大家2021年最后這一個(gè)月萬(wàn)事如意,開(kāi)開(kāi)心心,也希望我們都有一個(gè)光明的未來(lái)。還有一個(gè)坑,我建議大家在簡(jiǎn)書(shū)上寫(xiě)文章,真的本地的話,圖片上傳有問(wèn)題。