使用火蜘蛛采集器Firespider采集天猫商品数据并上传到微店
有很多朋友都需要把天猫的商品迁移到微店上去。可在天猫上的商品数据非常复杂,淘宝开放接口禁止向外提供数据,一般的采集器对ajax数据采集的支持又不太好。
还有现在有了火蜘蛛采集器,经过一定的配置,终于把天猫商品的数据都采集下来了(SKU信息,运费信息,库存信息,图片,商品描述等)。天猫商品网页的确是很复杂,比如商品描述,还有商品描述中的图片,使用的都是懒加载,只有当用户滚动到那里了,才会去加载描述和图片。还好这些都难不倒火蜘蛛采集器。当然了,采集回来的信息也是很复杂的,需要我们清楚了解淘宝的商品数据结构,并转换成微店的商品数据结构,然后调用微店接口进行添加。
火蜘蛛采集器下载地址:
http://firespider.duapp.com/FireSpiderWeb/index.html
如何在安装包里就已经说明了。不过现在安装包只支持win7系统。如果是win8,安装客户端时要把安装包下的components目录手工复制覆盖C:\Program Files (x86)\Mozilla Firefox\browser\components。
下面说说采集的过程
- 网页分析
要采集网页的数据,首先要做的当然是对目标网页进行分析,目标是找出我们要采集的数据到底在哪里。这可以说是采集过程中最重要的一步。这里我们使用firebug进行分析。使用火狐浏览器打开一个天猫商品,比如:
http://detail.tmall.com/item.htm?spm=a1z10.1002.w4948-8875692881.4.4bX5Dj&id=40660880252
使用firebug分析网页结构,主要是通过几个方面进行了解:页面源代码,处理完成后的HTML,脚本,网络加载。
页面源代码:在网页右击,选择查看网页源代码可以看到。通过查看网页源代码,可以大致推测到网页使用什么样的方式加载显示,以及了解部分网页的加载逻辑。
处理完成后的HTML:通过firebug的“html”tab页可查看到完整的处理完成后的HTML树。通过查看处理完成后的HTML,与页面源代码进行对比,也可以推测网页的加载方式。
脚本:通过firebug的”script”tab页可查看到当前网页加载了哪些脚本。
网络加载:通过firebug的”net”tab页可查看到打开当前网页后一共加载了多少网络请求,以及各个网络请求的返回内容。
通过对天猫商品页的分析,我们发现:
1) 商品图像,通过HTML就可以取到
2) 商品SKU信息,如尺码和颜色,通过HTML也能取到
3) 产品参数,通过HTML也可以取到
4) 商品的一部分信息,如SKU价格等,页面源代码的一个script中,可以取到这个script的text再进行截取,得到一个json字符串
5) 商品的运费信息,在
http://mdskip.taobao.com/core/initItemDetail.htm?。。。链接返回的数据中,通过截取,得到一个json字符串
6) 商品的描述信息,通过HTML也可以取到。但是必须要慢慢滚动下去,触发懒加载后,待图片加载完成,才能取到。
- 定制采集任务
知道了我们要采集数据在哪里之后,我们就可以开始定制采集了:定义执行器,提取器,采集模块,采集任务等。鉴于一些网页的复杂性(例如淘宝),有时我们会需要反复进行尝试,直到找到合适的方法为止。下面介绍一下我们定制的天猫采集任务:
2.1 商品页采集模块

这里定义了四个处理器链:
第一个链:在网页加载完成后,依次执行“加入JQ支持”,“采集天猫商品图像”,“采集天猫SKU”,“天猫产品参数”,“采集天猫产品主信息”。
第二个链:在某个网络链接加载完成后,执行“采集天猫产品主信息2”。
第三个链:在某个网络链接加载完成后,执行“采集天猫产品描述”。
第四个链:在网页加载完成后,执行“scrollTo”。
下面我们对这些处理器逐个进行介绍:
加入JQ支持
加入JQ支持本来应该定义为执行器,这里把它定义为提取器。不过这也无妨,执行器跟JS提取器本质上是一样的,只是有无参数有无返回值的区别而已。加入JQ支持的目的只是为了在后面的处理器中写JS脚本方便一些,可以直接使用JQ脚本。当然,天猫商品页面本来就已经使用了$这个函数名,所以不要忘记了调用一下jQuery.noConflict();
此处理器的实现,就只是把jquery.mini.js源码考到function里面了,再调用一下jQuery.noConflict();

