一、目的:

1.任务

使用 Jsoup抓取京东图书分类页面的图书信息。
抓取目标分类网址例如:https://list.jd.com/list.html?cat=1713,3259,3330
给与的某个图书页面,抓取每一页面的图书信息,此分类页多页抓取直至结束。

下面图片即为给定目标抓取页面地址
https://list.jd.com/list.html?cat=1713,3259,3330

我们获取到的应该是每一本图书里边的图书信息,类似模拟打开了网页查阅了图书信息内容。
所以我们随便打开一个item(红框圈了,暂且把分类页面的一本图书视为一个item吧),查看内容。
抓取内容是红框里这一部分:

2.工具和语言

语言:java
工具:jsoup-1.7.2.jar

二、思路

我们采取这样的思路,
1.将分类网站源码保存到本地
2.解析出分类页面所有的图书(item)拿到一个类似的item的List集合
3.根据拿到的List集合,遍历循环去解析每个页面中的图书信息,匹配到图书信息控制台打印即可。

我们把抓取京东图书抽象成一个类,这个类有保存下载源码的方法,有解析分类页面拿到List集合的方法,有解析图书页面信息的方法等。

三、解析

1.将分类网站源码保存到本地

将网站的源码下载到本地的方法,这样在本地就可以看到一个text文件, 专门存放当前网站源码的txt文件。用来解析使用的

/*** 将目标html保存到本地中进行解析获得 doc文本对象* @param htmlUrl 需要下载到本地的网址* @param toSavePath 需要保存到本地的电脑路径 例如E:\\jd.txt* @param type 编码方式 UTF-8 或者 GBK 等* @return* @throws IOException*/public Document getDocFromUrl(String htmlUrl,String toSavePath,String type) throws IOException{URL url = new URL(htmlUrl) ;File file  = new File(toSavePath) ;if(file.exists())file.delete() ;file.createNewFile() ; FileOutputStream fos = new FileOutputStream(file) ;BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),type)) ;byte [] b = new byte[1024] ;String c ; while(((c = br.readLine())!=null)){fos.write(c.getBytes());}System.out.println("保存分类html完毕");Document doc = Jsoup.parse(file,"UTF-8") ;return doc ;}

2.解析出分类页面所有的图书

这里就是解析出分类页面中的所有如图所示的item 的每个地址,将他们的地址变成一个List集合即可。这样就获得了当前某一页的所有的图书地址。为解析每个图书信息做一个铺垫。

打开浏览器的开发者模式(F12)看一下如何解析:
我们在图书信息列表中不难发现这些每一本图书都是由Li标签包裹,这些图书li标签都被使用一个class=“gl-warp”的ul的包裹着,分析到这你应该就有思路了。
这种情况我们先使用jsoup拿到ul标签的内容,再对ul标签里的li标签进行getElementsByTag(“li”); 方法,这样拿到的是每一个li标签的内容,也就是每个图书的内容。 以下两行代码获取到li的集合

    Element contentEl = doc.select("ul.gl-warp").first() ;Elements lis = contentEl.getElementsByTag("li");

拿到图书们的Elements元素还没完因为我们要的是这些图书的地址,换句话说要的是图书List< String > 但是如何解析出每个图书的地址呢 我们需要随便打开某个li标签进行查看。

也许你一眼就看到了一个地址,没错,就是这个标签。我们再拿到它的href属性值就行了,任性
如何做 :
Element titleEl = li.select(“div.p-name”).first() ;
Element a = titleEl.select(“a”).first() ;
String href = a.attr(“href”) ;

啰嗦了这么多上代码 看一眼:


/*** 解析每一个图书的页面地址* @param doc* @return*/public List<String> parseItemUrl(Document doc){//获取页面Element contentEl = doc.select("ul.gl-warp").first() ;Elements lis = contentEl.getElementsByTag("li");for (Element li : lis) {//for循环的就是每一本书拿到详情地址Element titleEl = li.select("div.p-name").first() ;Element a = titleEl.select("a").first() ;String  href = a.attr("href") ;href = "http:"+href ; hrefList.add(href) ;}return hrefList  ;}

3.解析一本图书

解析每一本图书,根据该图书详情页的地址,下载此详情页源码,去使用jsoup匹配。可以看到图片中高亮的部分就是我们要解析的内容。同样很清晰,我们只需要解析到 一个叫class = ”parameter2 ”ul标签, 然后再对里边每个li进行解析就ok了 ,思路完全可以按照上一个解析过程来。 这里我是直接当成一个text文本全部输出出来了,没有循环遍历具体到每一个li标签, 大家可以完全按照上一个来做。

    /*** 解析书本的信息* @param doc*/public void parseContent(Document doc){Element contentEl = doc.getElementById("parameter2") ;if(contentEl==null)return ; Elements lis = contentEl.getElementsByTag("li");if(lis==null)return ; for (Element li : lis) {String text = li.text() ;System.out.println("--"+text);}}

解析当前分类页的下一页的内容

我们需要的就是匹配到当前页面的下一页的按钮的规则,获取下一页的url即可。

解析下一页的按钮也不难发现 我们要找到 p-num 的span标签, 然后在此标签内找到pn-next的 a标签。 该a标签的href属性值就是我们要找到的地址。
这里我们就直接通过代码来拿到他。

    /*** 解析下一页* @param doc* @return*/public String parseNext(Document doc){   String nextPageHref="";Element el = doc.select("span.p-num").first() ;Elements as = el.getElementsByTag("a") ;for(Element a :as){if(a.attr("class").endsWith("pn-next")){String  pageHref = a.attr("href") ;nextPageHref = htmlUrl.substring(0,htmlUrl.lastIndexOf("/"))+pageHref;System.out.println("下一页地址:"+nextPageHref);}}return nextPageHref;}

四、代码:

封装的解析类HtmlParser .java:

package com.jd.test;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/*** html网址解析器* @author shaoduo**/
public class HtmlParser {String htmlUrl = "" ; String nextPageUrl = "" ; String charSet = "" ; List<String> hrefList = new ArrayList<String>() ;public HtmlParser(String htmlUrl){this.htmlUrl  = htmlUrl ; }/*  public List<String> getHrefList (){try {parser() ;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return hrefList ; }*/public String getNextPageHrefList(){return this.nextPageUrl ;}/*** 解析过程* @param htmlUrl* @throws IOException*/public  void parser(String htmlUrl) throws IOException {Document doc = getDocFromUrl(htmlUrl, "D:\\cat.txt","utf-8") ;hrefList = parseItemUrl(doc) ;for (String string : hrefList) {Document conDoc = getDocFromUrl(string, "D:\\content.txt","gbk") ;parseContent(conDoc);}nextPageUrl =  parseNext(doc) ;if(nextPageUrl!=""){System.out.println("解析下一页------------");parser(nextPageUrl) ;}}/*** 将目标html保存到本地中进行解析获得 doc文本对象* @param htmlUrl* @param toSavePath* @param type* @return* @throws IOException*/public Document getDocFromUrl(String htmlUrl,String toSavePath,String type) throws IOException{URL url = new URL(htmlUrl) ;File file  = new File(toSavePath) ;if(file.exists())file.delete() ;file.createNewFile() ; FileOutputStream fos = new FileOutputStream(file) ;BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),type)) ;byte [] b = new byte[1024] ;String c ; while(((c = br.readLine())!=null)){fos.write(c.getBytes());}System.out.println("保存分类html完毕");Document doc = Jsoup.parse(file,"UTF-8") ;return doc ;}/*** 解析每一个图书的页面地址* @param doc* @return*/public List<String> parseItemUrl(Document doc){//获取页面Element contentEl = doc.select("ul.gl-warp").first() ;Elements lis = contentEl.getElementsByTag("li");for (Element li : lis) {Element titleEl = li.select("div.p-name").first() ;Element a = titleEl.select("a").first() ;String  href = a.attr("href") ;href = "http:"+href ; hrefList.add(href) ;}return hrefList  ;}/*** 解析书本的信息* @param doc*/public void parseContent(Document doc){Element contentEl = doc.getElementById("parameter2") ;if(contentEl==null)return ; Elements lis = contentEl.getElementsByTag("li");if(lis==null)return ; for (Element li : lis) {String text = li.text() ;System.out.println("--"+text);}}   /*** 解析下一页* @param doc* @return*/public String parseNext(Document doc){   String nextPageHref="";Element el = doc.select("span.p-num").first() ;Elements as = el.getElementsByTag("a") ;for(Element a :as){if(a.attr("class").endsWith("pn-next")){String  pageHref = a.attr("href") ;nextPageHref = htmlUrl.substring(0,htmlUrl.lastIndexOf("/"))+pageHref;System.out.println("下一页地址:"+nextPageHref);}}return nextPageHref;}}

测试类程序主入口:

package com.jd.test;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;/*** 京东图书分类html网址解析主入口* @author shaoduo**/
public class JD {static List<String> hrefList = new ArrayList<String>() ;static String nextPageUrl = "" ;public static void main(String arg[]){String startCatUrl  = "https://list.jd.com/list.html?cat=1713,3279,3646";HtmlParser hp = new HtmlParser(startCatUrl) ;try {hp.parser(startCatUrl);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

五、源代码下载

https://github.com/shaoduo123/JD_CAT_JOUP_DEMO


版权声明
author :shaoduo
原文来自:http://blog.csdn.net/shaoduo/article/details/78247664
其他出处均为转载,原创作品,欢迎读者批评指正。

使用Jsoup抓取京东图书分类页面图书信息相关推荐

