2019-06-11 公交查询

2019-06-11  本文已影响0人  hcc_9bf4

爬取网址:url='https://wuhan.8684.cn'
层层xpath解析网页
requests应用

进入首页进行分析

获取武汉首页 以数字开头和以汉字/字母开头所有公交车(如图一)


图一

使用xpath解析,只需要获取/list+数字的list然后与url拼接就可以得到下一级的url
代码实现如下:

def parse_daohang():
    url='https://wuhan.8684.cn'
    r=requests.get(url,headers=headers)
    #解析内容,获取所有的导航链接
    tree=etree.HTML(r.text)
    #查找以数字开头的列表
    daohang_list1=tree.xpath('//div[@class="bus_kt_r1"]/a/@href')
    #查找以字母开头的列表
    daohang_list2=tree.xpath('//div[@class="bus_kt_r2"]/a/@href')
    # print(daohang_list2)
    daohang_list=daohang_list1 + daohang_list2
    # print(daohang_list)
    # print(len(daohang_list))
    return daohang_list

解析二级url

点击数字1后进入二级url=https://wuhan.8684.cn/list1在这一级url中需要获取所有以数字1开头的所有公交车,仍以xpath解析获取的url=url+'x_24f5dad9',后面字符串需要解析得到,然后拼接...如图2

图2

实现代码如下:

def parse_bus_route(content):
    tree=etree.HTML(content)
    #用xpath解析,获取每一个线路
    route_list=tree.xpath('//div[@id="con_site_1"]/a/@href')
    route_name=tree.xpath('//div[@id="con_site_1"]/a/text()')

    #遍历上面列表
    i=0
    for route in route_list:
        print('开始爬取%s线路' % route_name[i])
        route='https://wuhan.8684.cn' + route
        r=requests.get(url=route,headers=headers)
        #print(r.text)
        #解析内容,获取每一路公交的详细信息
        parse_bus_number_route(r.text)      
        print('结束爬取%s线路' % route_name[i])
        i+=1

解析三级url

通过二级url后可以获得三级url,即为最终url=https://wuhan.8684.cn/x_24f5dad9
通过这个url我们需要获得1,武汉几路公交车路线 2,运行时间 3,票价信息
4,最后更新时间 5,上行总共站数和站名,6,下行总共站数和站名,如图3

图3
实现代码如下:
#用来保存所有的线路信息
items=[]
def parse_bus_number_route(content):
    tree=etree.HTML(content)
    #获取公交车号
    bus_number=tree.xpath('//div[@class="bus_i_t1"]/h1/text()')[0].strip('&nbsp')#去掉字符串后的&nbsp
    #获取运行时间
    bus_time=tree.xpath('//p[@class="bus_i_t4"][1]/text()')[0]
    #获取票价
    bus_price=tree.xpath('//p[@class="bus_i_t4"][2]/text()')[0]
    #获取更新时间
    gxsj=tree.xpath('//p[@class="bus_i_t4"][4]/text()')[0]
    #获取上行总数
    sxzs_1=tree.xpath('//span[@class="bus_line_no"]/text()')
    a=sxzs_1[0]
    sxzs=a.replace('\xa0','') #去掉字符串中间&nbsp,以空格代替
    #上行线路站名
    bus_route_s=tree.xpath('//div[@class="bus_line_site "][1]/div/div//text()') #注意xpath中的空格,否则会匹配为空
    #如果没有下行列表返回一个空列表
    try:
        #获取下行总数
        xxzs_1=tree.xpath('//span[@class="bus_line_no"]/text()')
        b=xxzs_1[1]
        xxzs=b.replace('\xa0','') #去掉字符串中间&nbsp,以空格代替
        #反行线路名称
        bus_route_x=tree.xpath('//div[@class="bus_line_site "][2]/div/div//text()') #注意xpath中的空格,否则会匹配为空
    except Exception as e:
        xxzs = ''
        bus_route_x = []
    #将每条公交的线路存放到字典中
    item={
        '几路公交车线': bus_number,
        '公交运行时间': bus_time,
        '公交票价': bus_price,
        '更新时间': gxsj,
        '上行总战数': sxzs,
        '下行总战数': xxzs,
        '所有上行公交站台':bus_route_s,
        '所有下行公交站台': bus_route_x,
        }
    items.append(item)

完整代码如下:

