爬取网址: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
实现代码如下:
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
实现代码如下:
#用来保存所有的线路信息
items=[]
def parse_bus_number_route(content):
tree=etree.HTML(content)
#获取公交车号
bus_number=tree.xpath('//div[@class="bus_i_t1"]/h1/text()')[0].strip(' ')#去掉字符串后的 
#获取运行时间
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','') #去掉字符串中间 ,以空格代替
#上行线路站名
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','') #去掉字符串中间 ,以空格代替
#反行线路名称
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(' ')#去掉字符串后的 
#获取运行时间
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','') #去掉字符串中间 ,以空格代替
#上行线路站名
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','') #去掉字符串中间 ,以空格代替
#反行线路名称
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
网友评论