Python定向抓取地铁路线资源程序

678 篇文章 329 订阅

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 孙艺方

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入

地铁线路网址的获取

首先导入库bs4、lxml、requests:

import requests
import json
from bs4 import BeautifulSoup
import lxml.html

获取地铁路线网址

etree = lxml.html.etree
def get_urls():
    url = 'https://dt.8684.cn/so.php?k=pp&dtcity=sz&q=wedwed'
    response = requests.get(url=url)
    soup = BeautifulSoup(response.content, 'lxml').find(attrs={'class': 'fs-fdLink'})
    #为创建BeautifulSoup对象,其意义是将发送网络请求返回的响应数据创建为soup对象,数据格式为lxml。
    routes = soup.find('tr').find('td').findAll('a')# 查找所有有关的节点
    route_list = []
    for i in routes:
        per = {}
        per['key'] = i.string
        per['value'] = 'https://dt.8684.cn' + i.get('href')
        route_list.append(per)
    return route_list

具体线路下线路数据的获取

def get_schedule(url):
    response = requests.get(url['value'])
    soup = BeautifulSoup(response.content, 'lxml').find(attrs={'class': 'ib-mn'})
    table_head = soup.find(attrs={'class': 'pi-table tl-table'})
    per_info = table_head.findAll('tr')
    route_list = []
    if (url['key'].find('内圈') == -1 and url['key'].find('外圈') == -1):#地铁线路名称既无内环也无外环
        route_info = {} #定义地铁内环字典
        route_info_wai = {}#定义地铁外环字典
        stations_nei = [] #定义地铁内环站台列表
        route_info['name'] = url['key'] + '内环'#定义内环线路字典name键的值
        route_info_wai['name'] = url['key'] + '外环'# 定义外环线路字典name键的值
        time_nei_1 = []#定义地铁内环发车时间列表
        time_nei_2 = []#定义地铁内环收班时间列表
        time_wai_1 = [] #定义地铁外环发车时间列表
        time_wai_2 = []# 定义地铁外环收班时间列表
        for i in per_info:
            if (i != []):
                j = i.findAll('td')
                if (j != []):
                    for k in j[0]:
                        stations_nei.append(k.text)#内外环站点名
                    for k in j[3]:
                        time_nei_2.append(k)#内环收车时间
                    for k in j[1]:
                        time_nei_1.append(k)#内环发车时间
                    for k in j[4]:
                        time_wai_2.append(k) #外环收车时间
                    for k in j[2]:
                        time_wai_1.append(k)#外环发车时间
        try:
            if (time_nei_1[0] != '--' and time_nei_1[0] != '—'):
                route_info['startTime'] = startTime = time_nei_1[0]#筛除地铁内环线路发车时间为空的数值
            else:
                route_info['startTime'] = time_nei_1[1]#定义地铁内环线路发车时间
            if (time_nei_2[len(time_nei_2) - 1] != '--' and time_nei_2[len(time_nei_2) - 1] != '—'):
                route_info['endTime'] = time_nei_2[len(time_nei_2) - 1]#筛除地铁内环线路收车时间为空的数值
            else:
                route_info['endTime'] = time_nei_2[len(time_nei_2) - 2]# 定义地铁内环线路收车时间
            if (time_wai_1[len(time_wai_1) - 1] != '--' and time_wai_1[len(time_wai_1) - 1] != '—'):
                route_info_wai['startTime'] = time_wai_1[len(time_wai_1) - 1]# 筛除地铁外环线路发车时间为空的数值
            else:
                route_info_wai['startTime'] = time_wai_1[len(time_wai_1) - 2]# 定义地铁外环线路发车时间
            if (time_wai_2[0] != '--' and time_wai_2[0] != '—'):
                route_info_wai['endTime'] = startTime = time_wai_2[0]# 筛除地铁外环线路收车时间为空的数值
            else:
                route_info_wai['endTime'] = time_wai_2[1]# 定义地铁外环线路收车时间
        except IndexError as e:
            route_info_wai['startTime'] = '06:00'
            route_info_wai['endTime'] = '23:00'
            route_info['startTime'] = '06:00'
            route_info['endTime'] = '23:00'#若无法找到数据,则捕捉索引异常错误,并对运行时间赋默认值

        route_info['stations'] = stations_nei #内环线路字典stations值赋为内环站点名
        route_info_wai['stations'] = list(reversed(stations_nei))#反转列表值并强制转换数据类型为列表,作为外环站点名
        route_list.append(route_info)
        route_list.append(route_info_wai)#将内外环线路字典插入列表
    else:
    #地铁线路名称包含“内环”或“外环”
        route_info = {}
        stations = []
        route_info['name'] = url['key']# 定义线路字典name键的值
        time_1 = [] # 定义地铁发车时间列表
        time_2 = []#定义地铁收车时间列表
        for i in per_info:
            if (i != []):
                j = i.findAll('td')
                if (j != []):# 筛除表头相关空数据
                    for k in j[0]:
                        stations.append(k.text)#地铁线路站点名
                    for k in j[1]:
                        time_1.append(k)#地铁线路发车时间
                    for k in j[2]:
                        time_2.append(k)#地铁线路收车时间
        if (time_1[0] != '--' and time_1[0] != '—'):
            route_info['startTime'] = startTime = time_1[0]# 筛除地铁线路发车时间为空的数值
        else:
            route_info['startTime'] = time_1[1]#定义地铁线路发车时间
        if (time_2[len(time_2) - 1] != '--' and time_2[len(time_2) - 1] != '—'):
            route_info['endTime'] = time_2[len(time_2) - 1]#筛除地铁线路收车时间为空的数值
        else:
            route_info['endTime'] = time_2[len(time_2) - 2]#定义地铁线路收车时间
        route_info['stations'] = stations# 线路字典stations值赋为站点名
        route_list.append(route_info)#将线路字典插入列表
    return route_list

其中,if语句(Part2的大部分代码)都是用于对非常规线路数据进行特殊处理,这也印证了“80%的代码处理20%的情况”,常规线路数据只需前六行代码即可爬取,最终返回线路列表rout_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号线内环”, “startTime”: “06:30”, “endTime”: “00:04”,
“stations”: [“罗湖”, “国贸”, “老街”, “大剧院”, “科学馆”, “华强路”, “岗厦”, “会展中心”,
“购物公园”, “香蜜湖”, “车公庙”, “竹子林”, “侨城东”, “华侨城”, “世界之窗”, “白石洲”, “高新园”, “深大”,
“桃园”, “大新”, “鲤鱼门”, “前海湾”, “新安”, “宝安中心”, “宝体”, “坪洲”, “西乡”, “固戍”, “后瑞”,
“机场东”]}

以上就是本期的全部内容了,希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值