一个小型爬虫,可以根据给定的根关键字采集Amazon.com推荐的长尾关键字
优采云 发布时间: 2020-08-07 20:25前言
今天的周末,在国庆节期间,我无事可做. 我将整理我之前编写的Amazon搜索框推荐的关键字采集工具. 总体而言,它是一个简单的小爬虫.
因为它很小,所以它被编写在一个模块中,并且一个模块分为五种方法来完成整个采集器过程.
网页下载方法,网页分析方法,将分析结果存储在txt文件中的方法,集成网页下载的方法以及在txt文件中存储的方法整个过程的组织方法主要内容1.涉及的类库
import requests
import datetime
import time
除了请求第三方库以外,上述库都是Python标准库. 第三方类库可以通过pip install +类库名称自动安装在cmd中. 前提是已配置python环境变量-windows.
requests是Web下载库datetime是日期库. 在此示例中,它用于根据日期设置不同采集文件txt的名称. 定时时间库,主要使用睡眠方法,用于在采集不流畅时暂停程序的库2. 网页下载方法
def get_suggestion(url, sleep=5, retry=3):
try:
r = requests.get(url, timeout=10)
if r.json:
return r.json()
else:
print('网站返回信息为空,当前检索失败')
if retry>=0:
print('正在重新请求')
time.sleep(sleep)
retry -= 1
return get_suggestion(url, retry)
except (requests.ConnectTimeout,requests.ReadTimeout, requests.ConnectionError) as e:
print('超时: %s' % str(e))
if retry>=0:
print('正在重试')
time.sleep(sleep)
retry -= 1
return get_suggestion(url, retry)
对于Web下载方法,只需设置错误捕获和错误重试功能,以使采集器在下载网页的过程中平稳运行.
此外,经过多次尝试,此接口的抗攀爬程度非常弱. 只要不是*敏*感*词*采集,一般问题就不大. 如果您遇到诸如Robot Check之类的验证,则除了更改IP(https类型)外,还可以稍作休息以减轻Robot Check的可能性.
此外,经过观察,亚马逊对该关键字的推荐并不频繁. 个人的平均采集速度可以完全满足需求.
三,网页分析方法,解析出我们需要的内容
def parse_suggestion(js_html):
try:
suggestions = js_html.get('suggestions')
keywords_list = [keyword.get('value') for keyword in suggestions]
return keywords_list
except Exception as e:
return
分析网页返回的信息,因此类信息为json格式,并且本体已从请求库的json方法转换为字典类型,因此可以以的形式直接访问字典.
增加了一层判断力,当解析错误时,返回空值,以确保程序不会由于错误而影响整体操作
返回的内容存储方法存储了我们已经采集并且使用量很大的关键字
def save_suggestion(keyword):
# 以天为单位分离采集结果
with open('Amazon Suggest Keywords_{}.txt'.format(datetime.now().date()), 'a+') as f:
f.write(keyword+'\n')
这是相对简单的,无需多说. 打开或创建一个txt文件,调用write方法编写相应的关键字,并在每个关键字之后添加一个换行符
四个. 集成网页下载并保存为txt文件的方法,以供以后调用
def get_and_save(url, suggested_keywords):
rq_json = get_suggestion(url)
suggestion_list = parse_suggestion(rq_json)
if suggestion_list:
for suggestion in suggestion_list:
print('#' * 80)
print('正在判断当前关键词:%s' % suggestion)
if suggestion in suggested_keywords:
print('当前关键词:%s 重复' % suggestion)
continue
else:
save_suggestion(suggestion)
print('当前关键词:%s 存储成功' % suggestion)
suggested_keywords.append(suggestion)
else:
print('亚马逊返回信息为空,当前关键词长尾词采集失败')
因此,部分代码在主程序中将被多次调用,因此将其分别组织为一个方法.
添加了一个if判断,以确保仅当明确返回关键字时才调用存储方法.
在此步骤中,还添加了一个判断,以判断当前已检索的关键字是否已被采集,如果已被采集,则放弃
五,组织整个程序的主要功能
def main(prefix_or_prefix_list):
url = 'https://completion.amazon.com/api/2017/suggestions?&client-info=amazon-search-ui&' \
'mid=ATVPDKIKX0DER&alias=aps&b2b=0&fresh=0&ks=83&prefix={}&suggestion-type=keyword&fb=1'
suggested_keywords = []
# 定义一个空列表,以存储已采集过的关键词
if isinstance(prefix_or_prefix_list, str):
# 传入的是一个词
final_url = url.format(prefix_or_prefix_list)
get_and_save(final_url, suggested_keywords)
for depth_keywords in suggested_keywords:
# 将已采集过的 keywords 做再次采集,依旧是重复的剔除
get_and_save(url.format(depth_keywords),suggested_keywords)
elif isinstance(prefix_or_prefix_list, list):
# 传入的是一个由许多单词组成的列表| tuple 也是可以的,只要是一个可以迭代的有序序列都可以。但是如果是一个 orderedDict的话,那就需要改写部分代码了。
for prefix in prefix_or_prefix_list:
final_url = url.format(prefix)
get_and_save(final_url, suggested_keywords)
for depth_keywords in suggested_keywords:
get_and_save(url.format(depth_keywords), suggested_keywords)
else:
print('参数传入错误,本程序只接受单个关键词或者关键词序列为参数')
if __name__ == '__main__':
_prefix = 'iphone case'
_prefix_list = ['iphone case', 'iphone charger']
main(_prefix)
main函数接收一个prefix_or_prefix_list参数,这意味着该程序可以仅采集一个关键字或一系列关键字的长尾单词.
使用内置的isinstance方法确定传入的参数的类型,并根据类型使用不同的采集配置.
该程序需要很长时间才能运行,并且需要轮询每个关键字信息. 但是,由于采用了实时采集和实时存储的策略,因此可以随时中断程序的运行,并将采集到的单词存储在相应的txt文件中.
当然,有人说您是否可以使用多线程,但是该项目很小且不必要,并且Amazon的关键字推荐不会经常更新. 而且,亚马逊的抗爬能力非常强大. 有兴趣的人可以自己尝试.
结束
这是我分享的第一个与Amazon Seller相关的采集器工具. 配置完python程序后,将其复制并粘贴以使用.
如果与亚马逊卖家相关的朋友已经看过此博客文章,并且对与亚马逊卖家相关的工具的开发感兴趣的朋友,则可以通过私人消息进行交流.