导语
对于电商网站的运营同事们来说,如何维护并提升产品在电商平台的搜索排名,也是SEO工作中的一部分。今天跟大家分享一个在实际工作当中使用一款数据采集Web Scraper IDE提升某公司产品在某电商平台搜索排名的案例。
该司在亚马逊开店售卖4k显示器,过去运营人员主要是手动来查看公司产品在网站的搜索排名,如果排名靠后,则会想办法提升排名,如优化商品标题的关键字、产品详情页面的关键字优化、做付费搜索广告等。
很明显,这种提升产品排名的运营方式很低效,需要运营人员根据时长检测的要求去手工操作和记录,一个SKU还好说,但当产品一多起来,运营人员的人工效率就会变低,占用运营大量时间,且很多都是枯燥的重复劳动。
那么如何提升运营效率呢?本文为大家展示了如何使用亮数据Web Scraper IDE产品来提效的,它实现了数据自动收集,并自动将结构化的数据定时发送到运营人员的邮箱,运营人员可以方便的一下拿到所有有关4k显示器的网站搜索排名数据,这样运营人员就可以将所有精力集中在关键字优化、价格决策等重要的事务上了。
接下来是使用Web Scraper IDE这款产品的整个过程。
实操案例
1.创建数据采集器
进入管理后台,在数据集和Web Scraper IDE界面的我的采集器中创建采集器:
选择Start from scratch:
2.开发采集器
首先要明确我们的采集目标,也就是亚马逊的商品搜索列表页,url示例:www.amazon.com/s?k=4k+moni… 其中k参数就是搜索关键词,我司的产品是4k显示器,因此其中一个关键词就是4k monitor。
我们的采集大致分两大步骤:生成目标页面url和获取每页商品数据,因此先创建两个步骤栏:
第一步,生成目标页面url。我们首先会访问一次搜索列表页,获取该列表页的最大页码,然后生成每页的url,如:www.amazon.com/s?k=4k+moni… www.amazon.com/s?k=4k+moni…
我们来看看第一步代码该如何实现, 该步代码有两部分,首先是交互代码,如下
:// 指定代理的国家
country(input.country || 'us')
// 访问目标链接,这里是亚马逊商品搜索列表页
navigate(`https://www.amazon.com/s?k=${input.keyword}`);
// 调用解析器代码解析列表页,提取最后一页页码
let max_page = parse().max_page;
console.log("max_page:",max_page)
// 根据输入的页数计算最大页码
let final_page = Math.min(input.pages||0, max_page)||1;
console.log("final_page:",final_page)
// 生成每页的请求发往下一步
for (let i = 1; i<=final_page; i++) {
let url = `https://www.amazon.com/s?k=${input.keyword}`;
if (i>1)
url += `&page=${i}`;
// 将请求发往下一步
next_stage({url, country: input.country, search: input.keyword, page: i});
}
- 我们的关键词参数通过输入传入,在代码中通过input.keyword接收
- 交互代码中会通过调用parse函数来调用下面的解析器代码获取最大页码
- 注意这里加入了一个pages入参来控制最多采集几页,因为有时我们并不需要翻那么多页然后是解析器代码,如下:
return {
// 使用cheerio的选择器定位和获取最后一页页码
max_page: +$('[class="s-pagination-item s-pagination-disabled"]').last().text()
}
第二步,获取页面商品数据。请求生成的每页的url,然后解析每页的内容,提取我们的目标字段进行收集。每个商品我们主要需要获取:商品标题(title)、商品链接(url)、图片链接(imageset)、评分(rating)、评论数(reviews)、价格(price)、页码(page)、页面排名(page_rank)等,如下所示:
交互代码如下:
// 指定代理的国家
country(input.country || 'us')
// 访问目标url
navigate(input.url);
// 解析页面数据
let {products} = parse()
// 收集采集下来的数据
products.forEach(i => {
i.imageset = new URL(i.imageset)
collect(i)
})
- 主要逻辑就是接收第一个步骤传的url并发起请求,然后调用解析器函数提取目标字段并收集解析器代码如下:
// 使用cheerio的选择器定位和获取页面指定元素数据
return {
// 遍历当前搜索列表页每个商品
products: $('[data-component-type="s-search-result"]').toArray().map(el=>{
let $el = $(el);
// 获取商品在当前搜索列表的排名
let page_rank = $(el).index()-1;
// 获取商品标题
let title_el = $(el).find('h2 a.a-text-normal').eq(0);
let name_el = title_el.find('span').eq(0);
// 获取商品评分
let rating_el = $(el).find('span[aria-label*=stars]').eq(0).parent();
// 获取商品图片
let image_el = $(el)
.find('span[data-component-type="s-product-image"] img').eq(0);
// 获取商品价格
let price_el = $(el).find('.a-price:not([data-a-strike])').eq(0);
// 获取商品评论数
let reviews = rating_el.find('span[aria-label]').eq(1).attr('aria-label');
// 格式化商品价格
let parse_price = el=>{
let price = $(el).find('.a-offscreen').eq(0).text();
return parseFloat(price.replace(/^\D+/, '').replace(/,/g, ''));
};
// 结构化所有所需字段
return {
search: input.search,
title: name_el.text().replace('\n', '').trim(),
url: new URL($el.find('[data-component-type="s-product-image"]').find('a').attr('href'), location.href),
rating: rating_el.find('span[aria-label]').eq(0).attr('aria-label')||null,
reviews: reviews ? +(reviews.replace(/\D/, '')) : null,
price: parse_price(price_el),
page: input.page,
page_rank: page_rank,
imageset: image_el.attr('srcset')
};
})}
整个采集器的代码就这些,还有个关键点大家可以注意下:其实上面两个步骤的代码写到一个步骤也是可以的,也就是提取最大页码后直接一个循环请求每个页面+解析,一气呵成,那为什么我还要分成两个步骤写呢?为的是提高程序的并发!一气呵成的写法程序是串行的,第二个请求要等待第一个请求完毕后才进行,没有并发可言,效率较差;而分成两步的写法就是在第一步产生所有任务发给第二步(写入任务队列中),第二步(从任务队列中)并行获取多个任务同时执行,也就是所谓的生产者消费者模式,效率可以提升不少。
3.测试采集器
在第一步骤的input栏添加一个输入参数,然后点击预览进行测试:
可以在Children栏看到产生了一个第二步骤的输入,也就是url:
我们切换到第二步骤,然后在input栏可以看到自动获取的第一步骤输入,点击预览:
可以看到在Output栏中成功获取数据:
程序测试通过,接下来将代码发布到生产即可。
4.部署采集器
程序搞定后,就是配置交付偏好和部署程序了。首先是配置交付偏好,我们选择输出csv格式以及以电子邮件方式接收数据文件。
然后就是部署程序了,这里我们采用定时任务的方式,也就是指定时间定时执行任务。
最后就是等着每天接收数据文件了,然后发给运营人员进行数据分析即可。
除此之外,Web Scraper Ide还提供了一些功能来保障我们的数据采集质量。首先,Web Scraper Ide自身有重试机制,当请求目标url失败时会自动进行重试,无需开发者编写重试逻辑;第二,众所周知,我们采集的目标平台是在不断迭代的,也就是平台页面规则可能发生变化,这会导致我们的采集器中的解析规则失效,无法正确获取某些字段,这时我们可以在采集器的“输出模式“中配置字段校验规则,当遇到异常数据时及时抛出异常:
校验规则示例:
// 所有输出字段都可以通过变量v获取
// 获取需要校验的字段,然后进行异常逻辑判断,比如判断是否为空
if (!v.price) {
// 如果异常了则抛出异常即可
throw new Error(`price column is invalid`)
}
....
}
之后在交付偏好里设置消息提醒,那么当数据采集异常时可以进行邮件提醒,确保第一时间发现问题并修复:
总结
从上述的实操案例来看,可以看到数据收集、结构化这些繁琐的工作都交由Web Scraper IDE来干了,运营人员只需按时接收数据和分析数据即可,提升了不少效率。而且整个开发过程也并不复杂,也就50行左右代码就实现了整个数据收集加交付的功能,这也归功于Web Scraper IDE的强大,集成了很多开箱即用的功能,妥妥的低代码,技术人员只需花费较少的时间就能掌握该软件的使用。除了上述案例的场景外,Web Scraper IDE支持绝大多数的数据采集场景,比如价格监控、舆情监控、趋势洞察等,推荐大家尝试下!