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

蝸牛 互聯網技術資訊 2021-12-09 162 0

本篇內容介紹了“怎么利用python爬取城市公交站點”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

頁面分析

https://guiyang.8684.cn/line1

怎么利用python爬取城市公交站點  python 第1張

怎么利用python爬取城市公交站點  python 第2張

爬蟲

我們利用requests請求,利用BeautifulSoup來解析,獲取我們的站點數據。得到我們的公交站點以后,我們利用高德api來獲取站點的經緯度坐標,利用pandas解析json文件。接下來開干,我推薦使用面向對象的方法來寫代碼。

import?requests
import?json
from?bs4?import?BeautifulSoup
import?pandas?as?pd


class?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?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爬取城市公交站點  python 第3張

數據清洗

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

怎么利用python爬取城市公交站點  python 第4張

怎么利用python爬取城市公交站點  python 第5張

Excel PQ 數據清洗

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

怎么利用python爬取城市公交站點  python 第6張

python數據清洗

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

怎么利用python爬取城市公交站點  python 第7張

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

怎么利用python爬取城市公交站點  python 第8張

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

怎么利用python爬取城市公交站點  python 第9張

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

怎么利用python爬取城市公交站點  python 第10張

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

怎么利用python爬取城市公交站點  python 第11張

我這里補充一下,我們一般還要對location列進行分列,把Long,lat分列出來,但是我們這里就不做了,都是重復勞動,而且我用的pq清洗,快很多。

##?寫入文件
df_parse.to_excel('貴陽市公交站點分布.xlsx',?index=False)</pre>

QGIS坐標糾偏

QGIS基礎操作,我就不說了,順便說一下QGIS對csv格式支持較好,我推薦我們導入QGIS的文件為csv格式的文件。

導入csv文件

怎么利用python爬取城市公交站點  python 第12張

坐標糾偏

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

怎么利用python爬取城市公交站點  python 第13張

怎么利用python爬取城市公交站點  python 第14張

“怎么利用python爬取城市公交站點”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注蝸牛博客網站,小編將為大家輸出更多高質量的實用文章!

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

評論

日本韩欧美一级A片在线观看