function(){
//把jquery.mini.js源码考到这里
//…
//把$还给原始页面
jQuery.noConflict();
}
采集天猫商品图像
商品图像都在页面上的J_UIThumb这个UL下面,我们通过jquery取到它。注意,这里取到的图像链接是小图的图像链接。对小图链接经过截取得到大图链接。
小图链接:http://gi1.md.alicdn.com/bao/uploaded/i1/TB128CJGpXXXXa0XXXXXXXXXXXX_!!0-item_pic.jpg_60x60q90.jpg
大图链接:http://gi1.md.alicdn.com/bao/uploaded/i1/TB128CJGpXXXXa0XXXXXXXXXXXX_!!0-item_pic.jpg
还有一点要注意,就是要对这个提取器配置添加“链接下载过滤器”,这样采集器会把这些图像都保存到本地,方便后续处理。

脚本:
function(){
var img = [];
jQuery('#J_UlThumb').find('img').each(function(){
var s = jQuery(this).attr('src');
// 对小图链接进行截取得到大图链接
var postfix = s.substring(s.lastIndexOf('.'));
s = s.substring(0, s.lastIndexOf('.'));
s = s.substring(0, s.lastIndexOf('.'));
s = s + postfix;
img.push(s);
});
return {
mainImgs:{
type:'list',
value:img,
useFor:'save',
tag:''
}
}
}
采集天猫SKU,天猫产品参数
这两个不用多说,只是从HTML中取出SKU信息。跟平时我们用JQ操作DOM是一样一样的。


采集天猫产品主信息
天猫商品主信息都放在一个script标签中,取得这个script的内容,并进行截取,就可以得到天猫商品主信息。
function(){
//取得script标签中的内容
var str = document.getElementById('J_FrmBid').nextSibling.nextSibling.innerHTML;
//对内容进行截取
str = str.substring(str.indexOf('TShop.Setup(') + 12);
str = str.substring(0, str.lastIndexOf(');'));
str = str.substring(0, str.lastIndexOf(');'));
//解析成json
var result = JSON.parse(str);
return {
mainInfo:{
type:'data',
value:result,
useFor:'save',
tag:''
}
};
}
采集天猫产品主信息2
通过网页分析我们知道天猫商品的一部分信息是通 http://mdskip.taobao.com/core/initItemDetail.htm 这个链接进行加载的,所以我们定义了一个提取器,提取时机为网络加载之后,用于采集这部分的内容。
注意“提取脚本”中的resp参数,“网络连接加载之后”的处理器处理脚本都会接收这个参数,可通过resp.responseText取得网络加载的内容。

