版权声明:本文为博主原创文章,未经博主允许不得转载。

系列教程:

手把手教你写电商爬虫-第一课 找个软柿子捏捏

手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取

老规矩,爬之前首先感谢淘宝公布出这么多有价值的数据,才让我们这些爬虫们有东西可以搜集啊,不过淘宝就不用我来安利了

广大剁手党相信睡觉的时候都能把网址打出来吧。

工欲善其事,必先利其器,先上工具:

1、神箭手云爬虫,

2、Chrome浏览器

3、Chrome的插件XpathHelper 不知道是干嘛的同学请移步第一课

好了,咱们还是先打开淘宝网:

清新的画面,琳琅满目的商品,隐约感到的是前方是一场恶战:

淘宝这么多的商品,这么多的主题,到底从哪里开始呢?要不就女装了,别问我为什么,咱们先打开一个女装的列表页面:

https://s.taobao.com/list?q=%E5%A5%97%E8%A3%85%E5%A5%B3%E5%A4%8F

我们点击一下下一页看看连接:

https://s.taobao.com/list?q=%E5%A5%97%E8%A3%85%E5%A5%B3%E5%A4%8F&bcoffset=-4&s=60

看着好像不难,很简单,不过值得注意的是,我们把鼠标移到下一页可以看到连接本身并不是这个,这个是js处理的,这种情况类似前面我们遇到的尚妆网下一页,我们一会再说。

我们再看下详情页

https://item.taobao.com/item.htm?spm=a217f.7283053.1997524073.204.hEmtfc&id=527101625954&scm=1029.minilist-17.1.16&ppath=&sku=&ug=#detail

https://item.taobao.com/item.htm?spm=a217f.7283053.1997524073.209.hEmtfc&id=528697742170&scm=1029.minilist-17.1.16&ppath=&sku=&ug=#detail

看着比较简单,就直接提取成:

https://item\\.taobao\\.com/item\\.htm\\?.*

我比较懒,这个就先这样吧,然后我们来看看详情页我们需要抽取哪些信息,商品名称,价格自然不能少,这次再来一个新鲜的,就是缩略图列表,因为淘宝的商品不只有一个缩略图,因此需要爬取一个缩略图数组。

同样,用chrome开发者工具和xpathhelper对抽取项进行分析,看了一下结果,尝试过滤xhr,结果:

高手就是高手,在大量的请求中,找到响应的请求,相当的困难。不要紧,还记得我们上节课提到的核武器吗-JS渲染引擎,只要我们把JS渲染引擎打开,那么我们完全不用操心大量ajax请求的判断,当然他的问题是效率低一些,不过没关系,反正在云上跑嘛,睡一觉就好了。

在神箭手里调用JS渲染引擎的方式很简单,只需要一行代码设置既可:

configs.enableJS=true  

好了,那我们现在可以无视ajax请求了,直接用chrome工具打开,直接提取:

//em[@id="J_PromoPriceNum"]  
简单暴啦,然后高兴没有1秒钟,瞬间蒙逼,淘宝上的价格不仅有这种促销价格,还有价格区间,还有的是普通的价格,我的天的,这不是要人命吗~

没办法,再难也要硬着头皮上,目前来看,一共有两种价格的抽取方式,当然不排除有其他多种的情况,我们先对这两种分别写一下抽取规则:

//em[@id="J_PromoPriceNum"]
//em[contains(@class,"tb-rmb-num")]

我们可以通过 | 这个来连接,表达不同页面的选取可以共存

//em[@id="J_PromoPriceNum"] | //em[contains(@class,"tb-rmb-num")]  

不容易。我们再看看商品名称,这个相对简单:

//h3[contains(@class,'tb-main-title')]/@data-title  

最后,我们需要抽取图片的地址:

//ul[@id="J_UlThumb"]/li//img/@src  

由于这一项存在多项,因此需要将该抽取规则的repeated字段设置成true

  var configs = {
domains: ["www.taobao.com","item.taobao.com"],
scanUrls: ["https://www.taobao.com/go/market/nvzhuang/citiao/taozhuangqun.php"],
contentUrlRegexes: ["https://item\\.taobao\\.com/item\\.htm\\?.*"],
helperUrlRegexes: ["https://www\\.taobao\\.com/go/market/nvzhuang/citiao/taozhuangqun.php"],//可留空
enableJS:true,
fields: [
{
// 第一个抽取项
name: "title",
selector: "//h3[contains(@class,'tb-main-title')]/@data-title",//默认使用XPath
required: true //是否不能为空
},
{
// 第二个抽取项
name: "price",
selector: "//em[@id='J_PromoPriceNum'] | //em[contains(@class,'tb-rmb-num')]",//默认使用XPath
},
{
// 第三个抽取项
name: "thumbs",
selector: "//ul[@id='J_UlThumb']/li//img/@src",//默认使用XPath
},
]
};
var crawler = new Crawler(configs);
crawler.start();

