以前用.Net作過一些自動化爬蟲程序,聽大牛們說使用python來寫爬蟲更便捷,按捺不住抽空試了一把,使用Python抓取百度街景影像。html
這兩天,武漢迎來了一個德國總理默克爾這位大人物,又刷了一把武漢長江大橋,今天就以武漢長江大橋爲例,使用Python抓取該位置的街景影像。python
基於http抓包工具,能夠很輕鬆的獲取到瀏覽百度街景時的http請求數據。以下圖所示,便是長江大橋某位置點街景影像切片:瀏覽器
該切片對應的URL請求爲:網絡
細緻分析該URL請求,並通過模擬測試,能夠總結出以下初步結論python爬蟲
請求影像切片所需的幾個關鍵參數分別爲:工具
① sid:表明某個具體的街景點位;測試
② pos:表明該切片在完整的全景影像圖上的切片座標;url
③ z:表明街景影像切片級別。spa
單個位置的街景影像圖能夠生產出多種級別的切片,不一樣的級別下,切片的數量是不一樣的;切片的座標使用行號、列號予以區分。htm
明確了以上百度街景影像的切片規則,就能夠用代碼開擼了。
要求:一次性抓取連續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