騰訊街景數據爬蟲


目前騰訊為大家提供了海量的街景數據,並對其服務接口做出了詳細的說明(https://lbs.qq.com/uri_v1/guide-showPano.html)。

  需要注意的是這里的referer需改為key,至於后邊key對應的值需自己注冊自己應用的key值。地址:https://lbs.qq.com/dev/console/key/manage

 

 

請求連接:

https://apis.map.qq.com/ws/streetview/v1/image?size=640x480&pano=10141050150725145721000&heading=0&pitch=0&key=K76BZ-W3O2Q-RFL5S-GXOPR-3ARIT-6KFE5

瀏覽器請求結果:

直接輸入連接則會失敗,需設置請求頭。

失敗效果圖:

成功效果圖:(設置Referer)

Python源代碼

說明:

  本次實驗主要需對武漢、北京等地區的街景數據爬蟲,采用的核心方法如下:

  1. 采用市區最小外包矩形坐標限定拾取街景范圍;
  2. 坐標采用wgs84轉高德火星坐標的方式,坐標千分位依次遞增1的方式逐點查詢街景圖片ID;
  3. 根據街景ID獲取圖片並保存;

  本文並未進行斷點續爬以及相同街景去重操作,后續將完善;

  騰訊該接口並不穩定,維護時間距今較長,服務調用不易成功不建議使用該服務;

# coding=utf-8
import math
import requests
import urllib
from urllib.request import urlopen
import threading
from optparse import OptionParser
import cv2
try:
    import urlparse
except ImportError:
    import urllib.parse as urlparse
import numpy as np


#發送請求保存照片
def download(url, name):
    # url='https://apis.map.qq.com/ws/streetview/v1/image?size=640x480&pano=10141031130101141134000&heading=0&pitch=0&key=K76BZ-W3O2Q-RFL5S-GXOPR-3ARIT-6KFE5'
    # 將user_agent,referer寫入頭信息
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36','Referer':'https://lbs.qq.com/tool/streetview/streetview.html'}
    images = requests.get(url, headers=headers)
    img = images.content
    if images.status_code == 200:
        print('圖片: %s%s 正在下載..' % ('張颯','xin'))
        with open(name,'wb') as fp:
            fp.write(img)
# wgs84轉高德
def wgs84togcj02(lng, lat):
    PI = 3.1415926535897932384626
    ee = 0.00669342162296594323
    a = 6378245.0
    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]
# GCJ02/谷歌、高德 轉換為 WGS84 gcj02towgs84
def gcj02towgs84(localStr):
    lng = float(localStr.split(',')[0])
    lat = float(localStr.split(',')[1])
    PI = 3.1415926535897932384626
    ee = 0.00669342162296594323
    a = 6378245.0
    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 str(lng * 2 - mglng) + ',' + str(lat * 2 - mglat)
def transformlat(lng, lat):
    PI = 3.1415926535897932384626
    ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * \
          lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(lng))
    ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 *
            math.sin(2.0 * lng * PI)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lat * PI) + 40.0 *
            math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
    ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 *
            math.sin(lat * PI / 30.0)) * 2.0 / 3.0
    return ret
def transformlng(lng, lat):
    PI = 3.1415926535897932384626
    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
          0.1 * lng * lat + 0.1 * math.sqrt(abs(lng))
    ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 *
            math.sin(2.0 * lng * PI)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lng * PI) + 40.0 *
            math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
    ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 *
            math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
    return ret

#獲取經緯坐標
def getPoint(_points):
    point = _points.split(',')
    point_jin = point[0]
    point_wei = point[1]
    transOpints=wgs84togcj02(float(point_jin),float(point_wei))
    return transOpints

# 輸入左下以及右上角坐標 根據兩點形成等差坐標組 進而獲取圖片
def getImage(start_point,end_point,cityName):
    # 取得起始坐標
    start_point_jin = start_point[0]
    start_point_wei = start_point[1]
    end_point_jin = end_point[0]
    end_point_wei = end_point[1]
    #創建等差數組
    jins = np.arange(float(start_point_jin)*1000, float(end_point_jin)*1000, 1)*0.001
    jins_num = len(jins)
    weis = np.linspace(float(start_point_wei)*1000, float(end_point_wei)*1000, jins_num)*0.001
    weis_num = len(weis)
    for jins_i in range(jins_num):
        jin = jins[jins_i]
        for weis_i in range(weis_num):
            wei = weis[weis_i]
            #這里要注意下,對應的經緯度沒有街景圖的地方,輸出的會是無效圖片
            print(jin, wei)
            img_name = "E:\\dataTest\\streetImgData\\"+cityName+"\\" + str(wei) + "_" + str(jin) +".jpg"
            url = "https://apis.map.qq.com/ws/streetview/v1/image?size=600x480&location="+str(wei)+","+str(jin)+"&pitch=0&heading=0&key=E2BBZ-AEB6U-ONRVX-4PBS3-CZIHK-A7FJI"
            outimg = download(url, img_name)

#定義數據字典 根據起始點坐標推算內容坐標
cityJinweiArr=[{"start":"115.442845,39.464988","end":"117.498766,40.978318","city":"beiJing"},{"start":"112.681398,34.269097","end":"114.226897,34.958295","city":"zhengZhou"},{"start":"113.692462,29.971956","end":"115.082138,31.362241","city":"wuHan"}]
for city in cityJinweiArr:
    start_point=getPoint(city['start'])
    end_point=getPoint(city['end'])
    cityName=city['city']
    getImage(start_point,end_point,cityName)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM