##详情页抓取 商品的基本信息抓取完成后,就要针对每个商品的详情页进行抓取,可以看到详情页的地址格式一般如下:http://item.jd.com/1861098.html。我们建立商品详情页的Bean:

@Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline")

public class ProductDetail implements HtmlBean {

private static final long serialVersionUID = -377053120283382723L;

/**

* 商品代码

*/

@RequestParameter

private String code;

/**

* 标题

*/

@Text

@HtmlField(cssPath="#name > h1")

private String title;

/**

* ajax获取商品价格

*/

@Ajax(url="http://p.3.cn/prices/get?skuIds=J_[code]")

private JDPrice price;

/**

* 商品的推广语

*/

@Ajax(url="http://cd.jd.com/promotion/v2?skuId={code}&area=1_2805_2855_0&cat=737%2C794%2C798")

private JDad jdAd;

/*

* 商品规格参数

*/

@HtmlField(cssPath="#product-detail-2")

private String detail;

public JDPrice getPrice() {

return price;

}

public void setPrice(JDPrice price) {

this.price = price;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public JDad getJdAd() {

return jdAd;

}

public void setJdAd(JDad jdAd) {

this.jdAd = jdAd;

}

public String getDetail() {

return detail;

}

public void setDetail(String detail) {

this.detail = detail;

}

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

}

@RequestParameter可以获取@Gecco里定义的url变量{code}。

@Ajax是页面中的ajax请求,JD的商品价格和推广语都是通过ajax请求异步获取的,gecco支持异步ajax请求,指定ajax请求的url地址,url中的变量可以通过两种方式指定。

一种是花括号{},可以获取request的参数类似@RequestParameter,例子中获取推广语的{code}是matchUrl="http://item.jd.com/{code}.html"中的code;

一种是中括号[],可以获取bean中的任意属性。例子中获取价格的[code]是变量private String code;。

##json数据的元素抽取 商品的价格是通过ajax获取的,ajax一般返回的都是json格式的数据,这里需要将json格式的数据抽取出来。我们先定义价格的Bean:

public class JDPrice implements JsonBean {

private static final long serialVersionUID = -5696033709028657709L;

@JSONPath("$.id[0]")

private String code;

@JSONPath("$.p[0]")

private float price;

@JSONPath("$.m[0]")

private float srcPrice;

public float getPrice() {

return price;

}

public void setPrice(float price) {

this.price = price;

}

public float getSrcPrice() {

return srcPrice;

}

public void setSrcPrice(float srcPrice) {

this.srcPrice = srcPrice;

}

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

}

我们获取的商品价格信息的json数据格式为:[{"id":"J_1861098","p":"6488.00","m":"7488.00"}]。可以看到是一个数组,因为这个接口其实可以批量获取商品的价格。json数据的数据抽取使用@JSONPath注解,语法是使用的fastjson的JSONPath语法。

JDad的抓取类似,下面是Bean的代码:

public class JDad implements JsonBean {

private static final long serialVersionUID = 2250225801616402995L;

@JSONPath("$.ads[0].ad")

private String ad;

@JSONPath("$.ads")

private List ads;

public String getAd() {

return ad;

}

public void setAd(String ad) {

this.ad = ad;

}

public List getAds() {

return ads;

}

public void setAds(List ads) {

this.ads = ads;

}

}

##学会分析ajax请求 目前爬虫抓取页面内容针对ajax请求有两种主流方式:

一种是模拟浏览器将页面完全绘制出来,比如可以利用htmlunit。这种方式存在一个问题就是效率低,因为页面中的所有ajax都会被请求,而且需要解析所有的js代码。gecco可以通过自定义downloader来实现这种方式

还一种就是需要哪些ajax就执行哪些,这就要开发人员分析网页中的ajax请求,获得请求的地址,比如抓取JD的商品价格的地址@Ajax(url="http://p.3.cn/prices/mgets?skuIds=J_[code]")。而且这个地址之后可能会变。

这两种方式都有各自的优缺点,gecco通过扩展都支持,本人还是更倾向于使用第二种方式。

下面说说怎么分析页面中的ajax请求,还是要利用chrome的开发者模式,network选项可以看到页面中的所有请求:

##gecco的其他一些有用的特性

gecco支持页面中的定义的全局javascript变量的提取,如页面中定义的var变量。

gecco支持分布式抓取,通过redis管理startRequest实现分布式抓取。

##源码 全部源代码可以在gecco的github上下载,代码位于src/test/java/com/geccocrawler/gecco/demo/jd包下。如果使用过程中发现任何bug欢迎Pull request,或者通过Issue提问,当然也可以在博客中留言。

java爬虫异步取数据_教您使用java爬虫gecco抓取JD全部商品信息(三)相关推荐

