利用python爬取城市公交站點(diǎn)
利用python爬取城市公交站點(diǎn)
頁面分析
爬蟲
我們利用requests請求,利用BeautifulSoup來解析,獲取我們的站點(diǎn)數(shù)據(jù)。得到我們的公交站點(diǎn)以后,我們利用高德api來獲取站點(diǎn)的經(jīng)緯度坐標(biāo),利用pandas解析json文件。接下來開干,我推薦使用面向?qū)ο蟮姆椒▉韺懘a。
import requests import json from bs4 import BeautifulSoup import pandas as pd ? ? class bus_stop: ## 定義一個類,用來獲取每趟公交的站點(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=48304F9E8D55A9F2F8ACC14B7EC5A02D'} ## 調(diào)用高德api獲取公交線路的經(jīng)緯度 ### 這個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) 可以用于檢驗(yàn)傳回的信息里面是否有自己需要的數(shù)據(jù) rt = json.loads(res) dicts = rt['buslines'][0] # 返回df對象 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)
數(shù)據(jù)清洗
我們先來看效果,我需要對busstops列進(jìn)行清洗。我們的總體思路,分列->逆透視->分列。我會接受兩種方法,一是Excel PQ,二是python。
Excel PQ 數(shù)據(jù)清洗
這一方法完全利用PQ,純界面操作,問題不大,所以我們看看流程就可以了,核心步驟就是和上面一樣的。
python數(shù)據(jù)清洗
## 我們需要處理的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ǔ)充一下,我們一般還要對location列進(jìn)行分列,把Long,lat分列出來,但是我們這里就不做了,都是重復(fù)勞動,而且我用的pq清洗,快很多。
## 寫入文件
df_parse.to_excel('貴陽市公交站點(diǎn)分布.xlsx', index=False)</pre>
QGIS坐標(biāo)糾偏
QGIS基礎(chǔ)操作,我就不說了,順便說一下QGIS對csv格式支持較好,我推薦我們導(dǎo)入QGIS的文件為csv格式的文件。
導(dǎo)入csv文件
坐標(biāo)糾偏
以前說了很多,我們高德地圖上的坐標(biāo)是GCJ02坐標(biāo),我們需要轉(zhuǎn)成WGS 1984坐標(biāo),我們在QGIS里面需要借助GeoHey插件。
看一下這個坐標(biāo)糾偏,區(qū)別還是很大。
總結(jié)
總的來說,我們還是推薦使用使用面向?qū)ο蟮姆椒▉韺懘a,還有就是異常處理必不可少。我這次面對的問題是某些公交路線,高德API里面沒有,這樣就會異常,所以這次的異常處理不可缺少。從數(shù)據(jù)處理的角度來看,這次從速度和方便來說,pq完勝python,我推薦大家數(shù)據(jù)清洗就用pq,有些時候,我都會給出多種處理方法,pq看起來復(fù)雜,但是其實(shí)pq是最簡單的,總之,我高度推薦pq進(jìn)行數(shù)據(jù)清洗。還有一點(diǎn),python里面的索引比較麻煩,這次我要保證和bus_stop_id和line_id,這樣公交站點(diǎn)表和公交路線表才可以連接,其實(shí)這就是SQL里面的外鍵連接,所以我在python數(shù)據(jù)清洗的時候,涉及到大量的索引操作,在pq里面沒有這么復(fù)雜。說到這個索引,感謝我的SQL老師,當(dāng)年她講解SQL里面的索引,約束,仿佛就在昨天。高德的這個key大家可以自己去申請,這個key可能有數(shù)量的限制。我接下來會把代碼上傳到Gitee,這個代碼的管理還是很重要的,自己也學(xué)習(xí)一下代碼的管理。接下來,感謝小學(xué)妹給的這個小項(xiàng)目,也感謝崔工對我的鼓勵,其實(shí),我最近很忙,不太想寫文章的。最后,感謝認(rèn)識的一個小學(xué)妹,她真的蠻優(yōu)秀的,最后希望大家2021年最后這一個月萬事如意,開開心心,也希望我們都有一個光明的未來。還有一個坑,我建議大家在簡書上寫文章,真的本地的話,圖片上傳有問題。
以上就是利用python爬取城市公交站點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于python爬取城市公交站點(diǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python腳本實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出excel格式的簡單方法(推薦)
下面小編就為大家?guī)硪黄猵ython腳本實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出Excel格式的簡單方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12python 標(biāo)準(zhǔn)差計(jì)算的實(shí)現(xiàn)(std)
這篇文章主要介紹了python 標(biāo)準(zhǔn)差計(jì)算的實(shí)現(xiàn)(std),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python中opencv K均值聚類的實(shí)現(xiàn)示例
本文主要介紹了python中opencv K均值聚類的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06利用Python+阿里云實(shí)現(xiàn)DDNS動態(tài)域名解析的方法
這篇文章主要介紹了利用Python+阿里云實(shí)現(xiàn)DDNS動態(tài)域名解析的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04pytorch中交叉熵?fù)p失(nn.CrossEntropyLoss())的計(jì)算過程詳解
今天小編就為大家分享一篇pytorch中交叉熵?fù)p失(nn.CrossEntropyLoss())的計(jì)算過程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01