利用Python?requests庫(kù)爬取高德地圖全國(guó)地鐵站點(diǎn)信息
requests庫(kù)
一、 基本概念
1、 簡(jiǎn)介
requests 模塊是 python 基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫(kù)。它比 urllib 更加方便,可以節(jié)約我們大量的工作,完全滿足 HTTP 測(cè)試需求。Requests 的哲學(xué)是以 PEP 20 的習(xí)語(yǔ)為中心開發(fā)的,所以它比 urllib 更加 Pythoner
2、 獲取
通過(guò) pip install requests 安裝 requests 庫(kù)
導(dǎo)包:
import requests
3、 http 協(xié)議
http ,超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法,HTTP是一種基于"請(qǐng)求與響應(yīng)"模式的、無(wú)狀態(tài)的應(yīng)用層協(xié)議。HTTP協(xié)議采用URL作為定位網(wǎng)絡(luò)資源的的標(biāo)識(shí)符
3.1 URL
統(tǒng)一資源定位符是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源地址?;ヂ?lián)網(wǎng)上的每一個(gè)文件都有一個(gè)唯一的 URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它
URL 的一般語(yǔ)法格式為:
protocol://host[:port]/path/[?query]#fragment http://www.itcast.cn/index.html?name=andy&age=18#link
組成 | 說(shuō)明 |
---|---|
protocol | 通信協(xié)議,常用:http、https 等 |
host | 主機(jī)(域名) |
port | 端口號(hào),可選,省略時(shí)候使用方案的默認(rèn)端口,如:http的默認(rèn)端口為80 |
path | 路徑,由零或多個(gè) ‘/’ 符號(hào)隔開的字符串,一般用來(lái)表示主機(jī)上的一個(gè)目錄或文件地址 |
query | 參數(shù),以鍵值對(duì)的形式通過(guò) & 來(lái)連接 |
fragment | 片段,# 后面內(nèi)容常見(jiàn)于鏈接 錨點(diǎn) |
3.2 常用 http 請(qǐng)求方法
方法 | 說(shuō)明 |
---|---|
requsts.requst() | 構(gòu)造一個(gè)請(qǐng)求,最基本的方法,是下面方法的支撐 |
requsts.get() | 獲取網(wǎng)頁(yè),對(duì)應(yīng)HTTP中的GET方法 |
requsts.post() | 向網(wǎng)頁(yè)提交信息,對(duì)應(yīng)HTTP中的POST方法 |
requsts.head() | 獲取html網(wǎng)頁(yè)的頭信息,對(duì)應(yīng)HTTP中的HEAD方法 |
requsts.put() | 向html提交put方法,對(duì)應(yīng)HTTP中的PUT方法 |
requsts.patch() | 向html網(wǎng)頁(yè)提交局部請(qǐng)求修改的的請(qǐng)求,對(duì)應(yīng)HTTP中的PATCH方法 |
requsts.delete() | 向html提交刪除請(qǐng)求,對(duì)應(yīng)HTTP中的DELETE方法 |
GET
,HEAD
是從服務(wù)器獲取信息到本地,PUT
,POST
,PATCH
,DELETE
是從本地向服務(wù)器提交信息。通過(guò)URL和命令管理資源,操作獨(dú)立無(wú)狀態(tài),網(wǎng)絡(luò)通道及服務(wù)器成了黑盒子。
正文開始
利用Python requests庫(kù)爬取高德地圖全國(guó)地鐵站點(diǎn)信息
利用Python中的requests庫(kù)進(jìn)行地鐵站點(diǎn)信息的獲取,同時(shí)將數(shù)據(jù)保存在本機(jī)excel中
# 首先引入所需要的包 import requests from bs4 import BeautifulSoup import pandas as pd import json # 發(fā)送 GET 請(qǐng)求獲取網(wǎng)頁(yè)內(nèi)容 url = 'http://map.amap.com/subway/index.html' response = requests.get(url) # 第一步:爬取兩個(gè) div 中的城市數(shù)據(jù)(包括 ID 和拼音),生成城市集合 if response.status_code == 200: # 解碼 response_content = response.content.decode('utf-8') # 使用 Beautiful Soup 解析網(wǎng)頁(yè)內(nèi)容 soup = BeautifulSoup(response_content, 'html.parser') # 從這里開始,你可以使用 Beautiful Soup 對(duì)象(soup)來(lái)提取所需的信息 # 例如,查找標(biāo)題 title = soup.title # 通過(guò)Beautiful Soup來(lái)找到城市信息元素,并提取這個(gè)元素的信息 for soup_a in soup.find('div', class_='city-list fl').find_all('a'): city_name_py = soup_a['cityname'] city_id = soup_a['id'] city_name_ch = soup_a.get_text() city_info_list.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch}) # 獲取未顯示出來(lái)的城市列表 for soup_a in soup.find('div', class_='more-city-list').find_all('a'): city_name_py = soup_a['cityname'] city_id = soup_a['id'] city_name_ch = soup_a.get_text() city_info_list.append({'name_py': city_name_py, 'id': city_id, 'name_ch': city_name_ch}) print(city_info_list) else: print("無(wú)法獲取網(wǎng)頁(yè)內(nèi)容") for city_info in city_info_list: city_id = city_info.get("id") city_name = city_info.get("name_py") city_name_ch = city_info.get("name_ch") print("開始爬取城市" + city_name_ch + "的數(shù)據(jù)") city_lines_list = [] # 第二步:遍歷城市集合,構(gòu)造每一個(gè)城市的 url,并下載數(shù)據(jù) # 構(gòu)造每個(gè)城市的url url = "http://map.amap.com/service/subway?_1717380520536&srhdata=" + city_id + '_drw_' + city_name + '.json' res = requests.get(url) content = res.content.decode('utf-8') # 將內(nèi)容字符串轉(zhuǎn)換成json對(duì)象 content_json = json.loads(content) # 提取該城市的所有地鐵線list line_info_list = content_json.get("l") # 第三步:開始處理每一個(gè)地鐵線,提取內(nèi)容到dataframe中 for line_info in line_info_list: # 地鐵線名字 line_name = line_info["kn"] # 處理地鐵線站點(diǎn) df_per_zd = pd.DataFrame(line_info["st"]) df_per_zd = df_per_zd[['n', 'sl', 'poiid', 'sp', 't', 'su', 'sid']] df_per_zd['gd經(jīng)度'] = df_per_zd['sl'].apply(lambda x: x.split(',')[0]) df_per_zd['gd緯度'] = df_per_zd['sl'].apply(lambda x: x.split(',')[1]) df_per_zd.drop('sl', axis=1, inplace=True) df_per_zd['路線名稱'] = line_info['ln'] df_per_zd['城市名稱'] = city_name_ch df_per_zd.rename(columns={"n": "站點(diǎn)名稱", "poiid": "POI編號(hào)", "sp": "拼音名稱", "t": "換乘標(biāo)志 1:換乘,0:不可換乘", "su": "su", "sid": "sid編號(hào)"}, inplace=True) # 先將這條地鐵線處理過(guò)的dataframe存起來(lái),我們后面給他放到一張表里 city_lines_list.append(df_per_zd) # 這段代碼就是將地鐵線數(shù)據(jù)列表聚合到一張表里,形成每個(gè)城市的地鐵站數(shù)據(jù) city_subway_data = pd.concat(city_lines_list, ignore_index=True) # 第四步:將處理好的文件保存為xlsx city_subway_data.to_excel(city_name_ch + '.xlsx', sheet_name='Sheet1')
到此這篇關(guān)于利用Python requests庫(kù)爬取高德地圖全國(guó)地鐵站點(diǎn)信息的文章就介紹到這了,更多相關(guān)Python爬取地鐵站點(diǎn)信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07關(guān)于adfuller函數(shù)返回值的參數(shù)說(shuō)明與記錄
這篇文章主要介紹了關(guān)于adfuller函數(shù)返回值的參數(shù)說(shuō)明與記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11pytorch torch.nn.AdaptiveAvgPool2d()自適應(yīng)平均池化函數(shù)詳解
今天小編就為大家分享一篇pytorch torch.nn.AdaptiveAvgPool2d()自適應(yīng)平均池化函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python使用paramiko實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法
這篇文章主要介紹了python使用paramiko實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法,分析了paramiko庫(kù)的安裝以及遠(yuǎn)程下載文件的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-04-04淺談Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇
這篇文章主要介紹了Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09PyTorch中torch.save()的用法和應(yīng)用小結(jié)
本文主要介紹了PyTorch中torch.save()的用法和應(yīng)用小結(jié),torch.save()的主要作用就是將PyTorch對(duì)象保存到磁盤上,下面就來(lái)具體介紹一下,感興趣的可以了解一下2024-03-0310分鐘教你用Python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
今天,我們就來(lái)用Python實(shí)現(xiàn)微信的自動(dòng)回復(fù)功能吧,并且把接收到的消息統(tǒng)一發(fā)送到文件助手里面,方便統(tǒng)一查看。感興趣的朋友跟隨小編一起看看吧2018-11-11