之前用.Net做過一些自動化爬蟲程序,聽大牛們說使用python來寫爬蟲更便捷,按捺不住抽空試了一把,使用Python抓取百度街景影像。
這兩天,武漢迎來了一個德國總理默克爾這位大人物,又刷了一把武漢長江大橋,今天就以武漢長江大橋爲例,使用Python抓取該位置的街景影像。
百度街景URL分析
基於http抓包工具,可以很輕鬆的獲取到瀏覽百度街景時的http請求數據。如下圖所示,即是長江大橋某位置點街景影像切片:
該切片對應的URL請求爲:
細緻分析該URL請求,並經過模擬測試,可以總結出如下初步結論
請求影像切片所需的幾個關鍵參數分別爲:
① sid:代表某個具體的街景點位;
② pos:代表該切片在完整的全景影像圖上的切片座標;
③ z:代表街景影像切片級別。
單個位置的街景影像圖可以生產出多種級別的切片,不同的級別下,切片的數量是不同的;切片的座標使用行號、列號予以區分。
明確了以上百度街景影像的切片規則,就可以用代碼開擼了。
Python源碼
要求:一次性抓取連續10個全景點的所有級別切片信息。
源碼如下:
import urllib2 import threading from optparse import OptionParser # from bs4 import BeautifulSoup import sys import re import urlparse import Queue import hashlib import os def download(url, path, name): conn = urllib2.urlopen(url) if not os.path.exists(path): os.makedirs(path) f = open(path + name, 'wb') f.write(conn.read()) f.close() fp = open("E:\\Workspaces\\Python\\panolist.txt", "r") for line in fp.readlines(): line = (lambda x: x[1:-2])(line) # url = line for zoom in range(1, 6): row_max = 0 col_max = 0 row_max = pow(2, zoom - 2) if zoom > 1 else 1 col_max = pow(2, zoom - 1) for row in range(row_max): for col in range(col_max): z = str(zoom) y = str(row) x = str(col) print(y + "_" + x) url = line + "&pos=" + y + "_" + x + "&z=" + z path = "E:\\Workspaces\\Python\\pano\\" + url.split('&')[1].split('=')[1] + "\\" + z + "\\" name = y + "_" + x + ".jpg" print url print name download(url, path, name) fp.close()
抓取結果如下,按上述分析的規則進行本地化存儲,可以看到各級別下,所有的切片拼接起來,剛好是一張完整的全景圖。
小結
① Python這門語言真的是蠻便捷,安裝和配置都十分方便,也有很多IDE都支持,我初次使用,遇上問題就隨手查Python語言手冊,基本上半天完成該代碼示例。
② 在爬蟲程序方面,Python相關資源十分豐富,是爬蟲開發的一把利器。
上述代碼簡要的實現了批量抓取百度街景影像切片數據,大量使用的話,建議繼續處理一下,加上模擬瀏覽器訪問的處理,否則很容易被服務方直接偵測到來自網絡爬蟲的資源請求,而導致封堵。
附 python爬蟲入門(一)urllib和urllib2 https://www.cnblogs.com/derek1184405959/p/8448875.html