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

news/2024/7/19 10:39:08 标签: 爬虫, java, javascript

gecco爬虫

如果对gecco还没有了解可以参看一下gecco的github首页。gecco爬虫十分的简单易用,JD全部商品信息的抓取9个类就能搞定。

JD网站的分析

要抓取JD网站的全部商品信息,我们要先分析一下网站,京东网站可以大体分为三级,首页上通过分类跳转到商品列表页,商品列表页对每个商品有详情页。那么我们通过找到所有分类就能逐个分类抓取商品信息。

入口地址

http://www.jd.com/allSort.aspx,这个地址是JD全部商品的分类列表,我们以该页面作为开始页面,抓取JD的全部商品信息

新建开始页面的HtmlBean类AllSort

 1 @Gecco(matchUrl="http://www.jd.com/allSort.aspx", pipelines={"consolePipeline", "allSortPipeline"})
 2 public  class  AllSort  implements  HtmlBean{
 3 
 4     private static final long serialVersionUID = 665662335318691818L;
 5 
 6     @Request
 7     private HttpRequest request;
 8 
 9     //手机
10     @HtmlField(cssPath=".category-items > div:nth-child(1) > div:nth-child(2) > div.mc > div.items > dl")
11     private List<Category> mobile;
12 
13     //家用电器
14     @HtmlField(cssPath=".category-items > div:nth-child(1) > div:nth-child(3) > div.mc > div.items > dl")
15     private List<Category> domestic;
16 
17     public List<Category> getMobile(){
18         return mobile;
19     }
20 
21     public void setMobile(List<Category> mobile){
22         this.mobile = mobile;
23     }
24 
25     public List<Category> getDomestic(){
26         return domestic;
27     }
28 
29     public void setDomestic(List<Category> domestic){
30         this.domestic = domestic;
31     }
32 
33     public HttpRequest getRequest(){
34         return request;
35     }
36 
37     public void setRequest(HttpRequest request){
38         this.request = request;
39     }
40 }

可以看到,这里以抓取手机和家用电器两个大类的商品信息为例,可以看到每个大类都包含若干个子分类,用List<Category>表示。gecco支持Bean的嵌套,可以很好的表达html页面结构。Category表示子分类信息内容,HrefBean是共用的链接Bean。

public class Category implements HtmlBean{

    private static final long serialVersionUID = 3018760488621382659L;

    @Text
    @HtmlField(cssPath="dt a")
    private String parentName;

    @HtmlField(cssPath="dd a")
    private List<HrefBean> categorys;

    public String getParentName(){
        return parentName;
    }

    public void setParentName(String parentName){
        this.parentName = parentName;
    }

    public List<HrefBean> getCategorys(){
        return categorys;
    }

    public void setCategorys(List<HrefBean> categorys){
        this.categorys = categorys;
    }

}

获取页面元素cssPath的小技巧

上面两个类难点就在cssPath的获取上,这里介绍一些cssPath获取的小技巧。用Chrome浏览器打开需要抓取的网页,按F12进入发者模式。选择你要获取的元素,如图:

 

 在浏览器右侧选中该元素,鼠标右键选择Copy--Copy selector,即可获得该元素的cssPath

body > div:nth-child(5) > div.main-classify > div.list > div.category-items.clearfix > div:nth-child(1) > div:nth-child(2) > div.mc > div.items

 

如果你对jquery的selector有了解,另外我们只希望获得dl元素,因此即可简化为:

.category-items > div:nth-child(1) > div:nth-child(2) > div.mc > div.items > dl

 

编写AllSort的业务处理类

完成对AllSort的注入后,我们需要对AllSort进行业务处理,这里我们不做分类信息持久化等处理,只对分类链接进行提取,进一步抓取商品列表信息。看代码:

 1 @PipelineName("allSortPipeline")
 2 public classAllSortPipelineimplementsPipeline<AllSort> {
 3 
 4     @Override
 5     public void process(AllSort allSort) {
 6         List<Category> categorys = allSort.getMobile();
 7         for(Category category : categorys) {
 8             List<HrefBean> hrefs = category.getCategorys();
 9             for(HrefBean href : hrefs) {
10                 String url = href.getUrl()+"&delivery=1&page=1&JL=4_10_0&go=0";
11                 HttpRequest currRequest = allSort.getRequest();
12                 SchedulerContext.into(currRequest.subRequest(url));
13             }
14         }
15     }
16 
17 }

 

@PipelinName定义该pipeline的名称,在AllSort的@Gecco注解里进行关联,这样,gecco在抓取完并注入Bean后就会逐个调用@Gecco定义的pipeline了。为每个子链接增加"&delivery=1&page=1&JL=4_10_0&go=0"的目的是只抓取京东自营并且有货的商品。SchedulerContext.into()方法是将待抓取的链接放入队列中等待进一步抓取。

 


http://www.niftyadmin.cn/n/1197256.html

相关文章

Mycat学习笔记

一、mycat概念 从定义和分类来看&#xff0c;它是一个开源的分布式数据库系统&#xff0c;是一个实现了MySQL协议的的Server&#xff0c;其核心功能是分表分库&#xff0c;即将一个大表水平分割为N个小表&#xff0c;存储在后端MySQL服务器里或者其他数据库里。 Mycat是数据库中…

http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html

http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html

微信业务架构图设计

一、概述 总结项目的架构&#xff0c;记录自己理解及熟悉程度&#xff0c;通过相关的图提高自己的设计能力。 二、技术图 技术栈&#xff1a;基于springcloud、springboot、dubbo、zookeeper、zuul、Redis等技术架构&#xff0c;运用springcloud的eureka作为注册中心&#xff…

java中Runnable接口含义

Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口. Runnable接口非常简单,就定义了一个方法run(),继承Runnable并实现这个 方法就可以实现多线程了,但是这个run()方法不能自己调用,必须由系统来调用,否则就和别的方法没有什么区别了. 先给一个简单的例子: public …

企业微信之客户联系配置及使用

一、简述 企业微信跟微信是同一家公司&#xff08;T&#xff09;的产品&#xff0c;内部已经实现数据交互。从微信引流&#xff0c;企业微信对接&#xff0c;对中小公司来说是一种比较受欢迎的引流方式。下面简单描述它的对接过程。 二、操作步骤 1、信息描述 微信重要信息&…

25.dubbo脚本之restart.sh

#!/bin/bashcd dirname $0./stop.sh./start.sh#已经没有比这个更简单的了转载于:https://blog.51cto.com/8169085/1795003

kafka配置参数简介

配置及参数说明 Broker 端参数 所谓静态参数&#xff0c;是指你必须在 Kafka 的配置文件 server.properties 中进行设置的参数&#xff0c;不管你是新增、修改还是删除。同时&#xff0c;你必须重启 Broker 进程才能令它们生效。而主题级别参数的设置则有所不同&#xff0c;K…

初学java之12 泛型编程的个人理解总结

首先,强调一个观点: 对于我这样的初学者,一定要站在虚拟机和编译器的角度来分析java 语言的种种特性&#xff0c;泛型也不例外。&#xff08;我认为这个一条正确的学习经验&#xff09; 写这篇文章起源于最近在学java&#xff0c;有一天在路上和一个同事在讨论什么是java泛型的…