美文网首页
2019-06-11 公交查询

2019-06-11 公交查询

作者: hcc_9bf4 | 来源:发表于2019-06-11 22:55 被阅读0次

    爬取网址: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

    相关文章

      网友评论

          本文标题:2019-06-11 公交查询

          本文链接:https://www.haomeiwen.com/subject/fzhhfctx.html