采集天猫产品描述,scrollTo
这两个处理器是组合使用的。在网页分析时我们知道产品描述是懒加载的。如果在网页加载完成后就通过$(‘#description’).html()来提取产品描述,只能提取到“描述加载中”几个字。我们要模拟用户慢慢拖动滚动条滚动网页,scrollTo处理器就是用于模拟这个过程,以触发产品描述的懒加载。

//scrollTo的执行脚本
function(){
//定义一个全局变量,用于记录当前滚动高度
window.myScrollHeight = 0;
//定义一个全局函数,
window.doScrollTo = function(){
//滚动高度增加100
window.myScrollHeight += 100;
window.scrollTo(0, window.myScrollHeight);
var nHeight = document.documentElement.scrollTop + window.screen.availHeight;
//如果已经滚动到底了,调用跨域加载,用于触发提取器“采集天猫产品描述”
if(nHeight >= document.body.scrollHeight){
//注意这里要加上r=Math.random(),防止因网页缓存而不加载
jQuery.ajax({url:"http://localhost:8090/FireSpider/html/index.html?r=" + Math.random(),crossDomain:true});
} else {
//如果还没有滚动到底,200毫秒后再次调用doScrollTo
window.setTimeout("doScrollTo()", 200);
}
}
//200毫秒后调用doScrollTo
window.setTimeout("doScrollTo()", 200);
}
“采集天猫产品描述”定义为在http://localhost:8090/FireSpider/*加载完成后执行。而此网络连接正是由scrollTo触发加载的。

2.2 列表页采集模块

天猫商品列表下一页链接
商品列表页是分页显示的,列表页都要采集。在采集每一页列表页的时候,都看看是否有“下一页”链接,把链接加入采集URL中。

脚本
function(){
// 如果有”下一页”链接
var len = jQuery('.next').length;
if(len > 0){
var url = jQuery('.next').attr('href');
return {
nextPage:{
type : 'data',
value : url,
useFor : 'url',
tag : 'TmallProductList'
}
};
}
}
采集列表页商品链接
用于采集列表页的商品链接,这是个xpath提取器,通过firebug可看到xpath是 .//dd[@class='detail']/a[@class='item-name']

3. 过滤器
需要配置过滤器的有:“天猫商品图像”,“采集天猫产品描述”,目的是要把图片保存到本地。
天猫商品图像

采集天猫产品描述

4. 采集任务
4.1 单个商品采集任务(测试用)
这个任务只是采集一个商品,主要是用来测试看商品页的采集是否能成功运行。

4.2 正式采集任务
这个是正式的采集任务,入口是商品列表页的第一页。

使用火蜘蛛采集器Firespider采集天猫商品数据并上传到微店的更多相关文章
- 火车头采集器如何采集QQ群成员中的QQ号
如何采集QQ群群员QQ号,采集QQ号,批量采集QQ号 众所周知,QQ群群员QQ号无法导出,即使会员也不可以,那我们只能通过三方工具来实现我们的要求,那今天我们讲讲如何通过火车采集器来采集QQ群群员QQ ...
- selenium跳过webdriver检测并爬取天猫商品数据
目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 现在爬取淘宝,天猫商品数据都是需要首先进行登录的.上一节我们已经完成了模拟登录淘宝的步骤,所以在此不详细讲如何模拟登录淘宝.把关 ...
- Python爬虫学习教程:天猫商品数据爬虫
天猫商品数据爬虫使用教程 下载chrome浏览器 查看chrome浏览器的版本号,下载对应版本号的chromedriver驱动 pip安装下列包 pip install selenium pip in ...
- 八爪鱼采集器︱爬取外网数据(twitter、facebook)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 要想采集海外数据有两种方式:云采集+单机采集. ...
- SSH—网上商城之商品图片文件上传
前言 网上商城中的淘宝图片要显示在页面的前提是图片应该已经在数据库里面,那么怎么实现图片的上传功能呢,这就是今天要说的主题. 内容 需求: 商城后台需要添加图片文件,用来图片显示 解决方式: Stru ...
- javacoo/CowSwing 丑牛迷你采集器
丑牛迷你采集器是一款基于Java Swing开发的专业的网络数据采集/信息挖掘处理软件,通过灵活的配置,可以很轻松迅速地从 网页上抓取结构化的文本.图片.文件等资源信息,可编辑筛选处理后选择发布到网站 ...
- discuz论坛用户资料采集器
discuz论坛用户资料采集器, 自动采集用户信息!
- 一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包
欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人网站: https://www.exception.site/essay/create-tar-gz-by-j ...
- zabbix主动模式,自定义Key监控 zabbix采集器
主动模式不是只能用模板提供的标准检测器方式 zabbix-agent两种运行方式即主动模式和被动模式.默认被动模式. 两种模式是相对 客户端 角度来说的. 被动模式:等待server来取数据,可以使用 ...
随机推荐
- 用户的 添加 权限 MySql远程登录
添加一个用户 '; 为这个叫mongo的用户赋予操作z_0811数据库的所有权限 '; mysql如何修改开启允许远程连接 关于mysql远程连接的问题,大家在公司工作中,经常会遇到mysql数据 ...
- md5加密(3)---org.apache.commons.codec.digest.DigestUtils.md5Hex(input)
import org.apache.commons.codec.digest.DigestUtils;String sig = DigestUtils.md5Hex("str")
- Java线程状态切换以及核心方法
1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...
- python学习笔记(六):常用模块
一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...
- Python Twisted系列教程21: Twisted和Haskell
作者:dave@http://krondo.com/twisted-and-haskell/ 译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted ...
- kali2.0安装及使用笔记(附带vim配置,长期更新)
作者:陈栋权 时间:16/08/19 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 如有特别用途,请与我联系邮 ...
- Python 小知识点(6)--静态方法、类方法、属性方法
(1)静态方法-->-@staticmethod装饰类中方法 只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性 class Dog(object): def __init__ ...
- django模版 常用变量
在request中有很多有用的东西,如下: 获取当前用户: 1 {{ request.user }} 如果登陆就显示内容,不登陆就不显示内容: 1 2 3 4 5 {% if request.user ...
- EF中关系映射问题
一对一,和一对多的简单问题就部说了,直接来多对多这样的问题吧. 首现关系映射为这样的: /// <summary> /// 对应数据库中dbo.Address表 /// </summ ...
- 使用avalon 实现一个序列号功能
avalon"操作数据即操作DOM"的能力,让我们可以专致于业务,写出更专业,更优雅,更易维护的代码来.现在让我们看看如何实现一个序列号输入功能.它的需求以下: 每输入4个字符就跳 ...