网址:https://beijing.8684.cn/
通过点击1,2,3等发现网址为https://beijing.8684.cn/list1,2,3。
点击某一路,如10路,网址为https://beijing.8684.cn/x_8234e473。。采用quote(wd, encoding=“utf-8”)这样,还是不一样,笔者比较菜,应该是编码的问题,有谁知道欢迎留言。
本博客的思路就成了,首先获取1-9开头的公交的所有网址,而后通过解析获取,某路的站点信息,描述信息等。站点的经纬度信息通过百度API获取。
import requests
from urllib.parse import quote
import re
import pandas as pd
#x_5085a6b6
import time
def get_data(ur):
url=r'https://beijing.8684.cn/x_'+ur
da=requests.get(url)
da.encoding='utf-8'
da=da.text
return da
def extract_info(da):
Class = re.findall('<h1 class="title">(.*)<a href="/line1', da, re.S)
category=re.findall('<a href="/line1" class="category">(.*)</a></h1>',da)
descr=re.findall('<ul class="bus-desc"><li>(.*)</li><li>票价',da)
price_descr=re.findall('票价信息:(.*)</li><li>公交公司',da)
print(Class[0],category[0],descr[0],price_descr[0])
stas=re.findall('</div><div class="bus-lzlist mb15"><ol><li><a href="/(.*)</a></li></ol><!-- </ol> --></div><!----><div class="bus-excerpt mb15">',da)
dd=str(stas).split('</a></li><li><a href="/')
pat=re.compile(r'[\u4e00-\u9fa5]+')
t=pat.findall(str(dd))
sts=[]
for i in range(0,len(t)):
sts.append(t[i])
#
return sts
# trip=re.findall('<div class="trip">(.*)</div></div><div class="other fr"><div class="total"',da)
def get_lat_lon(address):
url= 'http://api.map.baidu.com/geocoder?output=json&key=f247cdb592eb43ebac6ccd27f796e2d2&address='+str(address)
response = requests.get(url)
answer = response.json()
lon = float(answer['result']['location']['lng'])
lat = float(answer['result']['location']['lat'])
# print(address,lat,lon)
return lat,lon
def get_bus_num_url(i):
url=r'https://beijing.8684.cn/list'+str(i)
da=requests.get(url)
da.encoding='utf-8'
da=da.text
dd=re.findall('<a href="/x_(.*)" title="北京(.*)路公交车路线">',da)
a=str(dd).split('</a><a href="/x')
for add in a[:-1]:
ur=re.findall('[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]+',add)[0]
route=re.findall('title=(.*)>',str(add))
# print(route[0],ur)
url_dic[route[0]]=ur
url_dic={}
for i in range(5,10):
# print(i)
get_bus_num_url(i)
result= pd.DataFrame(columns = ['站点','经度','纬度'])
keys=url_dic.keys()
for key in keys:
try:
da=get_data(url_dic[key])
sts=extract_info(da)
for add in sts:
# print(address)
address='北京市'+add
lat,lon=get_lat_lon('北京市'+address)
print(address,lat,lon)
result=result.append({'站点':add,'经度':lat,'纬度':lon},ignore_index=True)
except:
pass
效果图
笔者对爬虫涉猎不多,代码能力也很粗糙,欢迎大佬批评指正。读者可将这些信息保存只表中,有了经纬度信息,就可利用arcgis软件进行数字化展示。