網絡請求分析實戰篇(01)—— 爬取amazon搜索欄的關聯關鍵詞

網絡請求分析實戰篇(01)—— 爬取amazon搜索欄的關聯關鍵詞

1. 需求介紹

  • 在amazon搜索商品,當輸入部分單詞時,下面會自動彈出一些關聯關鍵詞。這些關鍵詞是amazon內部總結,統計的熱門搜索關鍵詞。我們現在的需求就是,給出一些關鍵詞,然後把對應的關聯關鍵詞抓出來。
    這裏寫圖片描述

2. 環境

  • 系統:win7
  • python 3.6.1
  • requests 2.14.2 (通過pip list查看)

3. 分析請求

  • 第一步:進入amazon主頁,將網頁源代碼保存下來,以備後面分析參數來源。這兒需要注意到一個問題就是,這兒說的網頁源代碼指的是請求下來的原始頁面,而不是瀏覽器渲染後的代碼。區別如下:

    • 抓下來的網頁源代碼
      這裏寫圖片描述
    • 瀏覽器渲染後的代碼
      這裏寫圖片描述
  • 第二步:在輸入“ car ”時,抓取到的網絡請求如下:
    這裏寫圖片描述

# General
Request URL:https://completion.amazon.com/search/complete?method=completion&mkt=1&r=GFPC5GA3RHYHZK8YKY93&s=136-4489048-3064812&c=&p=Gateway&l=en_US&b2b=0&fresh=0&sv=desktop&client=amazon-search-ui&x=String&search-alias=aps&ks=82&q=car&qs=&cf=1&fb=1&sc=1&
Request Method:GET
Status Code:200 OK
Remote Address:54.239.17.86:443
Referrer Policy:no-referrer-when-downgrade

# Request Headers
Host:completion.amazon.com
Referer:https://www.amazon.com/ref=nav_logo
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

# Query String parameters
method:completion
mkt:1
r:GFPC5GA3RHYHZK8YKY93
s:136-4489048-3064812
c:
p:Gateway
l:en_US
b2b:0
fresh:0
sv:desktop
client:amazon-search-ui
x:String
search-alias:aps
ks:82
q:car
qs:
cf:1
fb:1
sc:1
  • 從上面的參數中,發現有3個參數是需要我們重點關注的:
r:GFPC5GA3RHYHZK8YKY93
s:136-4489048-3064812
search-alias:aps
  • 第三步:分析這幾個參數的來源:
    • 之前我的文章中就提到過,這種參數來源,一般是在以下的4個點:
第一,網頁源代碼中攜帶。
第二,藏在服務器返回過來的cookie中。
第三,網頁js腳本計算生成。
第四,登錄時,請求js腳本生成,或者同步產生的其他網頁中。
  • 在這個案例中,發現相對比較簡單,這些參數就屬於第一種情況,網頁源代碼中攜帶。
    這裏寫圖片描述

4. 編寫爬蟲

  • 從上面的分析過程來看,就知道抓取這個數據很簡單,分兩步:
    • 第一:抓取amazon主頁,從主頁源代碼中取出必要的參數。
    • 第二:使用這些參數,向目標網頁請求關聯關鍵詞。

import requests
import re

unicornHeader = {
    'Host': 'www.amazon.com',
    'Referer': 'https://www.amazon.com',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}

if __name__ == "__main__":
    # 第一步:先把amazon主頁拉下來
    resp = requests.get("https://www.amazon.com/ref=nav_logo", headers=unicornHeader)
    respText = resp.text
    # print(f"respText = {respText}")

    # 第二步:從主頁中提取出相關的參數
    '''
        method:completion
        mkt:1
        r:T9GNBFENMKCSHQ96SN69
        s:136-4489048-3064812
        c:
        p:Gateway
        l:en_US
        b2b:0
        fresh:0
        sv:desktop
        client:amazon-search-ui
        x:String
        search-alias:mobile
        ks:82
        q:car
        qs:
        cf:1
        fb:1
        sc:1
    '''
    # r:T9GNBFENMKCSHQ96SN69
    # var ue_id = 'T9GNBFENMKCSHQ96SN69',
    ue_id_Re = re.search("ue_id = '(.*?)'", respText, re.DOTALL)
    print(f"ue_id_Re = {ue_id_Re}")
    if ue_id_Re:
        ue_id = ue_id_Re.group(1)
    else:
        ue_id = ""

    # s:136-4489048-3064812
    # ue_sid = '136-4489048-3064812',
    ue_sid_Re = re.search("ue_sid = '(.*?)'", respText, re.DOTALL)
    print(f"ue_sid_Re = {ue_sid_Re}")
    if ue_sid_Re:
        ue_sid = ue_sid_Re.group(1)
    else:
        ue_sid = ""

    # 第三步:構造請求
    originalKey = "car"         # 原始關鍵字
    # search_alias = 'mobile'
    # aps                       # All Departments 類別
    search_alias = 'aps'        # 搜索類別,這個是類別下拉框中的。主頁源碼中也有
    ks = 100                    # 先自己指定,發現並不影響結果
    # https://completion.amazon.com/search/complete?method=completion&mkt=1&r=T9GNBFENMKCSHQ96SN69&s=136-4489048-3064812&c=&p=Gateway&l=en_US&b2b=0&fresh=0&sv=desktop&client=amazon-search-ui&x=String&search-alias=mobile&ks=67&q=c&qs=&cf=1&fb=1&sc=1&
    keywordsUrl = f"https://completion.amazon.com/search/complete?method=completion&mkt=1&r={ue_id}&s={ue_sid}&c=&p=Gateway&l=en_US&b2b=0&fresh=0&sv=desktop&client=amazon-search-ui&x=String&search-alias={search_alias}&ks={ks}&q={originalKey}&qs=&cf=1&fb=1&sc=1&"
    secondResp = requests.get(keywordsUrl, headers=unicornHeader)
    print(f"secondRespText = {secondResp.text}")
  • 結果輸出:
# 發現關聯關鍵詞已經成功提取了

ue_id_Re = <_sre.SRE_Match object; span=(1617, 1647), match="ue_id = '6M0F9KJN25H89JPK5B1R'">
ue_sid_Re = <_sre.SRE_Match object; span=(1732, 1762), match="ue_sid = '144-1591423-1127326'">
secondRespText = completion = ["car",["car phone mount","carbon monoxide detector","car charger","cards against humanity","car accessories","car seat protector","car vacuum","cardigans for women","carry on luggage","car phone holder"],[{"nodes":[{"name":"Cell Phones & Accessories","alias":"mobile"}]},{},{},{},{},{},{},{},{},{}],[],"AA2EWWA46T4I"];String();
 .
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章