系列教程html
若是没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,经过软柿子"切糕王子"这个电商网站好好的练了一次手,相信你们都应该对写爬虫的流程有了一个大概的了解,那么这课我们就话很少说,正式上战场,对垒尚妆网。正则表达式
首先,向咱们被爬网站致敬,没有他们提供数据,咱们更是无从爬起,因此先安利一下尚妆网:chrome
经营化妆品时尚购物,大数据为驱动,并依托智能首饰为入口的新一代智慧美妆正品电子商务平台。其创始团队来自天猫、支付宝、欧莱雅、薇姿等互联网公司和化妆品集团。浏览器
好吧,我很懒,直接从百度知道里抄过来的,不过不表明我没有诚意。OK,言归正传,咱们先把咱们的工具包拿出来:框架
一、神箭手云爬虫框架,二、Chrome浏览器 三、Chrome的插件XpathHelper 不知道是干吗的同窗请移步第一课dom
古代战士上战场前,必须先好好的观察对手,所谓知己知彼,百战不殆。咱们先来观察一下尚妆网异步
从首页你们能看出什么?说美女很美的,还有说美女表情很到位的同窗,大家能够先回家了。工具
剩下的同窗,咱们继续了:大数据
可 以看出,做为一个完善的电商网站,尚妆网有着普通电商网站所拥有的主要的元素,包括分类,分页,主题等等。首先咱们要肯定咱们但愿要爬取哪一类数据,固然 做为爬虫来讲,所有爬下来不是不行,不过对于作实验来讲,就不必了。好,咱们假设:咱们要爬护肤里的面膜品类全部商品,价格和销量,至于为何是面膜, 大家猜呢?
废话太多了,咱们开始爬虫三步走,跟着我再背诵一遍:一、选入口Url 二、限定内容页和中间页 三、写内容页抽取规则
一、选定入口url
这个简单,找到面膜页面的地址:http://list.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C
好,就是它了。
二、区份内容页和中间页
好,重点来了,尚妆网的列表页面,是经过ajax动态加载了,这个怎么实现呢?咱们先不着急,先看下内容页
http://item.showjoy.com/sku/26551.html
http://item.showjoy.com/sku/100374.html
内容页很简单,咱们直接提取成正则表达式
http://item\\.showjoy\\.com/sku/\\d+\\.html
那么列表页呢?首先,第一个固然是:
http://list.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C
下一页的连接是什么呢?这个时候就须要借助chrome浏览器的开发者工具,咱们打开工具,切换到network选项卡,向下滑动加载下一页,能够看到展现出的链接地址:
注意,能够忽略掉png这些图片的文件,直接看到下一页的链接,咱们将连接复制出来:
http://list.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C&stock=1&page=4&_synToken=59a6c555b0947486769f35d010353cd5
看着好像很复杂,不过page我认识,其余的能够去掉吗?咱们试一下访问
http://list.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C&page=4
貌似正常打开,并且也能够显示不一样的商品,就此咱们能够看出来,这个ajax加载下一页不过是一个纸老虎,根本没什么可怕的。咱们将这个提取成正则表达式,另外 值得注意的是,因为咱们第一页多是没有page的,因此也须要考虑没有page参数的状况
http://list\\.showjoy\\.com/search/\\?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C(&page=\\d+)?
这里再次提醒你们,注意正则的点和问好都是要转义的,而且转义须要两个\,好,第二步大功告成。
第 三步:就是写内容页的抽取规则了,咱们就抽取商品名称,评价数和成交数这三项数据吧,有人要问了,为啥不要价格呢。我只能说,too young too native,你打开商品页面的时候,有没有注意到价格的地方也一个快速的异步加载。考虑到我们毕竟才第二课,并且刚刚还没那个ajax搞得虎躯一震,差 一点把这节课改为第三课,因此我们这里先下降点难度,下一课我们用一节课的时间来探讨下这个价格该怎么提取。
根据前面课程教的方案,咱们一样的方法,写出xpath:
标题://h3[contains(@class ,"choose-hd")]
评价://div[contains(@class ,"dtabs-hd")]/ul/li[2]
成交记录://div[contains(@class ,"dtabs-hd")]/ul/li[3]
经过xpath helper进行验证以后没有问题,这样咱们能够组合代码获得下面的结果
var configs = { domains: ["www.showjoy.com","list.showjoy.com","item.showjoy.com"], scanUrls: ["http://list.showjoy.com/search/?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C"], contentUrlRegexes: ["http://item\\.showjoy\\.com/sku/\\d+\\.html"], helperUrlRegexes: ["http://list\\.showjoy\\.com/search/\\?q=cateIds%3A1,cateName%3A%E9%9D%A2%E8%86%9C(\\&page=\\d+)?"],//可留空 fields: [ { // 第一个抽取项 name: "title", selector: "//h3[contains(@class,'choose-hd')]",//默认使用XPath required: true //是否不能为空 }, { // 第二个抽取项 name: "comment", selector: "//div[contains(@class,'dtabs-hd')]/ul/li[2]",//使用正则的抽取规则 required: false //是否不能为空 }, { // 第三个抽取项 name: "sales", selector: "//div[contains(@class,'dtabs-hd')]/ul/li[3]",//使用正则的抽取规则 required: false //是否不能为空 } ] }; start(configs);
能够看到在domains里 我填入了三个域名,这里是必定要注意的,由于他的列表页和详情页的域名都不一致,所以须要把每个域名都写进去。
好了,代码运行正常,可是启动任务以后发现,怎么第二页的内容没有采集到呢? 还有前面说的价格我们也采集不到,到底还能不能愉快的玩耍了呢? 咱们第三课就给你们讲讲如何解决ajax页面的url发现和ajax加载内容的提取。
对爬虫感兴趣的童鞋能够加qq群讨论:342953471。