好了,虽然淘宝比尚妆网难的多,但是在我们拿出核武器之后,一切迎刃而解,回头我们在来处理下一页的问题,这里虽然和尚妆网不一样,但是整体的原理大同小异,就不一一解释,我们直接上代码:

  var configs = {
domains: ["s.taobao.com","item.taobao.com"],
scanUrls: ["https://s.taobao.com/list?q=%E5%A5%97%E8%A3%85%E5%A5%B3%E5%A4%8F"],
contentUrlRegexes: ["https?://item\\.taobao\\.com/item\\.htm\\?.*"],
helperUrlRegexes: ["https?://s\\.taobao\\.com/list\\?q=%E5%A5%97%E8%A3%85%E5%A5%B3%E5%A4%8F.*"],//可留空
enableJS:true,
fields: [
{
// 第一个抽取项
name: "title",
selector: "//h3[contains(@class,'tb-main-title')]/@data-title",//默认使用XPath
required: true //是否不能为空
},
{
// 第二个抽取项
name: "price",
selector: "//em[@id='J_PromoPriceNum'] | //em[contains(@class,'tb-rmb-num')]",//默认使用XPath
required: true //是否不能为空
},
{
// 第三个抽取项
name: "thumbs",
selector: "//ul[@id='J_UlThumb']/li//img/@src",//默认使用XPath
repeated:true
},
]
};
configs.onProcessHelperUrl = function(url, content, site){
if(!content.indexOf("未找到与")){
var currentStart = parseInt(url.substring(url.indexOf("&s=") + 3));
var start = currentStart + 60;
var nextUrl = url.replace("&s=" + currentStart, "&s=" + start);
site.addUrl(nextUrl);
}
return true;
};
var crawler = new Crawler(configs);
crawler.start();

OK 大功告成,测试结果如下,由于开启的js渲染,所以爬取的速度比较慢,只能耐心等待了。

对爬虫感兴趣的童鞋可以加qq群讨论:342953471。

手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染的更多相关文章

  1. 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...

  2. [原创]手把手教你写网络爬虫(4):Scrapy入门

    手把手教你写网络爬虫(4) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 咦?怎么有人扔西红柿 ...

  3. [原创]手把手教你写网络爬虫(5):PhantomJS实战

    手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...

  4. [原创]手把手教你写网络爬虫(7):URL去重

    手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...

  5. 手把手教你写基于C++ Winsock的图片下载的网络爬虫

    手把手教你写基于C++ Winsock的图片下载的网络爬虫 先来说一下主要的技术点: 1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址) 2. 使用socket套接字 ...

  6. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  7. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

  8. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  9. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

随机推荐

  1. Java笔记(十一)……单例设计模式

    设计模式 解决某一类问题最行之有效的方法 Java中有23中设计模式 单例设计模式 解决一个类在内存中只存在一个对象 思路 将构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取到对象 两种方 ...

  2. wuzhicms 发送邮件

    发送邮件 //邮件发送 $config = get_cache('sendmail'); $siteconfigs = get_cache('siteconfigs'); $password = de ...

  3. linux shell 中"2>&1"含义

    脚本是:      nohup /mnt/Nand3/H2000G  >/dev/null  2>&1  &      对于& 1 更准确的说应该是文件描述符 1, ...

  4. Git log高级用法

    格式化Log输出 首先,这篇文章会展示几种git log格式化输出的例子.大多数例子只是通过标记向git log请求或多或少的信息. 如果你不喜欢默认的git log格式,你可以用git config ...

  5. SIP SDP RTSP RTP RTCP webrtc

    rfc1889  rfc2326  rfc3261  rfc3550  rfc3856  rfc6120. SIP SDP RTSP  RTP RTCP,就像他们出现的顺序一样,他们在实际应用中的启用 ...

  6. (太强大了) - Linux 性能监控、测试、优化工具

    转: http://www.vpsee.com/2014/09/linux-performance-tools/ Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经 ...

  7. HDU1542--Atlantis(扫描线)

    给N个矩形的端点坐标,求矩形覆盖面积和. 原理很简单,从左到右扫描,线段树记录的是纵向覆盖的长度.区间更新.因为坐标是实数而且很大,所以需要离散化. WA+RE+CE+MLE+...一共错了二十多次. ...

  8. 表达式计算器(LL1文法)

    LL(1)文法求算数表达式的值递归子程序法 分析过程: 表达式文法G[E]:E->E+T|E-T|TT->T*F|T/F|T%F|FF->N^F|NN->(E)|NUM|+NU ...

  9. PC-删除共享[绝对够狠的方法]

    1.批处理清除法-------------------------------------------------------------------------------------------- ...

  10. java20 创建服务器:ServerSocket

    创建服务器:ServerSocket import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...