【文末赠书】我背着女朋友,用 Python 偷偷抓取了她的行踪
1
目 標 場 景
有時候女朋友一個人在外面玩耍,問她在哪個地方,就是不告訴我。但是,你又很想知道女朋友的「位置」,這該如何是好?
其實你可以這樣套路女朋友,假裝自己在家很無聊,可以幫她修圖,讓她微信發原圖給你,拿到「微信原圖」后,你就可以利用 Python 快速獲取到女友的具體位置了。
2
準 備 工 作
首先,在虛擬環境中安裝識別圖片元數據的庫。
pip3?install?exifread然后,進入高德開放平臺,申請一個 Web 服務的應用,獲取到一個 「Key」用于逆地理編碼 API。
3
編? 寫? 腳? 本
整個操作分為 3 步驟,分別是獲取圖片的經度和緯度、對經度和緯度進行數據矯正、調用高德逆地理編碼 API 獲取具體位置。
第 1 步,獲取圖片的「經度和緯度」。
使用?exifread 庫可以直接讀取圖片文件,獲取到圖片的元數據,包含經度、緯度、南北緯方向、東西經方向和拍攝時間。
#?使用?exifread?獲取圖片的元數據 img_exif?=?exifread.process_file(open(self.img_path,?'rb'))#?能夠讀取到屬性 if?img_exif:#?緯度數latitude_gps?=?img_exif['GPS?GPSLatitude']#?N,S?南北緯方向latitude_direction?=?img_exif['GPS?GPSLatitudeRef']#?經度數longitude_gps?=?img_exif['GPS?GPSLongitude']#?E,W?東西經方向longitude_direction?=?img_exif['GPS?GPSLongitudeRef']#?拍攝時間take_time?=?img_exif['EXIF?DateTimeOriginal']如果元數據存在,然后判斷拍攝時間是否合理。如果拍攝時間不在今天,那只能很遺憾地通知你,你的女朋友在向你撒謊「撒謊」。
def?judge_time_met(self,?take_time):"""判斷拍攝時間是否是在今天:param?take_time::return:"""#?拍攝時間format_time?=?str(take_time).split("?")[0].replace(":",?"-")#?當天日期today?=?str(datetime.date.today())if?format_time?==?today:return?Trueelse:return?Falseif?is_lie:print('很遺憾的通知你,你的女朋友在撒謊!!!')return如果女友沒有撒謊,那么可以進行第 2 步的操作。
因為通過 GPS 獲取的經度、緯度和高德地圖的坐標存在一定的誤差,這里需要把坐標轉換為「火星坐標系」。
x_pi?=?3.14159265358979324?*?3000.0?/?180.0 pi?=?3.1415926535897932384626??#?π a?=?6378245.0??#?長半軸 ee?=?0.00669342162296594323??#?扁率def?wgs84togcj02(lng,?lat):"""WGS84轉GCJ02(火星坐標系):param?lng:WGS84坐標系的經度:param?lat:WGS84坐標系的緯度:return:"""if?out_of_china(lng,?lat):??#?判斷是否在國內return?lng,?latdlat?=?transformlat(lng?-?105.0,?lat?-?35.0)dlng?=?transformlng(lng?-?105.0,?lat?-?35.0)radlat?=?lat?/?180.0?*?pimagic?=?math.sin(radlat)magic?=?1?-?ee?*?magic?*?magicsqrtmagic?=?math.sqrt(magic)dlat?=?(dlat?*?180.0)?/?((a?*?(1?-?ee))?/?(magic?*?sqrtmagic)?*?pi)dlng?=?(dlng?*?180.0)?/?(a?/?sqrtmagic?*?math.cos(radlat)?*?pi)mglat?=?lat?+?dlatmglng?=?lng?+?dlngreturn?[mglng,?mglat]另外需要注意的是,接口中經度、緯度參數只能識別小數點后 6 位,需要對經緯度中的度、分、秒做一定的數據處理,然后再進行四舍五入。
def?__format_lati_long_data(self,?data):"""對經度和緯度數據做處理,保留6位小數:param?data:?原始經度和緯度值:return:"""#?刪除左右括號和空格data_list_tmp?=?str(data).replace('[',?'').replace(']',?'').split(',')data_list?=?[data.strip()?for?data?in?data_list_tmp]#?替換秒的值data_tmp?=?data_list[-1].split('/')#?秒的值data_sec?=?int(data_tmp[0])?/?int(data_tmp[1])?/?3600#?替換分的值data_tmp?=?data_list[-2]#?分的值data_minute?=?int(data_tmp)?/?60#?度的值data_degree?=?int(data_list[0])#?由于高德API只能識別到小數點后的6位#?需要轉換為浮點數,并保留為6位小數result?=?"%.6f"?%?(data_degree?+?data_minute?+?data_sec)return?float(result)第 3 步,調用高德的反地理編碼 API,傳入申請的應用 Key,就能拿到女朋友的詳細地址。
def?__get_address(self,?location):"""根據坐標得到詳細地址:param?location:?經緯度值:return:"""resp?=?requests.get(self.url_get_position.format(self.api_key,?location))location_data?=?json.loads(resp.text)address?=?location_data.get('regeocode').get('formatted_address')return?address4
結 果 結 論
確保圖片是原圖的基礎上,可以快速幫你判斷女朋友是否在撒謊;如果女朋友沒有撒謊,就返回女朋友具體的位置。
全部源碼已上傳到后臺上,關注公眾號后回復「?圖片定位?」即可獲得。
[ 完 ]今日贈送書籍
Python網絡爬蟲從入門到實踐
內容簡介: 本書講解了如何使用Python編寫網絡爬蟲,涵蓋爬蟲的概念、Web基礎、Chrome、Charles和Packet Capture抓包、urllib、Requests請求庫、lxml、Beautiful Soup、正則表達式解析數據、CSV、Excel、MySQL、Redis、MongoDB保存數據、反爬蟲策略應對、爬蟲框架Scrapy的使用與部署,以及應用案例。今日留言主題
你用Python做過哪些有趣的事情?
總結
以上是生活随笔為你收集整理的【文末赠书】我背着女朋友,用 Python 偷偷抓取了她的行踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lattice学习笔记-CmosToMi
- 下一篇: 车牌识别(MATLAB)