如何用Python抓取北京所有电子眼名称?针对这个问题,本文详细介绍了相应的分析和解决方法,希望能帮助更多想要解决这个问题的小伙伴找到更简单易行的方法。
序
今天给大家分享一篇很实用的文章,用树叶做一张北京交通电子眼分布图,再也不怕被隐蔽摄像头拍到了。
结果如下:
这个网站可以获取全国各地区的电子眼数据。
以北京为例,我们用python对北京所有的电子眼名称进行抓取。代码如下:
URL 1=' https://www . icauto.com.cn/张伟/wzd/110000/list_1.html '
response=requests.get(url1,headers=header)
soup=美化组(response.text,' html.parser ')
results=soup.find('div ',class _=' cdz-c content ')。查找全部(' li ')
forresultinresults:
时间.睡眠(0.5)
name=result.find('a ')。文本
索引=结果。查找(' span ')。文字。split (':') [1]经过包捕获分析,可以得到根据电子眼名称获取经纬度信息的界面:
https://api.map.baidu.com/?Qt=gcwd=北京西路中坝隧道段cn=北京IE=utf-8 oue=1 from product=jsapires=apiak=S8 ss5 dbz 7 blri 3 BCVRAAYMANQXOYEO返回结果如下:
大家主要看的是coord参数,但是乍一看确实有点混乱。我不知道这是什么。查了很久才知道这是百度地图使用的墨卡托平面坐标,使用百度地图api可以转换成经纬度。转换代码如下:
URL 3=' http://API . map . Baidu.com/geoconv/v1/?Coords={}from=6to=5ak=用你的ak替换。格式(str (coord ['x'])',' str (coord ['y']))。
response=requests.get(url3,headers=header)
result=JSON . loads(response . text)[' result '][0]
lon=结果['x']
Lat=结果['y']最后,将结果保存到csv表:
withopen('dianziyan.csv ',' a ',newline=' ',encoding='gb18030')asf:
f_csv=csv.writer(f)
2.用folium标点
叶图的标点方法之前已经介绍过,请参考:
用python生成广州停车场分布图。
代码如下:
importpandasaspd
data=PD . read _ CSV(' Dian ziyan . CSV ',编码='gbk ')
进口叶
fromfoliumimportplugins
camera _ map=leaf . map(位置=[数据['纬度'])。平均值(),数据['经度']。mean()],zoom_start=1。
0,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如何爬取北京市所有电子眼名问题的解答就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/49014.html