系列教程:php
手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫chrome
手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取segmentfault
都已经三节课了,你们活动活动手脚,我们开始一场真正的硬仗, 咱们要来爬电商老大,淘宝的数据了。数组
老规矩,爬以前首先感谢淘宝公布出这么多有价值的数据,才让咱们这些爬虫们有东西能够搜集啊,不过淘宝就不用我来安利了浏览器
广大剁手党相信睡觉的时候都能把网址打出来吧。dom
工欲善其事,必先利其器,先上工具:工具
一、神箭手云爬虫,二、Chrome浏览器 三、Chrome的插件XpathHelper 不知道是干吗的同窗请移步第一课
好了,我们仍是先打开淘宝网:测试
清新的画面,琳琅满目的商品,隐约感到的是前方是一场恶战:ui
淘宝这么多的商品,这么多的主题,到底从哪里开始呢?要不就女装了,别问我为何,我们先打开一个女装的列表页面:
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。