古代地圖,對於歷史相關研究人員,是需要的工具,本想找到歷代矢量的歷史地圖數據,但是發現很難有資源,因此只能找到已經公開製圖了jpg數據,如果你有耐心,可以配準後矢量化,獲取歷代矢量數據,不夠工作量浩大。爬取歷代行政區劃圖的步驟如下:
一、首先,找到資源的地址,這裏使用的網站是國學大師網。
利用谷歌瀏覽器,查找爬取地址:
圖上標出的鏈接,即爲圖片在網站服務器存放的地址。只需要利用爬蟲函數下載到本地就行了。
二、獲取網頁前端源代碼,查找a標籤
url = 'http://www.guoxuedashi.com/lsditu/'+str(i)+'/'
html = requests.get(url).text
soup=BeautifulSoup(html,'html.parser')
a=soup.select('a')
這裏是將html代碼全部copy下來,然後轉換格式,找到html代碼中a標籤中內容,我們需要的網址就在a標籤中
三、遍歷a標籤,找到我們需要的那個網址
for i in a:
aObj = re.match(r"http://pic.guoxuedashi.com/lsditu/", i['href'])
if aObj:
url = i['href']
這裏使用 re.match匹配網址鏈接,如果是http://pic.guoxuedashi.com/lsditu/開頭的,則獲取這個,即我們需要的那個
四、這裏拼接文件夾地址以及文件名,將jpg寫入該文件夾
name = url.split('/')
#print(name[4])
r = requests.get(i['href'])
os.makedirs('./image/'+name[4]+'/', exist_ok=True)
#DOWNLOAD_DELAY = 3
with open('./image/'+name[4]+'/'+name[5]+'.png', 'wb') as f:
f.write(r.content)
print(name[5]+'.png')
其中核心在於 f.write(r.content),即將jpg圖片寫入拼接好的文件夾路徑
五、注意網站的反爬蟲機制
socket.setdefaulttimeout(20) # 設置socket層的超時時間爲20秒
r.close()
time.sleep(2)
上面第一個爲設置超時時間,第二個爲關閉請求,每次爬取一次結束後關閉,第三個爲設置睡眠時間,這樣能降低服務器對於爬蟲的應激反應。
爬取的效果如下:
共1.3個G,局部細節如下,以我喜歡的北宋地圖爲例:
所有數據我已經打包好,網盤地址:
鏈接:https://pan.baidu.com/s/1v8PgeKTfe5ExXRF8QN6Xpw
提取碼:niq1
關注微信公衆號:python趣味愛好者,後臺回覆:歷代行政圖,可以獲取該完整源代碼文件。
二維碼如下: