0


Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

文章目录

介绍

网络爬虫,就是在浏览器上,代替人类爬取数据,Java网络爬虫就是通过Java编写爬虫代码,代替人类从网络上爬取信息数据。程序员通过设定既定的规则,让程序代替我们从网络上获取海量我们需要的数据,比如图片,企业信息等。爬虫的关键是对于网页信息的解析。

什么是jsoup:

jsoup是一个用于处理现实世界HTML的Java库。它提供了一个非常方便的API,用于获取URL以及提取和操作数据,使用最好的HTML5 DOM方法和CSS选择器

jsoup使用

  • 连接url,爬取网页代码(html代码)
  • 解析网页代码,获取需要部分的数据

我们以解析京东网页,红框数据为例

在这里插入图片描述

1.解析url,获取前端代码

packagecom.xhf;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importjava.io.IOException;importjava.net.URL;publicclassJsoupTest{staticString url ="https://search.jd.com/Search?keyword=%E9%A4%90%E5%B7%BE%E7%BA%B8";publicstaticvoidmain(String[] args)throwsIOException{// 解析网页, document就代表网页界面Document document =Jsoup.parse(newURL(url),5000);// 打印获取前端代码System.out.println(document);}}

2.解决京东安全界面跳转

直接通过url访问,经常遇到弹出京东安全的界面

<!doctypehtml><htmllang="en"><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scale=1.0,user-scalable=no,maximum-scale=1.0,viewport-fit=cover"><title>京东安全</title><linkhref="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/css/app.6f723501.css"rel="preload"as="style"><linkhref="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/app.js"rel="preload"as="script"><linkhref="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/chunk-vendors.js"rel="preload"as="script"><linkhref="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/css/app.6f723501.css"rel="stylesheet"></head><body><!-- 不要删除这个div, class请勿修改--><divclass="ipaas-floor-app"></div><scripttype="text/javascript"src="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/chunk-vendors.js"></script><scripttype="text/javascript"src="https://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/app.js"></script></body></html>

这算是对于爬取数据的一种反制措施。直接通过url请求,服务器会认为客户端没有登录,因此会跳出京东安全的登陆界面,让他们登录。以前可以通过添加header解决,现在得添加cookie了。获取cookie的方式如下

在这里插入图片描述
在这里插入图片描述

  1. 空白处右击鼠标
  2. 选择检查
  3. 右边栏中选择网络。如果没有,点击加号(更多工具),选择网络
  4. 找到Search大头的请求,如果没有,刷新重发请求
  5. 选中请求,查看标头
  6. 选择cookies,找到以thor为key的cookie

以下,就是修正后的代码

packagecom.xhf;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importjava.io.IOException;importjava.net.URL;importjava.util.HashMap;importjava.util.Map;publicclassJsoupTest{staticString url ="https://search.jd.com/Search?keyword=%E9%A4%90%E5%B7%BE%E7%BA%B8";publicstaticvoidmain(String[] args)throwsIOException{// 设置cookieMap<String,String> cookies =newHashMap<String,String>();
        cookies.put("thor","03F9B0325C5DCD2FCCDB435C227FD474D0B53C9143EB5DDA60599BDB9AE7A415B7CFEB4418F01DDEB8B8B9DD502D366A4E0BA2D84A0FE6CB6658061484CA95D230C7B76A36E31F4B329D2EFAC7DCD1E526F3C416CC50617276FED57FAF618892895784CB6446F6B8468A807290C12C3BA1C99DD0C0939C48C4E69681CA900EA9");// 解析网页, document就代表网页界面Document document =Jsoup.connect(url).cookies(cookies).get();System.out.println(document);}}
<!doctypehtml><html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="renderer"content="webkit"><metahttp-equiv="Cache-Control"content="max-age=300"><linkrel="dns-prefetch"href="//search.jd.com"><linkrel="dns-prefetch"href="//item.jd.com"><linkrel="dns-prefetch"href="//list.jd.com"><linkrel="dns-prefetch"href="//p.3.cn"><linkrel="dns-prefetch"href="//misc.360buyimg.com"><linkrel="dns-prefetch"href="//nfa.jd.com"><linkrel="dns-prefetch"href="//d.jd.com"><linkrel="dns-prefetch"href="//img12.360buyimg.com"><linkrel="dns-prefetch"href="//img13.360buyimg.com"><linkrel="dns-prefetch"href="//static.360buyimg.com"><linkrel="dns-prefetch"href="//csc.jd.com"><linkrel="dns-prefetch"href="//mercury.jd.com"><linkrel="dns-prefetch"href="//x.jd.com"><linkrel="dns-prefetch"href="//wl.jd.com"><title>餐巾纸 - 商品搜索 - 京东</title><metaname="Keywords"content="餐巾纸,京东餐巾纸"><metaname="description"content="在京东找到了餐巾纸305051件餐巾纸的类似商品,其中包含了餐巾纸价格、餐巾纸评论、餐巾纸导购、餐巾纸图片等相关信息"><style>

jsoup中的document可以当作js中的document使用,解析网站内容就是在js中操作document,获取信息

3.获取每一组的数据

在这里插入图片描述

我们发现,所有的商品数据都是通过ul标签进行渲染

在这里插入图片描述

每单个数据,则是用li标签渲染

所以,如果我们要获取每个商品数据,我们可以先通过class,获取ul元素,然后选择出ul元素内包含的所有li元素

// 通过class获取ul标签Elements ul = document.getElementsByClass("gl-warp clearfix");// 获取ul标签下的所有li标签Elements liList = ul.select("li");for(Element element : liList){System.out.println("------------------");System.out.println(element);System.out.println();}
------------------
<lidata-sku="1297484"data-spu="1297484"ware-type="10"bybt="0"class="gl-item"><divclass="gl-i-wrap"><divclass="p-img"><atarget="_blank"title="【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用
【神券疯狂领】满199减40神券
【会员福利送】下单满1元赢手机好礼,直达开抢!"href="//item.jd.com/1297484.html"onclick="searchlog(1,'1297484','28','2','','flagsClk=2097575');"><imgwidth="220"height="220"data-img="1"data-lazy-img="//img14.360buyimg.com/n7/jfs/t1/96373/19/43919/202641/64eb0ad6F1109a3ef/6d8d78fabae02163.jpg"></a><divdata-lease=""data-catid="15908"data-venid="1000001683"data-presale="0"></div></div><divclass="p-price"><strongclass="J_1297484"data-presale="0"data-done="1"><em>¥</em><idata-price="1297484">78.90</i></strong></div><divclass="p-name p-name-type-2"><atarget="_blank"title="【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用
【神券疯狂领】满199减40神券
【会员福利送】下单满1元赢手机好礼,直达开抢!"href="//item.jd.com/1297484.html"onclick="searchlog(1,'1297484','28','1','','flagsClk=2097575');"><em><imgclass="p-tag3"src="//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"> 维达(Vinda)抽纸 超韧150抽*24包S码 湿水不易破 卫生纸 纸巾 <fontclass="skcolor_ljg">餐巾纸</font> 整箱</em><iclass="promo-words"id="J_AD_1297484">【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用 【神券疯狂领】满199减40神券 【会员福利送】下单满1元赢手机好礼,直达开抢!</i></a></div><divclass="p-commit"><strong><aid="J_comment_1297484"target="_blank"href="//item.jd.com/1297484.html#comment"onclick="searchlog(1,'1297484','28','3','','flagsClk=2097575');"></a></strong></div><divclass="p-shop"data-dongdong=""data-selfware="1"data-score="5"data-reputation="99"><spanclass="J_im_icon"><atarget="_blank"class="curr-shop hd-shopname"onclick="searchlog(1,'1000001683',0,58)"href="//mall.jd.com/index-1000001683.html?from=pc"title="维达京东自营官方旗舰店">维达京东自营官方旗舰店</a></span></div><divclass="p-icons"id="J_pro_1297484"data-done="1"><iclass="goods-icons J-picon-tips J-picon-fix"data-idx="1"data-tips="京东自营,品质保障">自营</i><iclass="goods-icons4 J-picon-tips"data-tips="本商品参与满件促销">2件9折</i></div><divclass="p-operate"><aclass="p-o-btn contrast J_contrast contrast"data-sku="1297484"href="javascript:;"onclick="searchlog(1,'1297484','28','6','','flagsClk=2097575')"><i></i>对比</a><aclass="p-o-btn focus  J_focus"data-sku="1297484"href="javascript:;"onclick="searchlog(1,'1297484','28','5','','flagsClk=2097575')"><i></i>关注</a><aclass="p-o-btn addcart"data-stocknew="1297484"href="//cart.jd.com/gate.action?pid=1297484&amp;pcount=1&amp;ptype=1"target="_blank"onclick="searchlog(1,'1297484','28','4','','flagsClk=2097575')"data-limit="0"><i></i>加入购物车</a></div><divclass="p-stock hide"data-stocknew="1297484"data-province="山西"></div></div></li>

------------------
<lidata-sku="3092062"data-spu="3092062"ware-type="10"bybt="0"class="gl-item"><divclass="gl-i-wrap"><divclass="p-img"><atarget="_blank"title="【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线!爆款好物空前钜惠,爆品低至6.6折!【洁柔大会员】抢神券,会员臻享八大特权go"href="//item.jd.com/3092062.html"onclick="searchlog(1,'3092062','29','2','','flagsClk=2097574');"><imgwidth="220"height="220"data-img="1"data-lazy-img="//img12.360buyimg.com/n7/jfs/t1/97596/10/33191/189837/64ecc704F8cbfe25a/9015a6baf21bd1b9.jpg"></a><divdata-lease=""data-catid="15908"data-venid="1000001901"data-presale="0"></div></div><divclass="p-price"><strongclass="J_3092062"data-presale="0"data-done="1"><em>¥</em><idata-price="3092062">54.90</i></strong></div><divclass="p-name p-name-type-2"><atarget="_blank"title="【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线!爆款好物空前钜惠,爆品低至6.6折!【洁柔大会员】抢神券,会员臻享八大特权go"href="//item.jd.com/3092062.html"onclick="searchlog(1,'3092062','29','1','','flagsClk=2097574');"><em><imgclass="p-tag3"src="//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"> 洁柔抽纸 活力阳光橙3层120抽面巾纸*24包 母婴可用 全家适用</em><iclass="promo-words"id="J_AD_3092062">【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线!爆款好物空前钜惠,爆品低至6.6折!【洁柔大会员】抢神券,会员臻享八大特权go</i></a></div><divclass="p-commit"><strong><aid="J_comment_3092062"target="_blank"href="//item.jd.com/3092062.html#comment"onclick="searchlog(1,'3092062','29','3','','flagsClk=2097574');"></a></strong></div><divclass="p-shop"data-dongdong=""data-selfware="1"data-score="5"data-reputation="99"><spanclass="J_im_icon"><atarget="_blank"class="curr-shop hd-shopname"onclick="searchlog(1,'1000001901',0,58)"href="//mall.jd.com/index-1000001901.html?from=pc"title="洁柔京东自营官方旗舰店">洁柔京东自营官方旗舰店</a></span></div><divclass="p-icons"id="J_pro_3092062"data-done="1"><iclass="goods-icons J-picon-tips J-picon-fix"data-idx="1"data-tips="京东自营,品质保障">自营</i></div><divclass="p-operate"><aclass="p-o-btn contrast J_contrast contrast"data-sku="3092062"href="javascript:;"onclick="searchlog(1,'3092062','29','6','','flagsClk=2097574')"><i></i>对比</a><aclass="p-o-btn focus  J_focus"data-sku="3092062"href="javascript:;"onclick="searchlog(1,'3092062','29','5','','flagsClk=2097574')"><i></i>关注</a><aclass="p-o-btn addcart"data-stocknew="3092062"href="//cart.jd.com/gate.action?pid=3092062&amp;pcount=1&amp;ptype=1"target="_blank"onclick="searchlog(1,'3092062','29','4','','flagsClk=2097574')"data-limit="0"><i></i>加入购物车</a></div><divclass="p-stock hide"data-stocknew="3092062"data-province="山西"></div></div></li>
...其余数据不做展示

4.获取商品数据的具体信息

通过遍历上述代码中出现的

liList

,可以获取到每一个

li

元素。每个元素都代表了商品的一组信息。具体如下所示。

在这里插入图片描述

如果我们要获取更为具体的信息,比如价格,图片,介绍等信息。我们就需要对li标签所封装的对象进行数据的截取。

在这里插入图片描述

我们可以用

getElementsByTag("img")

来获取带有img标签的对象,然后获取其

data-lazy-img

属性的数据

String pict = element.getElementsByTag("img").first().attr("data-lazy-img");
  • 价格在这里插入图片描述我们可以通过getElementsByClass("p-price")的方式获取对象,然后获取其中内容String price = element.getElementsByClass("p-price").first().text();
  • shop名称,类似价格获取方式

4.最终代码

packagecom.xhf;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importjava.io.IOException;importjava.net.URL;importjava.util.HashMap;importjava.util.Map;/**
 * 解析京东界面, 爬取商品数据
 */publicclassJsoupTest{staticString url ="https://search.jd.com/Search?keyword=%E9%A4%90%E5%B7%BE%E7%BA%B8";publicstaticvoidmain(String[] args)throwsIOException{// 设置cookieMap<String,String> cookies =newHashMap<String,String>();
        cookies.put("thor","03F9B0325C5DCD2FCCDB435C227FD474D0B53C9143EB5DDA60599BDB9AE7A415B7CFEB4418F01DDEB8B8B9DD502D366A4E0BA2D84A0FE6CB6658061484CA95D230C7B76A36E31F4B329D2EFAC7DCD1E526F3C416CC50617276FED57FAF618892895784CB6446F6B8468A807290C12C3BA1C99DD0C0939C48C4E69681CA900EA9");// 解析网页, document就代表网页界面Document document =Jsoup.connect(url).cookies(cookies).get();// 通过class获取ul标签Elements ul = document.getElementsByClass("gl-warp clearfix");// 获取ul标签下的所有li标签Elements liList = ul.select("li");for(Element element : liList){System.out.println("------------------");String pict = element.getElementsByTag("img").first().attr("data-lazy-img");String price = element.getElementsByClass("p-price").first().text();String shopName = element.getElementsByClass("p-shop").first().text();System.out.println(pict);System.out.println(price);System.out.println(shopName);}}}
标签: java 爬虫

本文转载自: https://blog.csdn.net/qq_62835094/article/details/132563662
版权归原作者 飞哥不鸽 所有, 如有侵权,请联系我们删除。

“Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题”的评论:

还没有评论