import requests
from lxml import etree

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    }
#用来保存所有的线路信息
items=[]
def parse_bus_number_route(content):
    tree=etree.HTML(content)
    #获取公交车号
    bus_number=tree.xpath('//div[@class="bus_i_t1"]/h1/text()')[0].strip('&nbsp')#去掉字符串后的&nbsp
    #获取运行时间
    bus_time=tree.xpath('//p[@class="bus_i_t4"][1]/text()')[0]
    #获取票价
    bus_price=tree.xpath('//p[@class="bus_i_t4"][2]/text()')[0]
    #获取更新时间
    gxsj=tree.xpath('//p[@class="bus_i_t4"][4]/text()')[0]
    #获取上行总数
    sxzs_1=tree.xpath('//span[@class="bus_line_no"]/text()')
    a=sxzs_1[0]
    sxzs=a.replace('\xa0','') #去掉字符串中间&nbsp,以空格代替
    #上行线路站名
    bus_route_s=tree.xpath('//div[@class="bus_line_site "][1]/div/div//text()') #注意xpath中的空格,否则会匹配为空
    #如果没有下行列表返回一个空列表
    try:
        #获取下行总数
        xxzs_1=tree.xpath('//span[@class="bus_line_no"]/text()')
        b=xxzs_1[1]
        xxzs=b.replace('\xa0','') #去掉字符串中间&nbsp,以空格代替
        #反行线路名称
        bus_route_x=tree.xpath('//div[@class="bus_line_site "][2]/div/div//text()') #注意xpath中的空格,否则会匹配为空
    except Exception as e:
        xxzs = ''
        bus_route_x = []
    #将每条公交的线路存放到字典中
    item={
        '几路公交车线': bus_number,
        '公交运行时间': bus_time,
        '公交票价': bus_price,
        '更新时间': gxsj,
        '上行总战数': sxzs,
        '下行总战数': xxzs,
        '所有上行公交站台':bus_route_s,
        '所有下行公交站台': bus_route_x,
        }
    items.append(item)
def parse_bus_route(content):
    tree=etree.HTML(content)
    #用xpath解析,获取每一个线路
    route_list=tree.xpath('//div[@id="con_site_1"]/a/@href')
    route_name=tree.xpath('//div[@id="con_site_1"]/a/text()')

    #遍历上面列表
    i=0
    for route in route_list:
        print('开始爬取%s线路' % route_name[i])
        route='https://wuhan.8684.cn' + route
        r=requests.get(url=route,headers=headers)
        #print(r.text)
        #解析内容,获取每一路公交的详细信息
        parse_bus_number_route(r.text)      
        print('结束爬取%s线路' % route_name[i])
        i+=1
def parse_daohang():
    url='https://wuhan.8684.cn'
    r=requests.get(url,headers=headers)
    #解析内容,获取所有的导航链接
    tree=etree.HTML(r.text)
    #查找以数字开头的列表
    daohang_list1=tree.xpath('//div[@class="bus_kt_r1"]/a/@href')
    #查找以字母开头的列表
    daohang_list2=tree.xpath('//div[@class="bus_kt_r2"]/a/@href')
    # print(daohang_list2)
    daohang_list=daohang_list1 + daohang_list2
    # print(daohang_list)
    # print(len(daohang_list))
    return daohang_list
def parse_bus(daohang_list):
    #遍历上面的列表,依次发送请求。解析内容,获取每一页面所有的公交url
    for first_url in daohang_list:
        first_url='https://wuhan.8684.cn' + first_url
        print('开始爬取%s所有的公交信息' % first_url)
        r=requests.get(url=first_url,headers=headers)
        #print(r.text)
        #解析内容,获取每页公交的详细url
        parse_bus_route(r.text)
        print('结束爬取%s所有的公交信息' % first_url)
def main():
    #爬取第一页所有的导航链接
    daohang_list=parse_daohang()

    #爬取第二页所有导航链接
    bus_list=parse_bus(daohang_list)
    #爬取完毕
    #在本地txt文件中按顺序以utf8格式写入
    fp=open('武汉公交.txt','w',encoding='utf8')
    for item in items:
        fp.write(str(item) + '\n')
    fp.close()
if __name__ == '__main__':
    main()

运行后得到的txt为:


武汉公交.txt
上一篇下一篇

猜你喜欢

热点阅读