做了一件有趣的事

Part1起因

大家遇到過查地理數據不知道去哪里找的情況吧?百度,好像總是找不到結果。如果有一個匯總地學類的數據網站就好了。

我在上周末,偶然間獲得了兩個地理類數據的網站匯總表格,一個是中文數據網站導航excel匯總,由成都地質調查中心的劉洪老師整理;另一個是英文數據網站excel匯總,由Karen Payne博士整理。

做了一件有趣的事的圖1 做了一件有趣的事的圖2
中文地理類數據導航網站 共計9類別,800個網站 英文地理類數據導航網站 共計17類別,1300個網址

這兩個文件匯總了地信和遙感專業會用到的數據網站,共計2000余個。但是這兩個有以下缺點:

網址有效性:試著打開了幾個網址,很大一部分無法訪問。

搜索麻煩:按照類型分為了多個工作簿。

直觀性:很差。

針對以上缺點,我計劃做一個網站導航:排除掉無法訪問的網站、便于搜索網站可視化

做了一件有趣的事的圖3
示意圖

Part2制作流程

思路:利用爬蟲爬取2000個網頁,訪問成功的截圖,并制作該網頁對應的屬性說明信息。

做了一件有趣的事的圖4
制作流程圖

1selenium截圖

我們首先保證excel都按照規范排列好,然后使用pandas讀取這些網址。有了網址,我們開始截圖。

截圖需要用到Selenium,這是一個用于Web應用程序測試的工具,能直接在瀏覽器中運行,模擬真實用戶。

在使用selenium時,需要保證自己已經開啟了http方式的科學上網。網頁成功打開,則截圖。并設置20秒的等待時間,超過20s未響應,則判定該網址不可用,繼續下一個。

#獲得表格中所有網址的首頁截圖
# coding=utf-8
import time
import shutil
import pandas as pd


#讀取表格數據
def excel_one_line_to_list(ID):
    df = pd.read_excel("F:\遙感家園素材\網站導航/地球科學數據庫匯總.xlsx", usecols=[ID],
                       names=None)  # 讀取項目名稱列,不要列名
    df_li = df.values.tolist()
    result = []
    for s_li in df_li:
        result.append(str(s_li).replace("[","").replace("]"""))
        return result
IDS=excel_one_line_to_list(0)
linkS=excel_one_line_to_list(1)
nameS=excel_one_line_to_list(2)
descS=excel_one_line_to_list(3)
authorS=excel_one_line_to_list(4)

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(2)

for i in range(len(IDS)):
    try:
        website=str(linkS[i]).replace("[","").replace("]""")
        web_image_name="F:\keshan\網站導航/"+str(IDS[i])+".png"
        #最長加載時長
        driver.set_page_load_timeout(20)
        driver.get(eval(website))
        driver.get_screenshot_as_file(web_image_name)
        pic_url="- img: 圖床地址"+str(IDS[i])+".png"+"\n"
        link="  link: "+str(eval(linkS[i]))+"\n"
        name="  name: "+str(eval(nameS[i]))+"\n"
        desc="  desc: "+str(eval(descS[i]))+"\n"
        author="  author: "+str(eval(authorS[i]))+"\n"

        # 讀取txt
        txt_path = "F:\遙感家園素材\網站導航\結果數據.txt"
        write_txt = open(txt_path, "a")
        write_txt.writelines(pic_url)
        write_txt.writelines(link)
        write_txt.writelines(name)
        write_txt.writelines(desc)
        write_txt.writelines(author)
        write_txt.close()
    except:
        # 讀取失敗的txt
        txt_path2 = "F:\遙感家園素材\網站導航\失敗網址.txt"
        write_txt2 = open(txt_path2, "a")
        write_txt2.writelines(linkS[i]+"\n")
        write_txt2.close()
driver.quit()

2截圖壓縮

由于一個導航頁包含幾十個圖片,為了提高網站的訪問速度,選擇對所有圖片進行壓縮。這里我開始使用pillow進行PNG圖片的壓縮,選中了最高壓縮效率,但效果差強人意,一張圖片從300kb壓縮成了296kb。于是我偷了一個懶,直接使用了第三方壓縮接口tinify:

import tinify
from glob import glob
import os.path
tinify.key = "7vx7bQP9q6fcYXDWxqGyflHX8b06bPjh"
source_dir_name = "F:\遙感家園素材\中文網站導航\爬取失敗的網站\圖片"
destination_dir_name = "F:\遙感家園素材\中文網站導航\爬取失敗的網站\壓縮"
files = glob(source_dir_name + '/*')
for file in files:
   source = tinify.from_file(file)
   file_name, ext = os.path.splitext(file)
   file_name = file_name.replace(source_dir_name + '\\''')
   print(file_name)
   source.to_file(destination_dir_name + "/" + file_name + ".png")
print("壓縮完了")

3網站發布

有了網站首頁圖片和對應的網站介紹信息后,我做成了一個md文檔。基于之前自己建好的網站進行網站的發布。

做了一件有趣的事的圖5
vuepress

Part3導航效果

從2000多個網頁,一共爬取了800多個能用的,并且導入到了網站的導航貼片中,失效的信息也做了一個表格展示,方便讀者作為尋找數據的線索。具體的效果展示看下面的視頻:

Part4其他

www.gisrsdata.com這個網站從去年11月開始建站,直到最近還是比較弱雞。

但最近我在網站上添加了目前所有地理、投影、垂直等坐標系,也添加了上千個導航網址,能初步實現該網站的建站意義了。

做了一件有趣的事的圖6
地信遙感數據匯

該網站的源代碼和文檔都已經在github開放。

做了一件有趣的事的圖7
GitHub倉庫

參考:

劉洪.成都地質調查中心.地球科學數據庫匯總表格

Karen Payne.GIS Data Repositories

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1
2