溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么利用python爬取城市公交站點(diǎn)

發(fā)布時間:2021-12-09 17:15:46 來源:億速云 閱讀:368 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么利用python爬取城市公交站點(diǎn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

頁面分析

https://guiyang.8684.cn/line1

怎么利用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) 可以用于檢驗傳回的信息里面是否有自己需要的數(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)

怎么利用python爬取城市公交站點(diǎn)

數(shù)據(jù)清洗

我們先來看效果,我需要對busstops列進(jìn)行清洗。我們的總體思路,分列->逆透視->分列。我會接受兩種方法,一是Excel PQ,二是python。

怎么利用python爬取城市公交站點(diǎn)

怎么利用python爬取城市公交站點(diǎn)

Excel PQ 數(shù)據(jù)清洗

這一方法完全利用PQ,純界面操作,問題不大,所以我們看看流程就可以了,核心步驟就是和上面一樣的。

怎么利用python爬取城市公交站點(diǎn)

python數(shù)據(jù)清洗

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

怎么利用python爬取城市公交站點(diǎn)

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

怎么利用python爬取城市公交站點(diǎn)

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

怎么利用python爬取城市公交站點(diǎn)

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

怎么利用python爬取城市公交站點(diǎn)

## 分列
### 設(shè)置line_id
df_parse['line_id'] = df_pol_ps['id']
df_parse = df_pol_ps['busstops'].apply(pd.Series)
df_parse

怎么利用python爬取城市公交站點(diǎn)

我這里補(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文件

怎么利用python爬取城市公交站點(diǎn)

坐標(biāo)糾偏

以前說了很多,我們高德地圖上的坐標(biāo)是GCJ02坐標(biāo),我們需要轉(zhuǎn)成WGS 1984坐標(biāo),我們在QGIS里面需要借助GeoHey插件。

怎么利用python爬取城市公交站點(diǎn)

怎么利用python爬取城市公交站點(diǎn)

“怎么利用python爬取城市公交站點(diǎn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI