文章目录
前言
主要是介绍爬取网页的基本步骤,面对对象编程,所以弄清楚返回的对象类型,可以调用相应的方法和属性。
参考原文:感谢原文作者提供的思路
一、爬取网页的基本步骤
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
#1 获取网页信息(str)
#2 将str转化为<class ‘bs4.BeautifulSoup’>对象(解析过程),从而提取数据(.find() 和 find_all())形成tag对象
#3 利用tag对象调用相应的方法和属性。
二、常见细节问题(返回的对象解释)
1、BeautifulSoup解析数据:
1)在括号中,要输入两个参数,第1个参数是要被解析的文本,注意了,它必须必须必须是字符串类型的值或者变量!!!
括号中的第2个参数用来标识解析器,我们要用的是一个Python内置库:html.parser(它不是唯一的解析器,但是相对来说比较简单。其他的还有’lxml’等)。
2)bs返回的数据类型(soup变量接收)是<class ‘bs4.BeautifulSoup’>,说明soup是一个BeautifulSoup对象。不过soup出来的源代码和我们之前使用response.text打印出来的源代码是完全一样的。也就是说,虽然我们使用了BeautifulSoup来解析数据,但从直观上来看,得到的结果竟然和没解析之前一样。
3)它们属于不同的类:<class ‘str’> 与<class ‘bs4.BeautifulSoup’>。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的str方法,所以直接打印 bs 对象显示字符串是str的返回结果。
我们之后还会用BeautifulSoup库来提取数据,如果我们得到的结果是没有经过解析的,也就是说我们没有一个BeautifulSoup对象,是没法调用相关的属性和方法的。
2、find()与find_all()
find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配HTML的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。
1)它俩的用法基本是一样的,区别在于,find()只提取首个满足要求的数据,而find_all()提取出的是所有满足要求的数据。eg:在网页的HTML代码中,有三个
2)两者返回对象略微不同:
find()返回对象是<class ‘bs4.element.Tag’>,说明这是一个Tag类对象。
find_all()是<class ‘bs4.element.ResultSet’>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。
3)find_all()返回的对象是一个list,即可以进行for遍历,对于遍历出的对象也是<class ‘bs4.element.Tag’>,是Tag对象,和find()返回对象一致。
3、Tag 对象
三、实践操作-爬取深圳地铁数据
1、爬取深圳的地铁数据(不包含时间)
import requests
import json
from bs4 import BeautifulSoup
import lxml.html
#将每个路线的链接找到
def get_urls():
route_url={}
route_list=[]
url="https://dt.8684.cn/so.php?k=pp&dtcity=sz&q=wedwed"
res=requests.get(url=url)
soup=BeautifulSoup(res.content,"lxml").find(attrs={"class":"fs-fdLink"})
route=soup.find("tr").find("td").find_all("a")
route_name=[]
start_time=[]
end_time=[]
for i in route:
route_url={}
route_url["key"]=i.text
route_url["values"]="https://dt.8684.cn/"+i["href"]#tag对象,通过属性名进行取值
route_list.append(route_url)
return route_list
###########返回值:
[{'key': '1号线', 'values': 'https://dt.8684.cn//sz_x_e121ab3b'},
{'key': '2号线(8号线)', 'values': 'https://dt.8684.cn//sz_x_0bb46835'},
{'key': '3号线', 'values': 'https://dt.8684.cn//sz_x_668b4fd2'},
{'key': '4号线', 'values': 'https://dt.8684.cn//sz_x_2e0b72d2'},
{'key': '5号线', 'values': 'https://dt.8684.cn//sz_x_902c071b'},
{'key': '6号线', 'values': 'https://dt.8684.cn//sz_x_eba33b86'},
{'key': '7号线', 'values': 'https://dt.8684.cn//sz_x_7dacbea3'},
{'key': '9号线', 'values': 'https://dt.8684.cn//sz_x_4dba0a29'},
{'key': '10号线', 'values': 'https://dt.8684.cn//sz_x_40e26542'},
{'key': '11号线', 'values': 'https://dt.8684.cn//sz_x_2e25af6a'},
################################
#只保留站的名字,不要时间:
def get_schedule_name(dic):
all_data=requests.get(dic["values"])
soup=BeautifulSoup(all_data.content,"lxml").find(attrs={"class":"pi-table tl-table"})
#soup的数据类型是<class 'bs4.BeautifulSoup'>,
"""all_stations是<class 'bs4.element.ResultSet'>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。
但是如果是通过find()找到一个元素,则返回是<class 'bs4.element.Tag'>,说明这是一个Tag类对象"""
all_stations=soup.find("tbody").find_all("tr")#既然是列表,就可以进行遍历:
route_list=[]
route_infor_nei={}#形成内环列表
route_infor_wai={}#形成外环列表
if (dic["key"].find("内圈")==-1 and dic["key"].find("外圈")==-1):#如果路线中不存在内圈和外圈字样:
route_infor_nei["name"]=dic["key"]+"内环"
route_infor_wai["name"]=dic["key"]+"外环"
station_list=[]
for i in all_stations:
if i!=[]:
routes=i.find_all("td")
if routes !=[]:
station_list.append(routes[0].text)
#内外环线增加路线:
route_infor_nei["stations"]=station_list
route_infor_wai["stations"]=list(reversed(station_list))
route_list.append(route_infor_nei)
route_list.append(route_infor_wai)
else:#如果存在内外圈字样:
route_infor["name"]=dic["key"]
station_list=[]
for i in all_stations:
if i!=[]:
route=i.find_all("td")#返回是一个list
if route!=[]:
station_list.append(route[0].text)
#内外环线增加路线:
route_infor["stations"]=station_list
route_list.append(route_infor)
return route_list
#整合数据:
for i in get_urls():
for j in get_schedule_name(i):
print(json_str)#不用json.dumps()也可以,因为内外环线组合是一个list,遍历出来即可。
##############################结果:
{"name": "1号线内环", "stations": ["罗湖", "国贸", "老街", "大剧院", "科学馆", "华强路", "岗厦", "会展中心", "购物公园", "香蜜湖", "车公庙", "竹子林", "侨城东", "华侨城", "世界之窗", "白石洲", "高新园", "深大", "桃园", "大新", "鲤鱼门", "前海湾", "新安", "宝安中心", "宝体", "坪洲", "西乡", "固戍", "后瑞", "机场东"]}
{"name": "1号线外环", "stations": ["机场东", "后瑞", "固戍", "西乡", "坪洲", "宝体", "宝安中心", "新安", "前海湾", "鲤鱼门", "大新", "桃园", "深大", "高新园", "白石洲", "世界之窗", "华侨城", "侨城东", "竹子林", "车公庙", "香蜜湖", "购物公园", "会展中心", "岗厦", "华强路", "科学馆", "大剧院", "老街", "国贸", "罗湖"]}
{"name": "2号线(8号线)内环", "stations": ["赤湾", "蛇口港", "海上世界", "水湾", "东角头", "湾厦", "海月", "登良", "后海", "科苑", "红树湾", "世界之窗", "侨城北", "深康", "安托山", "侨香", "香蜜", "香梅北", "景田", "莲花西", "福田", "市民中心", "岗厦北", "华强北", "燕南", "大剧院", "湖贝", "黄贝岭", "新秀", "莲塘口岸", "仙湖路", "莲塘", "梧桐山南", "沙头角", "海山", "盐田港西", "深外高中", "盐田路"]}
{"name": "2号线(8号线)外环", "stations": ["盐田路", "深外高中", "盐田港西", "海山", "沙头角", "梧桐山南", "莲塘", "仙湖路", "莲塘口岸", "新秀", "黄贝岭", "湖贝", "大剧院", "燕南", "华强北", "岗厦北", "市民中心", "福田", "莲花西", "景田", "香梅北", "香蜜", "侨香", "安托山", "深康", "侨城北", "世界之窗", "红树湾", "科苑", "后海", "登良", "海月", "湾厦", "东角头", "水湾", "海上世界", "蛇口港", "赤湾"]}
{"name": "3号线内环", "stations": ["福保", "益田", "石厦", "购物公园", "福田", "少年宫", "莲花村", "华新", "通新岭", "红岭", "老街", "晒布", "翠竹", "田贝", "水贝", "草埔", "布吉", "木棉湾", "大芬", "丹竹头", "六约", "塘坑", "横岗", "永湖", "荷坳", "大运", "爱联", "吉祥", "龙城广场", "南联", "双龙"]}
{"name": "3号线外环", "stations": ["双龙", "南联", "龙城广场", "吉祥", "爱联", "大运", "荷坳", "永湖", "横岗", "塘坑", "六约", "丹竹头", "大芬", "木棉湾", "布吉", "草埔", "水贝", "田贝", "翠竹", "晒布", "老街", "红岭", "通新岭", "华新", "莲花村", "少年宫", "福田", "购物公园", "石厦", "益田", "福保"]}
{"name": "4号线内环", "stations": ["牛湖", "观澜湖", "松元厦", "观澜", "长湖", "茜坑", "竹村", "清湖北", "清湖", "龙华", "龙胜", "上塘", "红山", "深圳北站", "白石龙", "民乐", "上梅林", "莲花北", "少年宫", "市民中心", "会展中心", "福民", "福田口岸"]}
{"name": "4号线外环", "stations": ["福田口岸", "福民", "会展中心", "市民中心", "少年宫", "莲花北", "上梅林", "民乐", "白石龙", "深圳北站", "红山", "上塘", "龙胜", "龙华", "清湖", "清湖北", "竹村", "茜坑", "长湖", "观澜", "松元厦", "观澜湖", "牛湖"]}
{"name": "5号线内环", "stations": ["黄贝岭", "怡景", "太安", "布心", "百鸽笼", "布吉", "长龙", "下水径", "上水径", "杨美", "坂田", "五和", "民治", "深圳北站", "长岭陂", "塘朗", "大学城", "西丽", "留仙洞", "兴东", "洪浪北", "灵芝", "翻身", "宝安中心", "宝华", "临海", "前海湾", "桂湾", "前湾", "前湾公园", "妈湾", "铁路公园", "荔湾", "赤湾"]}
{"name": "5号线外环", "stations": ["赤湾", "荔湾", "铁路公园", "妈湾", "前湾公园", "前湾", "桂湾", "前海湾", "临海", "宝华", "宝安中心", "翻身", "灵芝", "洪浪北", "兴东", "留仙洞", "西丽", "大学城", "塘朗", "长岭陂", "深圳北站", "民治", "五和", "坂田", "杨美", "上水径", "下水径", "长龙", "布吉", "百鸽笼", "布心", "太安", "怡景", "黄贝岭"]}
{"name": "6号线内环", "stations": ["松岗", "溪头", "松岗公园", "薯田埔", "合水口", "公明广场", "红花山", "楼村", "科学公园", "光明", "光明大街", "凤凰城", "长圳", "上屋", "官田", "阳台山东", "元芬", "上芬", "红山", "深圳北站", "梅林关", "翰岭", "银湖", "八卦岭", "体育中心", "通新岭", "科学馆"]}
{"name": "6号线外环", "stations": ["科学馆", "通新岭", "体育中心", "八卦岭", "银湖", "翰岭", "梅林关", "深圳北站", "红山", "上芬", "元芬", "阳台山东", "官田", "上屋", "长圳", "凤凰城", "光明大街", "光明", "科学公园", "楼村", "红花山", "公明广场", "合水口", "薯田埔", "松岗公园", "溪头", "松岗"]}
{"name": "7号线内环", "stations": ["西丽湖", "西丽", "茶光", "珠光", "龙井", "桃源村", "深云", "安托山", "农林", "车公庙", "上沙", "沙尾", "石厦", "皇岗村", "福民", "皇岗口岸", "赤尾", "华强南", "华强北", "华新", "黄木岗", "八卦岭", "红岭北", "笋岗", "洪湖", "田贝", "太安"]}
{"name": "7号线外环", "stations": ["太安", "田贝", "洪湖", "笋岗", "红岭北", "八卦岭", "黄木岗", "华新", "华强北", "华强南", "赤尾", "皇岗口岸", "福民", "皇岗村", "石厦", "沙尾", "上沙", "车公庙", "农林", "安托山", "深云", "桃源村", "龙井", "珠光", "茶光", "西丽", "西丽湖"]}
{"name": "9号线内环", "stations": ["前湾", "梦海", "怡海", "荔林", "南油西", "南油", "南山书城", "深大南", "粤海门", "高新南", "红树湾南", "深湾", "深圳湾公园", "下沙", "车公庙", "香梅", "景田", "梅景", "下梅林", "梅村", "上梅林", "孖岭", "银湖", "泥岗", "红岭北", "园岭", "红岭", "红岭南", "鹿丹村", "人民南", "向西村", "文锦"]}
{"name": "9号线外环", "stations": ["文锦", "向西村", "人民南", "鹿丹村", "红岭南", "红岭", "园岭", "红岭北", "泥岗", "银湖", "孖岭", "上梅林", "梅村", "下梅林", "梅景", "景田", "香梅", "车公庙", "下沙", "深圳湾公园", "深湾", "红树湾南", "高新南", "粤海门", "深大南", "南山书城", "南油", "南油西", "荔林", "怡海", "梦海", "前湾"]}
{"name": "10号线内环", "stations": ["福田口岸", "福民", "岗厦", "莲花村", "冬瓜岭", "孖岭", "雅宝", "南坑", "光雅园", "五和", "坂田北", "贝尔路", "华为", "岗头", "雪象", "甘坑", "凉帽山", "上李朗", "木古", "华南城", "禾花", "平湖", "双拥街"]}
{"name": "10号线外环", "stations": ["双拥街", "平湖", "禾花", "华南城", "木古", "上李朗", "凉帽山", "甘坑", "雪象", "岗头", "华为", "贝尔路", "坂田北", "五和", "光雅园", "南坑", "雅宝", "孖岭", "冬瓜岭", "莲花村", "岗厦", "福民", "福田口岸"]}
{"name": "11号线内环", "stations": ["福田", "车公庙", "红树湾南", "后海", "南山", "前海湾", "宝安", "碧海湾", "机场", "机场北", "福永", "桥头", "塘尾", "马安山", "沙井", "后亭", "松岗", "碧头"]}
{"name": "11号线外环", "stations": ["碧头", "松岗", "后亭", "沙井", "马安山", "塘尾", "桥头", "福永", "机场北", "机场", "碧海湾", "宝安", "前海湾", "南山", "后海", "红树湾南", "车公庙", "福田"]}
{"name": "20号线内环", "stations": ["机场北", "国展南", "国展", "国展北", "会展城"]}
{"name": "20号线外环", "stations": ["会展城", "国展北", "国展", "国展南", "机场北"]}
2、爬取深圳地铁数据(包含时间)
import requests
import json
from bs4 import BeautifulSoup
import lxml.html
#将每个路线的链接找到
def get_urls():
route_url={}
route_list=[]
url="https://dt.8684.cn/so.php?k=pp&dtcity=sz&q=wedwed"
res=requests.get(url=url)
soup=BeautifulSoup(res.content,"lxml").find(attrs={"class":"fs-fdLink"})
route=soup.find("tr").find("td").find_all("a")
route_name=[]
start_time=[]
end_time=[]
for i in route:
route_url={}
route_url["key"]=i.text
route_url["values"]="https://dt.8684.cn/"+i["href"]#tag对象,通过属性名进行取值
route_list.append(route_url)
return route_list
###########返回值:
[{'key': '1号线', 'values': 'https://dt.8684.cn//sz_x_e121ab3b'},
{'key': '2号线(8号线)', 'values': 'https://dt.8684.cn//sz_x_0bb46835'},
{'key': '3号线', 'values': 'https://dt.8684.cn//sz_x_668b4fd2'},
{'key': '4号线', 'values': 'https://dt.8684.cn//sz_x_2e0b72d2'},
{'key': '5号线', 'values': 'https://dt.8684.cn//sz_x_902c071b'},
{'key': '6号线', 'values': 'https://dt.8684.cn//sz_x_eba33b86'},
{'key': '7号线', 'values': 'https://dt.8684.cn//sz_x_7dacbea3'},
{'key': '9号线', 'values': 'https://dt.8684.cn//sz_x_4dba0a29'},
{'key': '10号线', 'values': 'https://dt.8684.cn//sz_x_40e26542'},
{'key': '11号线', 'values': 'https://dt.8684.cn//sz_x_2e25af6a'},
################################
def get_schedule(dic):
all_data=requests.get(dic["values"])
soup=BeautifulSoup(all_data.content,"lxml").find(attrs={"class":"pi-table tl-table"})
#soup的数据类型是<class 'bs4.BeautifulSoup'>,
"""all_stations是<class 'bs4.element.ResultSet'>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。
但是如果是通过find()找到一个元素,则返回是<class 'bs4.element.Tag'>,说明这是一个Tag类对象"""
all_stations=soup.find("tbody").find_all("tr")#既然是列表,就可以进行遍历:
route_list=[]
route_infor_nei={}#形成内环列表
route_infor_wai={}#形成外环列表
if (dic["key"].find("内圈")==-1 and dic["key"].find("外圈")==-1):#如果路线中不存在内圈和外圈字样:
route_infor_nei["name"]=dic["key"]+"内环"
route_infor_wai["name"]=dic["key"]+"外环"
station_list=[]
time_NH_1=[]
time_NH_2=[]
time_WH_1=[]
time_WH_2=[]
for i in all_stations:
if i!=[]:
route=i.find_all("td")#返回是一个list
if j!=[]:
station_list.append(route[0].text)
time_NH_1.append(route[1].text)#内环发车时间
time_NH_2.append(route[3].text)#内环收车时间即末班车时间
time_WH_1.append(route[2].text)#外环发车时间
time_WH_2.append(route[4].text)#外环末班车时间(即收车)
try:
if time_NH_1[0]!="--" and time_NH_1[0]!="—":
route_infor_nei["start-time"]=time_nei_1[0]#内环线增加起始时间(直接否定为主--极端)
else:
route_infor_nei["start-time"]=time_nei_1ime[1]
if time_nei_2[-1]!="--" and time_nei_2[-1]!="—":
route_infor_nei["end-time"]=time_nei_2[-1]#内环线增加结束时间
else:
route_infor_nei["end-time"]=time_nei_2[-2]
if time_wai_1[-1]!="--" and time_wai_1[-1]!="—":
route_infor_wai["start-time"]=time_wai_1[-1]#外环线增加起始时间
else:
route_infor_wai["start-time"]=time_wai_1[-2]
if time_wai_1[0]!="--" and time_wai_1[0]!="—":
route_infor_wai["end-time"]=time_wai_2[0]#外环线增加结束时间
else:
route_infor_wai["end-time"]=time_wai_2[1]#外环线增加结束时间
except Indexerror as e:
route_infor_nei["start-time"]="6:30"
route_infor_nei["end-time"]="23:00"
route_infor_wai["start-time"]="6:30"
route_infor_wai["end-time"]="23:00"
#内外环线增加路线:
route_infor_nei["stations"]=station_list
route_infor_wai["stations"]=list(reversed(station_list))
route_list.append(route_infor_nei)
route_list.append(route_infor_wai)
else:#如果存在内外圈字样:
route_infor["name"]=dic["key"]
station_list=[]
time_1=[]#一条路线确定内环或外环后就只有2个时间,发车和收车
time_2=[]
for i in all_stations:
if i!=[]:
route=i.find_all("td")#返回是一个list
if j!=[]:
station_list.append(route[0].text)
time_1.append(route[1].text)#发车时间
time_2.append(route[2].text)#收车时间即末班车时间
try:
if time_1[0]!="--" and time_1[0]!="—":
route_infor["start-time"]=time_nei_1[0]#该环线发车时间
else:
route_infor["start-time"]=time_nei_1ime[1]
if time_1[-1]!="--" and time_2[-1]!="—":
route_infor["end-time"]=time_nei_2[-1]#该环线收车时间
else:
route_infor["end-time"]=time_nei_2[-2]
except Indexerror as e:
route_infor["start-time"]="6:30"
route_infor["end-time"]="23:00"
#内外环线增加路线:
route_infor["stations"]=station_list
route_list.append(route_infor)
return route_list
##整合两个函数--调用数据:
for i in get_urls():
for j in get_schedule(i):
json_str = json.dumps(j, ensure_ascii=False)
#转换数据格式为json格式,忽略格式转换错误进行强制转换
print(json_str)
########################最终返回结果
{"name": "1号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["罗湖", "国贸", "老街", "大剧院", "科学馆", "华强路", "岗厦", "会展中心", "购物公园", "香蜜湖", "车公庙", "竹子林", "侨城东", "华侨城", "世界之窗", "白石洲", "高新园", "深大", "桃园", "大新", "鲤鱼门", "前海湾", "新安", "宝安中心", "宝体", "坪洲", "西乡", "固戍", "后瑞", "机场东"]}
{"name": "1号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["机场东", "后瑞", "固戍", "西乡", "坪洲", "宝体", "宝安中心", "新安", "前海湾", "鲤鱼门", "大新", "桃园", "深大", "高新园", "白石洲", "世界之窗", "华侨城", "侨城东", "竹子林", "车公庙", "香蜜湖", "购物公园", "会展中心", "岗厦", "华强路", "科学馆", "大剧院", "老街", "国贸", "罗湖"]}
{"name": "2号线(8号线)内环", "start-time": "06:30", "end-time": "00:04", "stations": ["赤湾", "蛇口港", "海上世界", "水湾", "东角头", "湾厦", "海月", "登良", "后海", "科苑", "红树湾", "世界之窗", "侨城北", "深康", "安托山", "侨香", "香蜜", "香梅北", "景田", "莲花西", "福田", "市民中心", "岗厦北", "华强北", "燕南", "大剧院", "湖贝", "黄贝岭", "新秀", "莲塘口岸", "仙湖路", "莲塘", "梧桐山南", "沙头角", "海山", "盐田港西", "深外高中", "盐田路"]}
{"name": "2号线(8号线)外环", "start-time": "06:30", "end-time": "00:06", "stations": ["盐田路", "深外高中", "盐田港西", "海山", "沙头角", "梧桐山南", "莲塘", "仙湖路", "莲塘口岸", "新秀", "黄贝岭", "湖贝", "大剧院", "燕南", "华强北", "岗厦北", "市民中心", "福田", "莲花西", "景田", "香梅北", "香蜜", "侨香", "安托山", "深康", "侨城北", "世界之窗", "红树湾", "科苑", "后海", "登良", "海月", "湾厦", "东角头", "水湾", "海上世界", "蛇口港", "赤湾"]}
{"name": "3号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["福保", "益田", "石厦", "购物公园", "福田", "少年宫", "莲花村", "华新", "通新岭", "红岭", "老街", "晒布", "翠竹", "田贝", "水贝", "草埔", "布吉", "木棉湾", "大芬", "丹竹头", "六约", "塘坑", "横岗", "永湖", "荷坳", "大运", "爱联", "吉祥", "龙城广场", "南联", "双龙"]}
{"name": "3号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["双龙", "南联", "龙城广场", "吉祥", "爱联", "大运", "荷坳", "永湖", "横岗", "塘坑", "六约", "丹竹头", "大芬", "木棉湾", "布吉", "草埔", "水贝", "田贝", "翠竹", "晒布", "老街", "红岭", "通新岭", "华新", "莲花村", "少年宫", "福田", "购物公园", "石厦", "益田", "福保"]}
{"name": "4号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["牛湖", "观澜湖", "松元厦", "观澜", "长湖", "茜坑", "竹村", "清湖北", "清湖", "龙华", "龙胜", "上塘", "红山", "深圳北站", "白石龙", "民乐", "上梅林", "莲花北", "少年宫", "市民中心", "会展中心", "福民", "福田口岸"]}
{"name": "4号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["福田口岸", "福民", "会展中心", "市民中心", "少年宫", "莲花北", "上梅林", "民乐", "白石龙", "深圳北站", "红山", "上塘", "龙胜", "龙华", "清湖", "清湖北", "竹村", "茜坑", "长湖", "观澜", "松元厦", "观澜湖", "牛湖"]}
{"name": "5号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["黄贝岭", "怡景", "太安", "布心", "百鸽笼", "布吉", "长龙", "下水径", "上水径", "杨美", "坂田", "五和", "民治", "深圳北站", "长岭陂", "塘朗", "大学城", "西丽", "留仙洞", "兴东", "洪浪北", "灵芝", "翻身", "宝安中心", "宝华", "临海", "前海湾", "桂湾", "前湾", "前湾公园", "妈湾", "铁路公园", "荔湾", "赤湾"]}
{"name": "5号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["赤湾", "荔湾", "铁路公园", "妈湾", "前湾公园", "前湾", "桂湾", "前海湾", "临海", "宝华", "宝安中心", "翻身", "灵芝", "洪浪北", "兴东", "留仙洞", "西丽", "大学城", "塘朗", "长岭陂", "深圳北站", "民治", "五和", "坂田", "杨美", "上水径", "下水径", "长龙", "布吉", "百鸽笼", "布心", "太安", "怡景", "黄贝岭"]}
{"name": "6号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["松岗", "溪头", "松岗公园", "薯田埔", "合水口", "公明广场", "红花山", "楼村", "科学公园", "光明", "光明大街", "凤凰城", "长圳", "上屋", "官田", "阳台山东", "元芬", "上芬", "红山", "深圳北站", "梅林关", "翰岭", "银湖", "八卦岭", "体育中心", "通新岭", "科学馆"]}
{"name": "6号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["科学馆", "通新岭", "体育中心", "八卦岭", "银湖", "翰岭", "梅林关", "深圳北站", "红山", "上芬", "元芬", "阳台山东", "官田", "上屋", "长圳", "凤凰城", "光明大街", "光明", "科学公园", "楼村", "红花山", "公明广场", "合水口", "薯田埔", "松岗公园", "溪头", "松岗"]}
{"name": "7号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["西丽湖", "西丽", "茶光", "珠光", "龙井", "桃源村", "深云", "安托山", "农林", "车公庙", "上沙", "沙尾", "石厦", "皇岗村", "福民", "皇岗口岸", "赤尾", "华强南", "华强北", "华新", "黄木岗", "八卦岭", "红岭北", "笋岗", "洪湖", "田贝", "太安"]}
{"name": "7号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["太安", "田贝", "洪湖", "笋岗", "红岭北", "八卦岭", "黄木岗", "华新", "华强北", "华强南", "赤尾", "皇岗口岸", "福民", "皇岗村", "石厦", "沙尾", "上沙", "车公庙", "农林", "安托山", "深云", "桃源村", "龙井", "珠光", "茶光", "西丽", "西丽湖"]}
{"name": "9号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["前湾", "梦海", "怡海", "荔林", "南油西", "南油", "南山书城", "深大南", "粤海门", "高新南", "红树湾南", "深湾", "深圳湾公园", "下沙", "车公庙", "香梅", "景田", "梅景", "下梅林", "梅村", "上梅林", "孖岭", "银湖", "泥岗", "红岭北", "园岭", "红岭", "红岭南", "鹿丹村", "人民南", "向西村", "文锦"]}
{"name": "9号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["文锦", "向西村", "人民南", "鹿丹村", "红岭南", "红岭", "园岭", "红岭北", "泥岗", "银湖", "孖岭", "上梅林", "梅村", "下梅林", "梅景", "景田", "香梅", "车公庙", "下沙", "深圳湾公园", "深湾", "红树湾南", "高新南", "粤海门", "深大南", "南山书城", "南油", "南油西", "荔林", "怡海", "梦海", "前湾"]}
{"name": "10号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["福田口岸", "福民", "岗厦", "莲花村", "冬瓜岭", "孖岭", "雅宝", "南坑", "光雅园", "五和", "坂田北", "贝尔路", "华为", "岗头", "雪象", "甘坑", "凉帽山", "上李朗", "木古", "华南城", "禾花", "平湖", "双拥街"]}
{"name": "10号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["双拥街", "平湖", "禾花", "华南城", "木古", "上李朗", "凉帽山", "甘坑", "雪象", "岗头", "华为", "贝尔路", "坂田北", "五和", "光雅园", "南坑", "雅宝", "孖岭", "冬瓜岭", "莲花村", "岗厦", "福民", "福田口岸"]}
{"name": "11号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["福田", "车公庙", "红树湾南", "后海", "南山", "前海湾", "宝安", "碧海湾", "机场", "机场北", "福永", "桥头", "塘尾", "马安山", "沙井", "后亭", "松岗", "碧头"]}
{"name": "11号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["碧头", "松岗", "后亭", "沙井", "马安山", "塘尾", "桥头", "福永", "机场北", "机场", "碧海湾", "宝安", "前海湾", "南山", "后海", "红树湾南", "车公庙", "福田"]}
{"name": "20号线内环", "start-time": "06:30", "end-time": "00:04", "stations": ["机场北", "国展南", "国展", "国展北", "会展城"]}
{"name": "20号线外环", "start-time": "06:30", "end-time": "00:06", "stations": ["会展城", "国展北", "国展", "国展南", "机场北"]}