  1. python爬取京东手机参数_python抓取京东小米8手机配置信息

    本文代码是使用python抓取京东小米8手机的配置信息 首先找到小米8商品的链接:https://item.jd.com/7437788.html 然后找到其配置信息的标签,我们找到其配置信息的标签为 ...

  2. 初识html5-当当网图书分类页面,图书添加页面 图书分类加载不出来

    html> 图书添加 图书添加 /AddBookServlet" method="post"> 图书ID 图书名 图书分类 ${c.catgoryName.c ...

  3. [Python] python + selenium 抓取 京东商品数据(商品名称,售价,店铺,分类,订单信息,好评率,评论等)

    目录 一.环境 二.简介 三.京东网页分析 1.获取商品信息入口--商品列表链接获取 2.获取商品信息入口--商品详情链接获取 3.商品详情获取 4.商品评论获取 四.代码实现 五.运行结果 六.结语 ...

  4. python爬取京东图书_Python抓取京东图书评论数据

    Python抓取京东图书评论数据 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python抓取京东图书评论数据.txt ] (友情提示:右键点上行txt文档名- ...

  5. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...

    网上抓取京东数据的文章,现在要么无法抓取数据,要么只能抓取部分数据,本文将介绍如何抓取京东全站数据,包括商品信息.店铺信息,评论信息,分类信息等. -------------------------- ...

  6. XZ_Python之使用关键词抓取京东搜索页面数据

    爬虫的基本步骤:访问网络.访问特定的网站.抓取所需要的页面或者json文件,抓取到本地,按照需求进行格式化,然后写入数据库,以备以后分析. 爬虫的第一步是分析 首先在京东的页面,搜索任意想买的东西,我 ...

  7. 爬虫基础篇之Scrapy抓取京东

    虚拟环境 同一台服务器上不同的项目可能依赖的包不同版本,新版本默认覆盖旧版本,可能导致其他项目无法运行,通过虚拟环境,完全隔离各个项目各个版本的依赖包,实现运行环境互不影响. virtualenv p ...

  8. 【京东】抓取京东详情、评论_8.17

    一.确定需求 抓取京东详情页上的图书(打开搜索页面,输入出版社,点击按销量排.只看有货) 确定抓取元素:(共12个) ID / 书名 / 价格 / 作者 / 出版日期 / 出版社 / 总评论数 / 书 ...

  9. java爬虫案例——SpringBoot使用HttpClient、Jsoup爬取京东手机数据

    文章目录 前言 一.准备工作 二.项目文件 1.项目依赖 2.项目配置文件 3.pojo 4.dao接口 5.service接口及其实现类 6.HttpClient封装工具类 7.爬取任务实现 8.启 ...

最新文章

  1. unity 实现手机振动_Unity 手机震动插件Vibration
  2. .py与.pyc文件区别
  3. 印度市场,圆不了二线国产手机的美梦
  4. python3:面向对象(多态和继承、方法重载及模块)
  5. 【2016年第1期】专题导读:农业大数据
  6. 云存储服务器销售,云存储服务器销售
  7. Element ui tree树形控件获取当前节点id和父节点id
  8. 三句话捋清楚java垃圾收集器
  9. Qt实现界面滑动切换效果
  10. 【贝尔链创始人Vincent: 区块链不仅是技术革命 更是认知革命】
  11. 线性表的定义和基本操作
  12. 软件需求分析复习要点
  13. 59 Three.js 渲染两个场景和使用不同的相机,渲染在一个场景里面
  14. Java电商平台之订单功能和支付功能实现
  15. opencv图片旋转90°/-90°/180°
  16. GitLab删除项目操作(亲测)
  17. wireshark抓包分析ping数据包
  18. 喵喵咪鼠标自动点击器使用说明
  19. 嘉年华回顾丨王涛带你探秘新一代分布式数据库
  20. centos7安装字体

热门文章

  1. Windows7下SVN下载安装
  2. Mac卡顿 CPU占100%的原因分析及解决办法
  3. python自动化办公源码_python自动化办公:文件篇(自动整理文件,一键完成)
  4. 2021高考温州高中成绩查询,浙江温州最好的3所高中(附2019年高考成绩)
  5. 小区业主入户安检小程序开发
  6. MySQL删除用户报错:ERROR 1396 (HY000): Operation DROP USER failed for ‘tsjt‘@‘127.0.0.1‘
  7. 警察局里的专业人像摄影
  8. 将DataTable中的数据保存到Excel
  9. C语言 一维数组求和
  10. “过气”珀莱雅,凭何成为双十一“顶流”之一?