电商运营中通过数据采集自动获得用于优化效率的数据的实操分享

171 阅读6分钟

导语

对于电商网站的运营同事们来说,如何维护并提升产品在电商平台的搜索排名,也是SEO工作中的一部分。今天跟大家分享一个在实际工作当中使用一款数据采集Web Scraper IDE提升某公司产品在某电商平台搜索排名的案例。

该司在亚马逊开店售卖4k显示器,过去运营人员主要是手动来查看公司产品在网站的搜索排名,如果排名靠后,则会想办法提升排名,如优化商品标题的关键字、产品详情页面的关键字优化、做付费搜索广告等。

image.png

很明显,这种提升产品排名的运营方式很低效,需要运营人员根据时长检测的要求去手工操作和记录,一个SKU还好说,但当产品一多起来,运营人员的人工效率就会变低,占用运营大量时间,且很多都是枯燥的重复劳动。

那么如何提升运营效率呢?本文为大家展示了如何使用亮数据Web Scraper IDE产品来提效的,它实现了数据自动收集,并自动将结构化的数据定时发送到运营人员的邮箱,运营人员可以方便的一下拿到所有有关4k显示器的网站搜索排名数据,这样运营人员就可以将所有精力集中在关键字优化、价格决策等重要的事务上了。

接下来是使用Web Scraper IDE这款产品的整个过程。

实操案例

1.创建数据采集器

进入管理后台,在数据集和Web Scraper IDE界面的我的采集器中创建采集器:

image.png

选择Start from scratch:

image.png

2.开发采集器

首先要明确我们的采集目标,也就是亚马逊的商品搜索列表页,url示例:www.amazon.com/s?k=4k+moni… 其中k参数就是搜索关键词,我司的产品是4k显示器,因此其中一个关键词就是4k monitor。

我们的采集大致分两大步骤:生成目标页面url和获取每页商品数据,因此先创建两个步骤栏:

image.png 第一步,生成目标页面url。我们首先会访问一次搜索列表页,获取该列表页的最大页码,然后生成每页的url,如:www.amazon.com/s?k=4k+moni… www.amazon.com/s?k=4k+moni…

image.png 我们来看看第一步代码该如何实现, 该步代码有两部分,首先是交互代码,如下

// 指定代理的国家  
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)等,如下所示:

image.png 交互代码如下:

// 指定代理的国家  
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栏添加一个输入参数,然后点击预览进行测试: image.png

可以在Children栏看到产生了一个第二步骤的输入,也就是url: image.png

我们切换到第二步骤,然后在input栏可以看到自动获取的第一步骤输入,点击预览: image.png

可以看到在Output栏中成功获取数据: image.png

程序测试通过,接下来将代码发布到生产即可。

4.部署采集器

程序搞定后,就是配置交付偏好和部署程序了。首先是配置交付偏好,我们选择输出csv格式以及以电子邮件方式接收数据文件。 image.png

然后就是部署程序了,这里我们采用定时任务的方式,也就是指定时间定时执行任务。 image.png

最后就是等着每天接收数据文件了,然后发给运营人员进行数据分析即可。 image.png

除此之外,Web Scraper Ide还提供了一些功能来保障我们的数据采集质量。首先,Web Scraper Ide自身有重试机制,当请求目标url失败时会自动进行重试,无需开发者编写重试逻辑;第二,众所周知,我们采集的目标平台是在不断迭代的,也就是平台页面规则可能发生变化,这会导致我们的采集器中的解析规则失效,无法正确获取某些字段,这时我们可以在采集器的“输出模式“中配置字段校验规则,当遇到异常数据时及时抛出异常: image.png

校验规则示例:

// 所有输出字段都可以通过变量v获取  
// 获取需要校验的字段,然后进行异常逻辑判断,比如判断是否为空  
    if (!v.price) {  
      // 如果异常了则抛出异常即可  
      throw new Error(`price column is invalid`)  
    }  
    ....  
}  

之后在交付偏好里设置消息提醒,那么当数据采集异常时可以进行邮件提醒,确保第一时间发现问题并修复: image.png

总结

从上述的实操案例来看,可以看到数据收集、结构化这些繁琐的工作都交由Web Scraper IDE来干了,运营人员只需按时接收数据和分析数据即可,提升了不少效率。而且整个开发过程也并不复杂,也就50行左右代码就实现了整个数据收集加交付的功能,这也归功于Web Scraper IDE的强大,集成了很多开箱即用的功能,妥妥的低代码,技术人员只需花费较少的时间就能掌握该软件的使用。除了上述案例的场景外,Web Scraper IDE支持绝大多数的数据采集场景,比如价格监控、舆情监控、趋势洞察等,推荐大家尝试下!