Moz 鏈接 API:簡介
技術 SEO
技術 SEO
API 究竟是什麼? 它們是您將奇怪的長代碼複製並粘貼到 Screaming Frog 中以獲取站點抓取鏈接數據的那些東西,對嗎?
我在這裡是要告訴您,它們的功能遠不止於此——如果您願意採取一些小步驟。 但首先,一些基礎知識。
API 代表“應用程序編程接口”,它只是……使用事物的方式。 一切都有一個API。 Web 是一個巨大的 API,它將 URL 作為輸入並返回頁面。
但是像 Moz Links API 這樣的特殊數據服務有自己的一套規則。 這些規則因服務而異,可能成為人們採取下一步行動的主要絆腳石。
當 Screaming Frog 在爬行中為您提供額外的鏈接列時,它使用的是 Moz Links API,但您可以在任何地方使用此功能。 例如,您在電子表格環境中所做的所有繁瑣的手動工作都可以自動化,從數據拉取到格式化和通過電子郵件發送報告。
如果你採取下一步,你可以比你的競爭對手更有效率,設計和交付你自己的SEO 服務,而不是依賴、付費和受限於下一個專有產品集成。
GET 與 POST
您將遇到的大多數 API 使用與網。 這意味著就像網站一樣涉及 URL。 不要害怕! 這比你想像的要容易。 在許多方面,使用 API 就像使用網站一樣。
與加載網頁一樣,請求可能在兩個地方之一:URL 本身,或在請求的正文中。 URL 稱為“端點”,通常不可見地提交的額外請求部分稱為“有效負載”或“數據”。 當數據在 URL 中時,它被稱為“查詢字符串”,表示使用了“GET”方法。 當你搜索時,你總是看到這個:
https://www.google.com/search?q=moz+links+api <-- 獲取方法當請求的數據被隱藏時,它被稱為“POST”請求。 當您在 Web 上提交表單並且提交的數據未顯示在 URL 上時,您會看到這一點。 當您在這樣的 POST 之後點擊後退按鈕時,瀏覽器通常會警告您不要重複提交。 經常使用 POST 方法的原因是與 GET 方法相比,使用 POST 方法可以在請求中容納更多內容。 否則 URL 會變得很長。 Moz 鏈接 API 使用 POST 方法。
發出請求
Web 瀏覽器是傳統上向網站發出網頁請求的工具。 瀏覽器是一種稱為 客戶。 客戶是提出服務請求的人。 不僅僅是瀏覽器可以發出請求。 發出客戶端 Web 請求的能力通常內置於 Python 等編程語言中,或者可以作為獨立工具分離出來。 在瀏覽器外部發出請求的最流行的工具是 捲曲和wget.我們在這裡討論Python。 Python 有一個名為 URLLIB 的內置庫,但它旨在處理如此多不同類型的請求,因此使用起來有點麻煩。 還有其他庫更專門用於發出 API 請求。 最流行的 Python 稱為 requests。 它非常受歡迎,以至於您在網絡上找到的幾乎所有 Python API 教程都使用了它。 所以我也會用它。 這就是“點擊”Moz Links API 的樣子:
response = requests.post(endpoint, data=json_string, auth=auth_tuple)作業vs. equality鑑於一切都已正確設置(稍後會詳細介紹),這將產生以下輸出:
{'next_token': 'JYkQVg4s9ak8iRBWDiz1qTyguYswnj035nqrQ1oIbW96IGJsb2dZgGzDeAM7Rw==', '結果': }這是 JSON 數據。 它包含在從 API 返回的響應對像中。 它不在驅動器上或文件中。 它在記憶中。 只要它在內存中,您就可以用它做一些事情(通常只是將它保存到一個文件中)。
如果你想在這樣的響應中獲取一段數據,你可以這樣引用它:
回复['results'][0]['external_pages']這說:“給我 結果中的第一項 列表,然後給我 external_pages
該項目的價值。” 結果將是 7162.
筆記: 如果您實際上是在執行代碼,上面的行將無法單獨工作。 我們很快就會進行一些設置,包括安裝請求庫和設置一些變量。 但這是基本思想。
JSON
JSON 代表 JavaScript 對象表示法。 它是一種以易於人類讀寫的方式表示數據的方式。 計算機也很容易讀寫。 這是一種非常常見的 API 數據格式,由於舊方法對大多數人來說太難使用,因此在某種程度上已經佔領了世界。 有些人可能將這部分稱為“restful”API 運動,但更難的 XML 格式也被認為是“restful”,每個人似乎都有自己的解釋。 因此,我發現最好只關注 JSON 以及它如何進出 Python。
Python 詞典
我騙了你。 我說你上面看的數據結構是JSON。 從技術上講,它實際上是一個 Python 字典或 dict 數據類型對象。 它是 Python 中的一種特殊對象,旨在保存鍵/值對。 鍵是字符串,值可以是任何類型的對象。 這些鍵就像電子表格中的列名。 這些值就像電子表格中的單元格。 這樣,您可以將 Python dict 視為 JSON 對象。 例如,這是在 Python 中創建一個字典:
my_dict = { "name": "Mike ", "age": 52, "city": "紐約" }
這是 JavaScript 中的等價物:
var my_json = { "name": " Mike", "age": 52, "city": "紐約" }
幾乎是一回事,對吧? 仔細看。 鍵名和字符串值用雙引號引起來。 數字沒有。 這些規則在 JSON 和 Python 字典之間一致適用。 因此,正如您可能想像的那樣,JSON 數據很容易流入和流出 Python。 這是一份偉大的禮物,它通過一個徹底改變了數據科學領域並正在進軍市場營銷的工具,使現代 API 工作對初學者來說非常容易獲得,Jupyter 筆記本.
展平數據
但要小心! 當數據在系統之間流動時,數據發生微妙變化的情況並不少見。 例如,上面的 JSON 數據可能會轉換為字符串。 字符串可能看起來與 JSON 完全一樣,但實際上並非如此。 他們只是一群角色。 有時您會聽到它被稱為“序列化”或“扁平化”。 這是一個微妙的點,但值得理解,因為它將幫助解決 Moz 鏈接(和大多數 JSON)API 的最大絆腳石之一。
對像有API
實際JSON 或 dict 對像有自己的小 API 來訪問它們內部的數據。 當數據被扁平化為字符串時,使用這些 JSON 和 dict API 的能力就消失了,但它會更容易地在系統之間傳輸,當它到達另一端時,它會被“反序列化”,API 會回來在另一個系統上。
系統間數據流動
這是可移植、可互操作數據的概念。 當它被稱為電子數據交換(或 EDI)時,這是一件非常重要的事情。 然後出現了網絡,然後是 XML,然後是 JSON,現在它只是做生意的正常部分。
如果你在 Python 中並且想要將字典轉換為扁平化的 JSON 字符串,你可以執行以下操作:
import json my_dict = { “name”: “Mike”, “age”: 52, “city”: “New York” } json_string = json.dumps(my_dict)
…這將產生以下輸出:
'{"name": "Mike", "age": 52, "city": "New York"}'這看起來和原來的字典幾乎一樣,但是如果你仔細看你會發現單引號是用於整個事物。 另一個明顯的區別是您可以換行真實的結構化數據以提高可讀性而不會產生任何不良影響。 你不能用字符串那麼容易地做到這一點。 這就是為什麼它在上面的代碼片段中全部顯示在一行中。
Such 字符串化
進程在不同系統之間傳遞數據時完成,因為它們並不總是兼容。 另一方面,普通文本字符串幾乎與所有內容兼容,並且可以輕鬆地通過網絡請求傳遞。 這種扁平化的 JSON 數據字符串通常稱為 請求。請求剖析
同樣,這是我們在上面提出的示例請求:
response = requests.post(endpoint, data=json_string, auth=auth_tuple)
現在您了解了變量名 json_string 告訴您的內容,您應該不會對我們如何填充該變量感到驚訝:
data_dict = { “target”: “moz.com/blog”, “scope” :“頁面”,“限制”:1}json_string = json.dumps(data_dict)
…json_string 的內容如下所示:
'{“target” : “moz.com/blog”, “scope”: “page”, “limit”: 1}'
這是我在學習 Moz Links API 過程中的重要發現之一。 這與無數其他 API 有共同之處,但每次都讓我感到困惑,因為使用結構化字典比使用扁平化字符串要方便得多。 但是,大多數 API 都希望數據是系統間可移植性的字符串,因此我們必須在實際 API 調用發生之前的最後一刻對其進行轉換。
Python 加載和轉儲
現在您可能想知道在上面的示例中,轉儲在代碼中間做了什麼。 json.dumps 函數被稱為“轉儲器”,因為它接受一個 Python 對象並將其轉儲到一個字符串中。 json.loads 函數之所以稱為“加載器”,是因為它接受一個字符串並將其加載到 Python 對像中。
原因對於看似單複數的選項,實際上是二進制和字符串選項。 如果你的數據是二進制的,你使用 json.load
和 json.dump。 如果您的數據是字符串,則使用 json.loads 和 json.dumps。 s 代表字符串。 將 s 關閉表示二進制。
不要讓任何人告訴你 Python 是完美的。 只是它的毛邊並不過分反感。
對於那些完全不熟悉的人Python 或一般的編程,我們在訪問 API 時所做的事情稱為賦值。 requests.post 的結果) 被分配給名為 response 的變量*).
response = requests.post(endpoint, data=json_string, auth=auth_tuple )
請求 庫有一個名為 post 需要 3 個參數。 第一個參數是端點的 URL。 第二個參數是要發送到端點的數據。 第三個參數是要發送到端點的身份驗證信息。我們使用=號來賦值右邊的值等式左邊的變量。 變量 response 現在是參考到從 API 返回的對象。 賦值不同於相等。 == 符號用於equality.
# 這是賦值:a = 1 # a 現在等於 1 #這是相等的:a == 1 # True,但依賴於上面的行已經被執行
POST方法
response = requests.post(endpoint, data=json_string, auth=auth_tuple)關鍵字參數及其參數
def arbitrary_function(argument1, name=argument2 ): # do stuff
您可能會注意到 post
的一些參數 函數有名稱。 使用 = 符號將名稱設置為等於值。 以下是 Python 函數的定義方式。 第一個參數是位置參數,因為它排在第一位,也因為沒有關鍵字。 關鍵字參數位於位置相關參數之後。 相信我,一段時間後一切都變得有意義了。 我們都開始像 Guido van Rossum 一樣思考。
上面例子中的名字叫做“關鍵字” ”,這些位置的值稱為“參數”。 現在參數直接在函數定義中分配給變量名,因此您可以在該函數內的任何位置引用 argument1 或 argument2。 如果你想了解更多關於 Python 函數的規則,你可以在這裡閱讀它們。
好的,讓我們讓你做所有必要的事情成功保證 片刻。 我們一直在展示基本請求:
response = requests.post(endpoint, data =json_string, auth=auth_tuple)
…但我們還沒有展示所有內容進入它。 讓我們現在就這樣做。 如果您正在跟隨並且沒有安裝請求庫,則可以在運行 Python 的同一終端環境中使用以下命令執行此操作:
點安裝請求
通常 Jupyter 已經安裝了 requests 庫,但如果沒有,您可以從 Notebook 單元格中使用以下命令安裝它:
!pip 安裝請求
現在我們可以把它們放在一起了。 這裡只有幾樣東西是新的。 最重要的是我們如何採用 2 個不同的變量並將它們組合成一個名為 AUTH_TUPLE。 您必須從 Moz.com 網站獲取自己的 ACCESSID 和 SECRETKEY。
API 需要這些兩個值作為稱為 元組 的 Python 數據結構傳遞。 元組是一組不變的值。 我覺得有趣的是 requests.post 期望 數據 的扁平化字符串*) 參數,但需要 auth 的元組 範圍。 我想這是有道理的,但這些是使用 API 時需要理解的微妙之處。
這是完整代碼:
import json import pprint import requests # Set Constants ACCESSID = "mozscape-1234567890 " # 替換為您的訪問 ID SECRETKEY = "1234567890abcdef1234567890abcdef" # 替換為您的密鑰 AUTH_TUPLE = (ACCESSID, SECRETKEY) # 設置變量 endpoint = "https://lsapi.seomoz.com/v2/anchor_text" data_dict = {"target ": "moz.com/blog", "scope": "page", "limit": 1} json_string = json.dumps(data_dict) # 發出請求 response = requests.post(endpoint, data=json_string, auth= AUTH_TUPLE) # 打印響應 pprint(response.json)
…輸出:
{'next_token': 'JYkQVg4s9ak8iRBWDiz1qTyguYswnj035nqrQ1oIbW96IGJsb2dZgGzDeAM7Rw==', '結果': }
對
使用全部大寫AUTH_TUPLE 變量是 Python 中許多人使用的約定,表示該變量是一個持續的。 這不是必需的,但最好盡可能遵守約定。
您可能會注意到我沒有為 端點 使用全部大寫 多變的。 那是因為 anchor_text 端點不是一個常數。 根據我們想要執行的查找類型,有許多不同的端點可以取代它。 選項是:
anchor_text
final_redirect
global_top_pages
global_top_root_domains