Python爬取北京市所有电子眼名,再也不怕被隐藏摄像头偷拍
本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理。
以下文章來源于python數據分析之禪 ,作者小dull鳥
?
前言
今天給大家分享一篇非常實用的文章,用folium制作北京市交通電子眼分布地圖,再也不怕被隱藏攝像頭偷拍了
成果圖如下:
?
主要分為以下2個步驟:
1.電子眼地理數據獲取
網址如下:
https://www.icauto.com.cn/weizhang/wzd/110000/?
此網站可以獲取全國各地區的電子眼數據
我們以北京市為例,用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').textindex=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])?
2.用folium標點
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.0x?=?lon?-?0.0065y?=?lat?-?0.006z?=?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爬取北京市所有电子眼名,再也不怕被隐藏摄像头偷拍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年软考程序员考试大纲
- 下一篇: AndroidStudio之自定义Pre