我揹著女朋友,用 Python 偷偷抓取了她的行蹤

2021-09-27 11:40:54 字數 3896 閱讀 4945

第一時間獲取 python 技術乾貨!

有時候女朋友乙個人在外面玩耍,問她在哪個地方,就是不告訴我。但是,你又很想知道女朋友的「位置」,這該如何是好?

首先,在虛擬環境中安裝識別元資料的庫。

pip3 install exifread
然後,進入高德開放平台,申請乙個 web 服務的應用,獲取到乙個 「key」用於逆地理編碼 api。

整個操作分為 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 true

else:

return false

if 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, lat

dlat = transformlat(lng - 105.0, lat - 35.0)

dlng = transformlng(lng - 105.0, lat - 35.0)

radlat = lat / 180.0 * pi

magic = math.sin(radlat)

magic = 1 - ee * magic * magic

sqrtmagic = 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 + dlat

mglng = lng + dlng

return [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 address

確保是原圖的基礎上,可以快速幫你判斷女朋友是否在撒謊;如果女朋友沒有撒謊,就返回女朋友具體的位置。

我用python爬情頭,來哄女朋友開心

這是我爬了乙個多小時的成果 話不多說上 import time import requests from bs4 import beautifulsoup import shutil import string import os import random import random import...

python實戰,教你用微信每天給女朋友說晚安

但凡一件事,稍微有些重複,我就考慮怎麼樣用程式來實現它。最好執行在伺服器上,這樣後台掛起來更方便。準備 pip installwxpy pip installrequests 如下 fromfutureimport unicode literals from threading import tim...

如和用python給女朋友做個專屬她的軟體

在學習python的路上如果覺得枯燥就可以想我一樣做一些有趣的事情就不會無聊了 python是一門及其有趣的語言。人們都喜歡記住一些重要的日子,比如說跟女朋友認識的日子,結婚紀念日 周年紀念日等等。人們都喜歡下個軟體來計算而我偏偏喜歡自己寫個,接下來我將介紹如何設計這個軟體以及如何打包成exe檔案給...