教您使用java爬虫gecco抓取JD全部商品信息(二)
详情页抓取
商品的基本信息抓取完成后,就要针对每个商品的详情页进行抓取,可以看到详情页的地址格式一般如下:http://item.jd.com/1861098.html。我们建立商品详情页的Bean:
@Gecco(matchUrl="http://item.jd.com/{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="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;
}
publicvoidsetPrice(JDPrice price){
this.price = price;
}
public String getTitle(){
return title;
}
publicvoidsetTitle(String title){
this.title = title;
}
public JDad getJdAd(){
return jdAd;
}
publicvoidsetJdAd(JDad jdAd){
this.jdAd = jdAd;
}
public String getDetail(){
return detail;
}
publicvoidsetDetail(String detail){
this.detail = detail;
}
public String getCode(){
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="http://item.jd.com/{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(float price){
this.price = price;
}
publicfloatgetSrcPrice(){
return srcPrice;
}
publicvoidsetSrcPrice(float srcPrice){
this.srcPrice = srcPrice;
}
public String getCode(){
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<JSONObject> ads;
public String getAd(){
return ad;
}
publicvoidsetAd(String ad){
this.ad = ad;
}
public List<JSONObject> getAds(){
return ads;
}
publicvoidsetAds(List<JSONObject> 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选项可以看到页面中的所有请求:
可以看到请求的地址是:http://p.3.cn/prices/get?type=1&area=1_2805_2855&pdtk=&pduid=836516317&pdpin=&pdbp=0&skuid=J_1861098&callback=cnp。我们去掉其他参数只留下商品的代码,发现一样可以访问,http://p.3.cn/prices/get? skuid=J_1861098就是我们要请求的地址。
gecco的其他一些有用的特性
- gecco支持页面中的定义的全局javascript变量的提取,如页面中定义的var变量。
- gecco支持分布式抓取,通过redis管理startRequest实现分布式抓取。
源码
全部源代码可以在gecco的github上下载,代码位于src/test/java/com/geccocrawler/gecco/demo/jd包下。如果使用过程中发现任何bug欢迎Pull request,或者通过Issue提问,当然也可以在博客中留言。
相关推荐
}demo地址:教您使用java爬虫gecco抓取JD全部商品信息(一)教您使用java爬虫gecco抓取JD全部商品信息(二)教您使用java爬虫gecco抓取JD全部商品信息(三)集成Htmlunit下载页面爬虫的监控一个完整的例子,分页处理...
对java爬虫的讲解以及对工具框架的应用 对java爬虫的讲解以及对工具框架的应用
Java爬虫信息抓取.pdf
java爬虫抓取网页数据教程.pdf
Gecco是一款用java语言开发的轻量化的易用的网络爬虫。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等优秀框架,让您只需要配置一些jquery风格的选择器就能很快的写出一个爬虫。Gecco框架...
本篇文章主要介绍了JAVA 爬虫Gecco工具抓取新闻实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
java爬虫抓取网页数据教程(20210809124656).pdf
java爬虫,可以抓取网页中图片信息,适用与爬虫学习者
Java爬虫信息抓取共14页.pdf.zip
Java爬虫,信息抓取的实现 详细完整源码实例打包给大家,需要的可以下载下载学习!!!
java爬虫抓取城市数据,数据抓取后直接持久化到数据库当中。博客地址http://blog.csdn.net/qq_23994787/article/details/78107890 如果没有积分的话,在主页给博主发邮件获取。
简单Java爬虫,抓取网页内容,让你了解爬虫机制,熟悉网络编程
java爬虫抓取图片,单线程,代码简洁,适合新手使用,有问题的话可以来博主主页留言探讨,一起解决技术问题。
本项目是基于Java开发的网络爬虫Gecco设计源码,主要使用Java进行开发。项目共包含164个文件,其中Java源代码文件153个,Git忽略配置文件2个,Markdown文档文件2个,YAML配置文件1个,项目许可证文件1个,JPG图片...
通过Java网络爬虫爬取指定代理ip网上的ip,利用了jsoup、httpclient技术实现
利用HttpClient抓取网页中简单的数据,数据可存入数据库进行分析
【Java爬虫】信息抓取的实现 完整实例(源码)
java爬虫抓取新闻.zip
java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用 java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用 java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用java爬虫需要的jar包...
使用java代码基于MyEclipse开发环境实现爬虫抓取网页中的表格数据,将抓取到的数据在控制台打印出来,需要后续处理的话可以在打印的地方对数据进行操作。包解压后导入MyEclipse就可以使用,在TestCrawTable中右键...