寫乙個爬蟲來獲取地鐵資訊資料

2021-09-23 10:08:23 字數 3585 閱讀 5226

最近在知乎上看到一篇關於地鐵資料的分析,該篇文章很全面的分析了大陸(包括澳門香港)有地鐵城市的分布、線路、站點等資訊,很有閱讀價值。本篇文章是對該文中獲取資訊部分的乙個更進,使用物件導向的方法實現其部分功能。

用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...