#爬取網站 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()