  1. python可抓取数据包括什么_Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓...

    Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用pyt ...

  2. python数据抓取工具_【重磅开源】Hawk-数据抓取工具:简明教程

    Hawk: Advanced Crawler& ETL tool written in C#/WPF 1.软件介绍 Hawk3已经发布,本文的很多信息已经不完整或过期,所有更新信息和下载地址都 ...

  3. java获取mysql的数据_【助教】Java获取数据库数据展示

    本文将给出一个最简单的Java查询数据库中一张表的数据并将查询结果展示在页面的例子. 实际上,我们要解决以下两个问题: Java与数据库交互(以JDBC为例) 数据展示在前台页面(以Servlet+J ...

  4. java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?

    用存储过程和 JAVA 写报表数据源有什么弊端?跟着小编一起来一看一下吧! 我们在报表开发中经常会使用存储过程准备数据,存储过程支持分步计算,可以实现非常复杂的计算逻辑,为报表开发带来便利.所以,报表 ...

  5. python抓取股票竞价数据_【整理】用Python+beautifulsoup抓取股票数据

    [刚开始写总结,读者如果对我的内容有任何建议欢迎留言反馈,或直接加QQ1172617666,期待交流] 先贴上代码,再详细的写一下在写这些代码的过程中遇到的问题,解决的方法. 这些代码完成的任务是:访 ...

  6. python爬取抖音用户数据_一篇文章教会你用Python抓取抖音app热点数据

    今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...

  7. 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取的原因有哪些?

    众所周知,在搜索引擎中存在的蜘蛛其实就是一段代码,这段代码通过在各个网站爬取,以便于网站内容能够被搜索引擎收录.不过一般蜘蛛爬取是按照一定规则进行的,如果网站中出现了一些爬取障碍,那么蜘蛛爬取就会被打 ...

  8. java监听路由器数据_求如何用java读取路由器上的数据,介绍点资料

    展开全部 import java.io.*; import java.util.*; public class GetRoutInfo { public static void main(String ...

  9. java爬虫 京东_教您使用java爬虫gecco抓取JD全部商品信息(一)

    #教您使用java爬虫gecco抓取JD全部商品信息(一) ##gecco爬虫 如果对gecco还没有了解可以参看一下gecco的github首页.gecco爬虫十分的简单易用,JD全部商品信息的抓取 ...

最新文章

  1. WPF中splashScreen启动程序之前出现一个过程动画的效果
  2. 数据一致性-分区可用性-性能—多副本强同步数据库系统实现之我见
  3. js 递归编程要注意的:return
  4. oracle consistent gets,oracle构建一致性读
  5. OkHttp上传文件,服务器端请求解析找不到文件信息的问题
  6. python文件读写及形式转化和CGI的简单应用
  7. java多线程实现卖票小程序
  8. Word没有到一行自动换行如何解决
  9. 2022-2028年中国飞机电子飞行包(EFB)行业市场竞争状况及发展趋向分析报告
  10. Nero8完整版下载地址
  11. 通俗理解逻辑删除和物理删除的区别
  12. 英国高中A-Level和IB课程介绍
  13. 如何比对excel表格两列数据中的相同部分或重复部分
  14. linux命令 - tail:查看文件最后几行的命令
  15. 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件
  16. JVM 内存分哪几个区,每个区的作用是什么
  17. Android-通讯录
  18. Oracle 查询临时表空间
  19. LeetCode2029. 石子游戏 IX
  20. 基于流计算 Oceanus(Flink) CDC 做好数据集成场景

热门文章

  1. 节流函数-throttle
  2. Visual C++ MFC编程 绘制直线、圆、自行车
  3. kurento代码分析(二)rtp流的处理
  4. 利用Arduino Mega的Analog端口无法驱动L298N电机芯片的解释
  5. 学计算机的气质,大学生“气质大比拼”!闷骚型计算机,直男癌土木工程,你躺枪没...
  6. java同步接口和异步接口_同步接口和异步接口
  7. 【创意代码】以程序员的方式撒狗粮,专业浪漫,值得拥有
  8. 2020年北邮计算机专业分数线,2020北京邮电大学研究生分数线一览表(含2018-2019历年复试)...
  9. 从chatGPT到语音回答雏形的python实现
  10. 将FTP虚拟成磁盘的软件——NetDrive