最近在知乎上看到一篇關於地鐵資料的分析,該篇文章很全面的分析了大陸(包括澳門香港)有地鐵城市的分布、線路、站點等資訊,很有閱讀價值。本篇文章是對該文中獲取資訊部分的乙個更進,使用物件導向的方法實現其部分功能。
用python的物件導向方式實現目標,**已做注釋,可供參考使用。本人技術有限,如有錯誤請指出。
import requests
from bs4 import beautifulsoup
import json
"""目標:爬取中國大陸地鐵線路資訊
要求: ①獲取相關城市的地鐵數量
②獲取每個地鐵站的名稱
③寫入文件
"""class
subway
(object)
: def __init__
(self)
: # 構造url
self.url =
""# 使用老版本請求頭
self.headers =
# 獲取資料
def get_data
(self)
: responses = requests.
get(url=self.url, headers=self.headers)
# 返回str字串型別
return responses.text
# 解析每個城市地鐵資訊
(地鐵數量,站點)
def parse_get_subway
(self,
id, city, name)
: # 拼接地鐵資訊的url
url =
''+id
+'_drw_'
+ city +
'.json'
# 獲取資料
response = requests.
get(url=url, headers=self.headers)
# 傳遞乙個引數接收返回的字串型別
html = response.text
# 通過json.loads將json字串型別轉為python資料型別
result = json.
loads
(html)
# 迴圈遍歷資料節點,所有地鐵路線
for node in result[
'l']
: # "st"為地鐵線的站點
for start in node[
'st']:
# 判斷是否含有地鐵分線
# node:
"l"裡包含所有地鐵路線 「la」為分線
iflen(node[
'la'])
>0:
# "ln"為1號線,2號線。。。 「n」為地鐵站站名
print
(name, node[
'ln']+
'('+ node[
'la']+
')', start[
'n']
)with
open
('subway.json'
,'a+'
, encoding=
'utf8'
)as f:
f.write
(name +
','+ node[
'ln']+
'('+ node[
'la']+
')'+
','+ start[
'n']
+'\n'
)else
:print
(name, node[
'ln'
], start[
'n']
)with
open
('subway.json'
,'a+'
, encoding=
'utf8'
)as f:
f.write
(name +
','+ node[
'ln']+
','+ start[
'n']
+'\n'
) # 解析資料
def parse_city_data
(self, data)
: # 對資料進行編碼
data = data.
encode
('iso-8859-1'
) data = data.
decode
('utf-8'
) soup =
beautifulsoup
(data,
'lxml'
) # 獲取城市資訊
res1 = soup.
find_all
(class_=
"city-list fl")[
0]res2 = soup.
find_all
(class_=
"more-city-list")[
0]# 遍歷a標籤
for temp in res1.
find_all
('a'):
# 城市id值
id= temp[
'id'
] # 城市拼音名
city_name = temp[
'cityname'
] # 城市名
name = temp.
get_text()
self.
parse_get_subway(id
, city_name, name)
for temp in res2.
find_all
('a'):
# 城市id值
id= temp[
'id'
] # 城市拼音名
city_name = temp[
'cityname'
] # 城市名
name = temp.
get_text()
self.
parse_get_subway(id
, city_name, name)
def run
(self)
: data =self.
get_data()
self.
parse_city_data
(data)
if __name__ ==
'__main__'
: subway =
subway()
subway.
run(
)
python3.6
需要匯入的包:
①requests
②br4裡的beautifulsoup方法
__init__初始化方法,定義請求頭和url
get_data用來獲取資料
parse_get_subway獲取地鐵資訊
parse_get_city獲取城市資訊
寫乙個簡易的資料爬蟲
得到所有電影的html的字串 axios在各種環境中傳送網路請求。並獲取到伺服器響應結果 const axios require axios const cheerio require cheerio async function getmoviehtml 獲取所有電影資料 async functi...
python寫乙個簡單爬蟲程式
python寫乙個簡單爬蟲程式 先看輸出結果 d 應用集合 python 1.py 名稱 詭秘之主 名稱 超神機械師 名稱 九星毒奶 名稱 第一序列 名稱 明天下 名稱 爛柯棋緣 名稱 虧成首富從遊戲開始 名稱 我師兄實在太穩健了 名稱 輪迴樂園 名稱 當醫生開了外掛程式 名稱 學霸的黑科技系統 名...
爬蟲初探,獲取乙個頁面
環境 urllib模組和urllib2模組的區別 urllib2可以接受乙個request類的例項來設定url請求的headers,urllib僅可以接受url。urllib提供urlencode方法用來get查詢字串的產生,而urllib2沒有。工作流程 定位需要爬取的頁面,糗事百科首頁 用url...