爬取某城市公交錢路--xpath過濾


#爬取網站  m.8684.cn/bus_switch 公交線路  鄭州
import requests
import time
from lxml import etree

#列表保存所有線路信息
items = []

#添加頭部  作為全局
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}


#爬取第一頁所有導航的鏈接
def parse_navigation():
    #在這里可以換你想要的爬的城市網址
    url = "https://zhengzhou.8684.cn/"
    r = requests.get(url=url,headers=headers)
    # print(r.text)
    # exit()
    #解析內容,獲取所有導航鏈接
    tree = etree.HTML(r.text)
    #過濾  獲取鏈接
    #查找以數字、字母開頭的所有鏈接返回   使用過濾標簽值的方法尋找
    number_href_list = tree.xpath('//a[starts-with(@href,"/list")]/@href')
    # print(number_href_list)
    # exit()
    return number_href_list


#三級route回傳數據解析  獲取每一路公交的詳細信息  最后一級
def parse_sanji_route(content):
    tree = etree.HTML(content)
    #依次過濾獲取各個內容
    #線路名稱
    bus_number = tree.xpath('//div[@class ="info"]/h1[@class ="title"]/text()')
    # print(bus_number)
    # exit()
    #獲取運行時間
    run_time = tree.xpath('//ul[@class="bus-desc"]/li[1]/text()')
    # print(run_time)
    # exit()
    #獲取票價信息
    ticket_info = tree.xpath('//ul[@class="bus-desc"]/li[2]/text()')
    # print(ticket_info)
    # exit()
    #獲取更新時間
    gxsj = tree.xpath('//ul[@class="bus-desc"]/li[4]/text()')
    # print(gxsj)
    # exit()
    #獲取上行總站數
    up_total = tree.xpath('//div[@class="total"]/text()')[0]
    #print(up_total)
    # exit()
    #獲取上行所有站名
    up_name_list = tree.xpath('//div[@class="bus-lzlist mb15"][1]/ol/li/a/text()')
    print(up_name_list)
    # exit()


    try:
        #獲取下行總站數
        down_total = tree.xpath('//div[@class="total"]/text()')[1]
        #print(down_total)
        # exit()
        #獲取下行所有站名
        down_name_list = tree.xpath('//div[@class="bus-lzlist mb15"][2]/ol/li/a/text()')
        # print(down_name_list)
        # exit()
    except Exception as e:
        down_total = []
        down_name_list="環形公交,與上行一致"
    #將每一條線路信息寫入字典
    item = {
        '線路名稱':bus_number,
        '運行時間':run_time,
        '票價信息':ticket_info,
        '更新時間':gxsj,
        '上行總站數':up_total,
        '上行所有站名':up_name_list,
        '下行總站數':down_total,
        '下行所有站名':down_name_list
    }
    items.append(item)

#解析二級爬取url的內容  獲取每一路公交的詳細url
def parse_erji_route(content):
    tree = etree.HTML(content)
    #寫xpath獲取每一個線路
    route_list = tree.xpath('//div[@class ="list clearfix"]//a/@href')
    route_name = tree.xpath('//div[@class ="list clearfix"]//a/text()')
    i=0
    # print(route_list)
    # exit()
    #遍歷 發送請求
    for route in route_list:
        print("開始爬取%s線路" %route_name[i])
        route = "https://zhengzhou.8684.cn" + route
        r = requests.get(url=route,headers=headers)
        # print(r.text)
        # exit()
        #解析內容 獲取每一路公交的詳細信息
        parse_sanji_route(r.text)
        print("結束爬取%s線路" %route_name[i])
        i+=1

#二級url爬取
def parse_erji(navi_list):
    #便利上面的列表,依次發送請求,解析內容  獲取每一個頁面所有的公交路線
    for end_url in navi_list:
        end_url = "https://zhengzhou.8684.cn" + end_url
        print("開始爬取 %s 所有的公交信息" %end_url)
        #print(end_url)
        #exit()
        r = requests.get(url=end_url,headers=headers)
        #解析內容,獲取每一路公交的詳細url
        parse_erji_route(r.text)
        print("結束爬取 %s 所有的公交信息" %end_url)

#定義主函數
def main():
    #爬取第一頁所有導航鏈接
    navi_list = parse_navigation()
    #爬取二級頁面,找到所有公交線路的url
    parse_erji(navi_list)
    #爬取完畢 寫入
    fp = open('鄭州公交.txt','w',encoding="utf8")
    for item in items:
        fp.write(str(item)+'\n')
    fp.close()

if __name__ == '__main__':
    main()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM