java爬虫 题库_教您使用java爬虫gecco抓取JD全部商品信息(三)

详情页抓取

商品的基本信息抓取完成后,就要针对每个商品的详情页进行抓取,可以看到详情页的地址格式一般如下:外链网址已屏蔽。我们建立商品详情页的Bean:

@Gecco(matchUrl="外链网址已屏蔽{code}.html", pipelines="consolePipeline")

public classProductDetailimplementsHtmlBean{

private static final long serialVersionUID = -377053120283382723L;

/**

* 商品代码

*/

@RequestParameter

private String code;

/**

* 标题

*/

@Text

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

private String title;

/**

* ajax获取商品价格

*/

@Ajax(url="外链网址已屏蔽[code]")

private JDPrice price;

/**

* 商品的推广语

*/

@Ajax(url="外链网址已屏蔽{code}&area=1_2805_2855_0&cat=737%2C794%2C798")

private JDad jdAd;

/*

* 商品规格参数

*/

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

private String detail;

publicJDPricegetPrice(){

return price;

}

publicvoidsetPrice(JDPrice price){

this.price = price;

}

publicStringgetTitle(){

return title;

}

publicvoidsetTitle(String title){

this.title = title;

}

publicJDadgetJdAd(){

return jdAd;

}

publicvoidsetJdAd(JDad jdAd){

this.jdAd = jdAd;

}

publicStringgetDetail(){

return detail;

}

publicvoidsetDetail(String detail){

this.detail = detail;

}

publicStringgetCode(){

return code;

}

publicvoidsetCode(String code){

this.code = code;

}

}

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

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

一种是花括号{},可以获取request的参数类似@RequestParameter,例子中获取推广语的{code}是matchUrl="外链网址已屏蔽{code}.html"中的code;

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

json数据的元素抽取

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

public classJDPriceimplementsJsonBean{

private static final long serialVersionUID = -5696033709028657709L;

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

private String code;

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

private float price;

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

private float srcPrice;

publicfloatgetPrice(){

return price;

}

publicvoidsetPrice(floatprice){

this.price = price;

}

publicfloatgetSrcPrice(){

return srcPrice;

}

publicvoidsetSrcPrice(floatsrcPrice){

this.srcPrice = srcPrice;

}

publicStringgetCode(){

return code;

}

publicvoidsetCode(String code){

this.code = code;

}

}

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

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

public classJDadimplementsJsonBean{

private static final long serialVersionUID = 2250225801616402995L;

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

private String ad;

@JSONPath("$.ads")

private List ads;

publicStringgetAd(){

return ad;

}

publicvoidsetAd(String ad){

this.ad = ad;

}

publicListgetAds(){

return ads;

}

publicvoidsetAds(List ads){

this.ads = ads;

}

}

学会分析ajax请求

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

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

还一种就是需要哪些ajax就执行哪些,这就要开发人员分析网页中的ajax请求,获得请求的地址,比如抓取JD的商品价格的地址@Ajax(url="外链网址已屏蔽[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提问,当然也可以在博客中留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值