网络请求分析实战篇(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();
.