Python如何爬取北京市所有电子眼名,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
前言
今天给大家分享一篇非常实用的文章,用folium制作北京市交通电子眼分布地图,再也不怕被隐藏摄像头偷拍了
成果图如下:
此网站可以获取全国各地区的电子眼数据
我们以北京市为例,用python爬取北京市所有电子眼名称,代码如下:
url1='https://www.icauto.com.cn/weizhang/wzd/110000/list_1.html' response=requests.get(url1,headers=header) soup=BeautifulSoup(response.text,'html.parser') results=soup.find('div',class_='cdz-ccotent').find_all('li') for result in results: time.sleep(0.5) name=result.find('a').text index=result.find('span').text.split(':')[1]
经过抓包分析,可以得到根据电子眼名称获取经纬度信息的接口:
https://api.map.baidu.com/?qt=gc&wd=北京西路中坝隧道路段&cn=北京&ie=utf-8&oue=1&fromproduct=jsapi&res=api&ak=s8sS5dBsZ7bLRi3bcVRAaYMAnqlXoyeo
返回结果为:
大家主要看coord参数,刚一看确实有点懵逼,不知道这是啥玩意,我查了半天,才知道这种是百度地图采用的墨卡托平面坐标,利用百度地图api可以转化成经纬度,转化代码如下:
url3='http://api.map.baidu.com/geoconv/v1/?coords={}&from=6&to=5&ak=换成你的ak'.format(str(coord['x'])+','+str(coord['y'])) response=requests.get(url3,headers=header) result=json.loads(response.text)['result'][0] lon=result['x'] lat=result['y']
最后将结果保存到csv表格中:
with open('dianziyan.csv', 'a+', newline='', encoding='gb18030') as f: f_csv = csv.writer(f) f_csv.writerow([name, index, lon,lat])
folium地图标点的方法之前已经有介绍了,可以参考:
python生成广州全市停车场分布地图
代码如下:
import pandas as pd data=pd.read_csv('dianziyan.csv',encoding='gbk') import folium from folium import plugins Camera_map = folium.Map(location=[data['纬度'].mean(), data['经度'].mean()], zoom_start=10,control_scale=True,) incidents = folium.map.FeatureGroup() for name,row in data.iterrows(): incidents.add_child( folium.CircleMarker( #CircleMarker表示花圆 [row["纬度"], row["经度"]], #每个停车场的坐标 radius=7, #圆圈半径 color='yellow', #标志的外圈颜色 fill=True, #是否填充 fill_color='red', #填充颜色 fill_opacity=0.4, #填充透明度 ) ) Camera_map.add_child(incidents) Camera_map.save('Camera_map1.html')
经过放大后可以发现,坐标定位不是很准,有的严重偏离路线,有的甚至定位到湖里了,这是因为底图坐标和电子眼经纬度标准不统一
为了定位更准确,我们把底图和电子眼经纬度统一规范为高德地图
百度经纬度转换成高德经纬度的函数如下:
import math def bdToGaoDe(lat,lon): """ 百度经纬度转高德经纬度 :param lon: :param lat: :return: """ PI = 3.14159265358979324 * 3000.0 / 180.0 x = lon - 0.0065 y = lat - 0.006 z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * PI) theta = math.atan2(y, x) - 0.000003 * math.cos(x * PI) lon = z * math.cos(theta) lat = z * math.sin(theta) return lat,lon
读取数据,进行转换:
import pandas as pd data=pd.read_csv('dianziyan.csv',encoding='gbk') for name,row in data.iterrows(): print(bdToGaoDe(row["纬度"],row["经度"]))
将底图换成高德地图,然后将标点转换成电子眼图标:
import folium from folium import plugins Camera_map = folium.Map(location=[data['纬度'].mean(), data['经度'].mean()], zoom_start=10,zoom_control='False', tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi') incidents = folium.map.FeatureGroup() tooltip ='请点击我查看该点信息' for name,row in data.iterrows(): incidents.add_child( folium.Marker( #CircleMarker表示花圆 [bdToGaoDe(row["纬度"],row["经度"])[0],bdToGaoDe(row["纬度"],row["经度"])[1]], #每个停车场的坐标 icon=folium.Icon(color='green', prefix='fa', icon='bullseye') ) ) Camera_map.add_child(incidents) Camera_map.save('Camera_map2.html')
通过tiles可以设置不同的地图瓦片在,这里设置为高德地图瓦片
Folium.Icon类可以设置color, icon_color, icon, angle, prefix这5个参数:
color的可选项包括:[‘red’, ‘blue’, ‘green’, ‘purple’, ‘orange’, ‘darkred’, ‘lightred’, ‘beige’, ‘darkblue’, ‘darkgreen’, ‘cadetblue’, ‘darkpurple’, ‘white’, ‘pink’, ‘lightblue’, ‘lightgreen’, ‘gray’, ‘black’, ‘lightgray’] ,或者HTML颜色代码 icon_color同上 icon可以在Font-Awesome网站中找到对应的名字,并设置prefix参数为’fa’ angle以度为单位设置
只显示了北京地区的电子眼位置,感兴趣的朋友可以深入研究一下,做一张全国的交通电子眼分布图。
关于Python如何爬取北京市所有电子眼名问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。