怎么利用python爬取城市公交站點
本篇內容介紹了“怎么利用python爬取城市公交站點”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
頁面分析
https://guiyang.8684.cn/line1
爬蟲
我們利用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)
數據清洗
我們先來看效果,我需要對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爬取城市公交站點”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注蝸牛博客網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。版權聲明:蝸牛博客如無特殊標注,文章均為來源于網絡,轉載時請以鏈接形式注明文章出處。
評論