`
xtuhcy
  • 浏览: 143006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

教您使用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提问,当然也可以在博客中留言。

3
3
分享到:
评论

相关推荐

    轻量化的Java网络爬虫 GECCO.zip

    }demo地址:教您使用java爬虫gecco抓取JD全部商品信息(一)教您使用java爬虫gecco抓取JD全部商品信息(二)教您使用java爬虫gecco抓取JD全部商品信息(三)集成Htmlunit下载页面爬虫的监控一个完整的例子,分页处理...

    java爬虫教程及工具应用

    #### 三、Java爬虫框架介绍 ##### 3.1 Apache Nutch Apache Nutch是一个高度可扩展且开放源代码的Web爬虫项目。它可以用来爬取和索引网页,并提供了一个强大的搜索引擎。 - **特点**: - 支持分布式爬取。 - 可...

    Java爬虫信息抓取共14页.pdf.zip

    【标题】"Java爬虫信息抓取共14页.pdf.zip"揭示了这是一份关于使用Java编程语言进行网络爬虫技术的教程,总计14个页面,且内容被压缩在了一个PDF文档中。这份教程可能涵盖了从基础知识到实战应用的各种主题,帮助...

    java爬虫抓取网页数据教程.pdf

    本文是一份关于使用Java语言进行网页数据抓取的教程,主要介绍了使用Apache HttpClient这个库来完成网络请求和数据获取的操作。Apache HttpClient是一个支持HTTP协议的客户端工具,被广泛应用于Java爬虫开发中,帮助...

    Gecco(java爬虫)

    Gecco是一款用java语言开发的轻量化的易用的网络爬虫。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等优秀框架,让您只需要配置一些jquery风格的选择器就能很快的写出一个爬虫。Gecco框架...

    java爬虫Gecco工具抓取新闻实例

    Java爬虫Gecco工具是Java领域中用于网页抓取的一个简单易用的框架,它借鉴了jQuery的选择器语法,使得开发者能方便地定位到需要抓取的网页元素。本文将详细解析如何使用Gecco工具抓取新闻实例,包括配置依赖、编写...

    Java爬虫,信息抓取的实现 完整实例源码

    在这个“Java爬虫,信息抓取的实现 完整实例源码”中,我们将深入探讨如何使用Java来编写爬虫,尤其是通过jsoup库进行网页解析。 首先,jsoup是一个非常强大的Java库,它提供了对HTML文档的结构化访问和操作能力。...

    java爬虫抓取网页数据教程(20210809124656).pdf

    根据提供的文件信息,文档标题为“java爬虫抓取网页数据教程”,此文件属于IT技术类教程,特别关注于Java编程语言在编写网络爬虫方面的应用。在这份教程中,将会涉及到使用HttpClient工具在Java环境中抓取网页数据的...

    java爬虫,抓取网页图片

    Java爬虫技术是一种利用编程语言(本例中是Java)自动化地从互联网上获取信息的手段。对于初学者来说,理解并实现一个简单的Java爬虫能够帮助他们掌握网络数据抓取的基本原理。在这个过程中,主要涉及以下几个核心...

    java网络爬虫抓取网页数据

    Java网络爬虫是一种自动化程序,用于从互联网上抓取大量数据。它的工作原理是模拟浏览器发送HTTP请求到服务器,接收响应,并解析返回的HTML或XML文档以提取所需信息。在这个过程中,HttpClient是一个常用的Java库,...

    java爬虫抓取图片

    Java爬虫技术是一种用于自动化网页数据抓取的编程方法,尤其在处理图片抓取时,它可以帮助我们批量下载网络上的图像资源。对于新手来说,掌握Java爬虫抓取图片的基本步骤和技巧是十分有益的。 首先,我们需要了解...

    java爬虫抓取城市数据

    java爬虫抓取城市数据,数据抓取后直接持久化到数据库当中。博客地址http://blog.csdn.net/qq_23994787/article/details/78107890 如果没有积分的话,在主页给博主发邮件获取。

    亚马逊爬虫抓取商品信息并数据分析.zip

    亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品...

    简单的java爬虫抓取网页实现代码

    简单Java爬虫,抓取网页内容,让你了解爬虫机制,熟悉网络编程

    基于Java和多框架整合的网络爬虫Gecco设计源码

    本项目是基于Java开发的网络爬虫Gecco设计源码,主要使用Java进行开发。项目共包含164个文件,其中Java源代码文件153个,Git忽略配置文件2个,Markdown文档文件2个,YAML配置文件1个,项目许可证文件1个,JPG图片...

    java爬虫webmagic抓取静态页面demo

    Java爬虫WebMagic是开发者常用来抓取网页数据的一个强大工具,尤其对于处理静态页面,它的易用性和灵活性使得在Java开发环境中非常受欢迎。WebMagic的设计理念是模块化,这使得我们可以灵活地组合各个组件来实现不同...

    Java爬虫信息抓取的实现 完整实例(源码)

    Java爬虫技术是一种用于自动化网页数据抓取的编程方法,主要应用于数据分析、信息提取和搜索引擎构建等领域。在这个完整的实例中,我们将深入探讨如何使用Java语言编写一个基础的网络爬虫,通过源码学习其实现过程。...

    JAVA爬虫实现自动登录淘宝

    JAVA爬虫是指使用JAVA编程语言来实现网页爬虫的技术。爬虫是指模拟用户的行为来自动获取网络资源的程序。JAVA爬虫可以用来自动登录淘宝网,实现自动登录淘宝网的功能。 在本例中,我们使用了Selenium工具来实现自动...

    很简易的java爬虫 可以爬取携程的航班数据.rar

    【标题】:“很简易的java爬虫 可以爬取携程的航班数据.rar”揭示了这个项目是一个基于Java实现的简单网络爬虫,其主要功能是抓取携程网站上的航班信息。 【描述】:“很简易的java爬虫 可以爬取携程的航班数据,并...

Global site tag (gtag.js) - Google Analytics