使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品

文章目录

  • 前言
  • 最终效果
    • 效果演示
      • 爬取所有记录
      • 根据条件爬取
    • 项目仓库
  • 项目前准备
    • 技术选型
    • 开发工具
    • 用到的jar包
  • 爬取所有数据
    • 页面分析
      • 第一步:获取所有省份列表
    • 代码实现
      • 进入主页
      • 解析页面
        • 获得所有省的文档模型
        • 循环,获取各省的信息
        • 获得市列表
        • 获得总页数和翻页时的路径规则
        • 进入拍卖品列表页并取出值
        • 解析`json`数据获得详情路径,并提取数据
      • 持久化数据库
        • 定义POJO
        • 构造数据库操作工厂类
        • 执行插入
  • 根据搜索条件爬取数据
    • 分析
      • 从EXCEL中获得查询关键字
  • 总结

前言

最近在学习过程中接到一个任务,要求爬取阿里拍卖中法院拍卖的所有拍卖品。用了点时间完成了任务,并分享出来作为经验供学习、交流。若文中有任何不妥之处请提出。

最终效果

效果演示

爬取所有记录

  • 控制台打印记录
  • 数据库记录
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第1张图片

根据条件爬取

  • 控制台打印记录
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第2张图片
  • 数据库记录
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第3张图片

项目仓库

  • github地址:https://github.com/virtuex/all-spilder
  • git仓库:https://github.com/virtuex/all-spilder.git

项目前准备

技术选型

  • HTML解析技术:Jsoup
    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

想了解Jsoup相关内容,请移步:https://jsoup.org/

开发工具

  • IDEA 2018.2
  • MYSQL 5.7
  • Chrome

用到的jar包

  • easy-poi:3.0.3
  • mysql-connector-java:5.1.40
  • jsoup:1.8.3
  • fastjson:1.2.47

爬取所有数据

页面分析

  • 首先我们通过http://sf.taobao.com/court_list.htm?spm=a213w.3065169.sfhead2014.3.3e1f1a333zcUBm,进入要爬取的入口页,入口页的结构如下图所示:
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第4张图片
    页面的机构是以省份为区分,在省下包含市,市包含法院,而法院中的链接市我们要获取信息的下一个入口。为了实现目的,爬虫的处理逻辑如下:
1.进入入口页,获取所有省份的DOM
2.对第一个省份继续进行处理,获取市级列表
3.对第一个市进行处理,获取法院列表和链接地址
4.进入第一个法院,获得拍卖品列表
5.进入商品详情页获取需要的信息
6.重复5,知道所有拍卖品爬完
7.重复4-6,直至所有法院爬完
8.重复3-7,直至所有市爬完
9.重复2-8,直至所有省份爬完
10.结束

第一步:获取所有省份列表

  • 首先用Chrome浏览器检查爬虫入口页面元素,这样能够清晰直观看出页面的布局,如下图所示
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第5张图片
    图中,1是省份的div,包裹在一个class="provinces clearfix"div中,在1中还包含了2,3,4这些元素,这些都是我们接下来需要的内容。
    图中,2是省份的名称,包裹在一个class="province"div中,通过查看多个省份的内容可以发现,这个模型中只会有省份名称这个中文,所以取出这个信息时可以通过正则表达式对中文进行匹配,从而取出值。
    图中,3是省份下的市列表,包裹在一个class="province"div中。每个市在一个单独的class="city"div中。图中的4,市该市下的法院列表,法院列表中每个法院的链接才是我们需要的内容,通过访问链接才能进入该法院的拍卖品列表,每个法院的链接规则如下:
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第6张图片
    获取也很简答,只用获取a标签中的href属性即可,但访问时为了比较明显,要在前面加个http:
    点击链接,进入拍卖品列表,如下:
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第7张图片
    都这样的结构也很简单,第一想法时使用上述相同的方法直接一条一条爬取就行。但如果这样你会发现,并爬不到数据,后来才发现,所有的数据并不是在页面请求时就直接加载的,所有的数据会以json的格式放在一个script标签中,如下图所示:
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第8张图片
    这样就更简单了,直接通过Json解析,然后取出详情链接就可以了。但需要注意的是,数据只是这一页中的,事实上数据可能有很多页。所以这时的想法就是看下每页的请求路径有什么规律,通过对比就发现翻页时的路径类似于http://sf.taobao.com/court_item.htm?spm=a213w.7398554.pagination.1.5edd2fc2Vn735Z&user_id=2364124517&auction_start_seg=-1&page=2,而页码对应的就是page的值,所以我们只需要从页面上获取总计页数,通过循环就可以得到每页的数据。
    在这里插入图片描述
    方法很简单,只需要获取到class="page-total"的em标签的text内容即可
    接下来就是详情页,详情页我们只抓三个部分的内容
    使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品_第9张图片
    其中标题和变卖价的规则如下:
    在这里插入图片描述
    在这里插入图片描述
    这里根据之前的规则就可以取出值了。接下来通过代码来实现这一过程

代码实现

本文前面已经附带了github的地址,原项目使用gradle构建,需要的朋友可以参考。所以本部分以关键部分代码讲解为主。

进入主页

Document document = Jsoup.connect(ConValues.SF_URL_ENTRANCE).timeout(5000).get();

这一步比较简单,需要注意的是最好加上timeout()方法设置超时时间,不然可能会出现java.net.SocketTimeoutException:Read timed out异常。通过这一步就可以得到文档对象,来完成下列操作。

解析页面

获得所有省的文档模型

Elements select = document.select("div[class=provinces clearfix]");

循环,获取各省的信息

Elements elements = element.select("div[class=province"); Matcher valueByReg = DataUtil.getValueByReg(ConValues.ZHONG_WEN_REG, elements.toString());
if(valueByReg.find()){
    //省
   province = valueByReg.group(0);
 }

获得市列表

 Elements citys = var1.select("dl[class=city]");

获得总页数和翻页时的路径规则

 Elements var4 = var3.select("a");
 for(Element var5:var4){
        if(var5.hasAttr("rel")){
               basePageUrl = "http:"+var5.attr("href").trim();
               break;
        }
    }
 String pageText = var3.select("span[class=page-skip]").select("em[class=page-total]").text();
 if(pageText.length()>0){
         totalPage = Integer.parseInt(pageText);
 }

进入拍卖品列表页并取出值

//对每一页进行处理
String pageUrl = basePageUrl.substring(0,basePageUrl.length()-1)+i;
Document document2 = Jsoup.connect(pageUrl).timeout(5000).get();
 //获得该页所有商品信息,该页的所有商品信息是以json的格式存放在
                    
                    

你可能感兴趣的:(jsoup,爬虫,java,爬虫)