个人建设任务网站,镇江网站推广排名,南和邢台网站制作,建设局属于什么行业文章目录 介绍jsoup使用1.解析url#xff0c;获取前端代码2.解决京东安全界面跳转3.获取每一组的数据4.获取商品数据的具体信息4.最终代码 介绍
网络爬虫#xff0c;就是在浏览器上#xff0c;代替人类爬取数据#xff0c;Java网络爬虫就是通过Java编写爬虫代码#xff0… 文章目录 介绍jsoup使用1.解析url获取前端代码2.解决京东安全界面跳转3.获取每一组的数据4.获取商品数据的具体信息4.最终代码 介绍
网络爬虫就是在浏览器上代替人类爬取数据Java网络爬虫就是通过Java编写爬虫代码代替人类从网络上爬取信息数据。程序员通过设定既定的规则让程序代替我们从网络上获取海量我们需要的数据比如图片企业信息等。爬虫的关键是对于网页信息的解析。 什么是jsoup jsoup是一个用于处理现实世界HTML的Java库。它提供了一个非常方便的API用于获取URL以及提取和操作数据使用最好的HTML5 DOM方法和CSS选择器 jsoup使用
连接url爬取网页代码html代码解析网页代码获取需要部分的数据
我们以解析京东网页红框数据为例 1.解析url获取前端代码
package com.xhf;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import java.io.IOException;
import java.net.URL;public class JsoupTest {static String url https://search.jd.com/Search?keyword%E9%A4%90%E5%B7%BE%E7%BA%B8;public static void main(String[] args) throws IOException {// 解析网页, document就代表网页界面Document document Jsoup.parse(new URL(url), 5000);// 打印获取前端代码System.out.println(document);}
}2.解决京东安全界面跳转
直接通过url访问经常遇到弹出京东安全的界面
!doctype html
html langen
head
meta charsetutf-8
meta http-equivX-UA-Compatible contentIEedge
meta nameviewport contentwidthdevice-width,initial-scale1.0,user-scalableno,maximum-scale1.0,viewport-fitcover
title京东安全/title
link hrefhttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/css/app.6f723501.css relpreload asstyle
link hrefhttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/app.js relpreload asscript
link hrefhttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/chunk-vendors.js relpreload asscript
link hrefhttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/css/app.6f723501.css relstylesheet
/head
body !-- 不要删除这个div, class请勿修改--
div classipaas-floor-app/div
script typetext/javascript srchttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/chunk-vendors.js/script
script typetext/javascript srchttps://cfe.m.jd.com/privatedomain/risk_handler/03101900/js/app.js/script
/body
/html这算是对于爬取数据的一种反制措施。直接通过url请求服务器会认为客户端没有登录因此会跳出京东安全的登陆界面让他们登录。以前可以通过添加header解决现在得添加cookie了。获取cookie的方式如下 空白处右击鼠标选择检查右边栏中选择网络。如果没有点击加号更多工具选择网络找到Search大头的请求如果没有刷新重发请求选中请求查看标头选择cookies找到以thor为key的cookie
以下就是修正后的代码
package com.xhf;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;public class JsoupTest {static String url https://search.jd.com/Search?keyword%E9%A4%90%E5%B7%BE%E7%BA%B8;public static void main(String[] args) throws IOException {// 设置cookieMapString, String cookies new HashMapString, String();cookies.put(thor, 03F9B0325C5DCD2FCCDB435C227FD474D0B53C9143EB5DDA60599BDB9AE7A415B7CFEB4418F01DDEB8B8B9DD502D366A4E0BA2D84A0FE6CB6658061484CA95D230C7B76A36E31F4B329D2EFAC7DCD1E526F3C416CC50617276FED57FAF618892895784CB6446F6B8468A807290C12C3BA1C99DD0C0939C48C4E69681CA900EA9);// 解析网页, document就代表网页界面Document document Jsoup.connect(url).cookies(cookies).get();System.out.println(document);}
} !doctype html
html
head
meta http-equivContent-Type contenttext/html; charsetutf-8
meta http-equivX-UA-Compatible contentIEedge
meta namerenderer contentwebkit
meta http-equivCache-Control contentmax-age300
link reldns-prefetch href//search.jd.com
link reldns-prefetch href//item.jd.com
link reldns-prefetch href//list.jd.com
link reldns-prefetch href//p.3.cn
link reldns-prefetch href//misc.360buyimg.com
link reldns-prefetch href//nfa.jd.com
link reldns-prefetch href//d.jd.com
link reldns-prefetch href//img12.360buyimg.com
link reldns-prefetch href//img13.360buyimg.com
link reldns-prefetch href//static.360buyimg.com
link reldns-prefetch href//csc.jd.com
link reldns-prefetch href//mercury.jd.com
link reldns-prefetch href//x.jd.com
link reldns-prefetch href//wl.jd.com
title餐巾纸 - 商品搜索 - 京东/title
meta nameKeywords content餐巾纸京东餐巾纸
meta namedescription content在京东找到了餐巾纸305051件餐巾纸的类似商品其中包含了餐巾纸价格、餐巾纸评论、餐巾纸导购、餐巾纸图片等相关信息
stylejsoup中的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();}------------------
li data-sku1297484 data-spu1297484 ware-type10 bybt0 classgl-item
div classgl-i-wrap
div classp-img a target_blank title【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用
【神券疯狂领】满199减40神券
【会员福利送】下单满1元赢手机好礼,直达开抢 href//item.jd.com/1297484.html onclicksearchlog(1, 1297484,28,2,,flagsClk2097575); img width220 height220 data-img1 data-lazy-img//img14.360buyimg.com/n7/jfs/t1/96373/19/43919/202641/64eb0ad6F1109a3ef/6d8d78fabae02163.jpg /a
div data-lease data-catid15908 data-venid1000001683 data-presale0/div
/div
div classp-price strong classJ_1297484 data-presale0 data-done1 em/emi data-price129748478.90/i /strong
/div
div classp-name p-name-type-2 a target_blank title【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用
【神券疯狂领】满199减40神券
【会员福利送】下单满1元赢手机好礼,直达开抢 href//item.jd.com/1297484.html onclicksearchlog(1, 1297484,28,1,,flagsClk2097575); emimg classp-tag3 src//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png 维达Vinda抽纸 超韧150抽*24包S码 湿水不易破 卫生纸 纸巾 font classskcolor_ljg餐巾纸/font 整箱/em i classpromo-words idJ_AD_1297484【纸选维达,实力出发】爆品低至6.6折,抢新品低价试用 【神券疯狂领】满199减40神券 【会员福利送】下单满1元赢手机好礼,直达开抢/i /a
/div
div classp-commit stronga idJ_comment_1297484 target_blank href//item.jd.com/1297484.html#comment onclicksearchlog(1, 1297484,28,3,,flagsClk2097575);/a/strong
/div
div classp-shop data-dongdong data-selfware1 data-score5 data-reputation99 span classJ_im_icona target_blank classcurr-shop hd-shopname onclicksearchlog(1,1000001683,0,58) href//mall.jd.com/index-1000001683.html?frompc title维达京东自营官方旗舰店维达京东自营官方旗舰店/a/span
/div
div classp-icons idJ_pro_1297484 data-done1 i classgoods-icons J-picon-tips J-picon-fix data-idx1 data-tips京东自营品质保障自营/i i classgoods-icons4 J-picon-tips data-tips本商品参与满件促销2件9折/i
/div
div classp-operate a classp-o-btn contrast J_contrast contrast data-sku1297484 hrefjavascript:; onclicksearchlog(1, 1297484,28,6,,flagsClk2097575)i/i对比/a a classp-o-btn focus J_focus data-sku1297484 hrefjavascript:; onclicksearchlog(1, 1297484,28,5,,flagsClk2097575)i/i关注/a a classp-o-btn addcart data-stocknew1297484 href//cart.jd.com/gate.action?pid1297484amp;pcount1amp;ptype1 target_blank onclicksearchlog(1, 1297484,28,4,,flagsClk2097575) data-limit0i/i加入购物车/a
/div
div classp-stock hide data-stocknew1297484 data-province山西/div
/div /li------------------
li data-sku3092062 data-spu3092062 ware-type10 bybt0 classgl-item
div classgl-i-wrap
div classp-img a target_blank title【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线爆款好物空前钜惠爆品低至6.6折【洁柔大会员】抢神券,会员臻享八大特权go href//item.jd.com/3092062.html onclicksearchlog(1, 3092062,29,2,,flagsClk2097574); img width220 height220 data-img1 data-lazy-img//img12.360buyimg.com/n7/jfs/t1/97596/10/33191/189837/64ecc704F8cbfe25a/9015a6baf21bd1b9.jpg /a
div data-lease data-catid15908 data-venid1000001901 data-presale0/div
/div
div classp-price strong classJ_3092062 data-presale0 data-done1 em/emi data-price309206254.90/i /strong
/div
div classp-name p-name-type-2 a target_blank title【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线爆款好物空前钜惠爆品低至6.6折【洁柔大会员】抢神券,会员臻享八大特权go href//item.jd.com/3092062.html onclicksearchlog(1, 3092062,29,1,,flagsClk2097574); emimg classp-tag3 src//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png 洁柔抽纸 活力阳光橙3层120抽面巾纸*24包 母婴可用 全家适用/em i classpromo-words idJ_AD_3092062【洁柔新品来袭】洁柔爱马仕设计师联名款重磅上线爆款好物空前钜惠爆品低至6.6折【洁柔大会员】抢神券,会员臻享八大特权go/i /a
/div
div classp-commit stronga idJ_comment_3092062 target_blank href//item.jd.com/3092062.html#comment onclicksearchlog(1, 3092062,29,3,,flagsClk2097574);/a/strong
/div
div classp-shop data-dongdong data-selfware1 data-score5 data-reputation99 span classJ_im_icona target_blank classcurr-shop hd-shopname onclicksearchlog(1,1000001901,0,58) href//mall.jd.com/index-1000001901.html?frompc title洁柔京东自营官方旗舰店洁柔京东自营官方旗舰店/a/span
/div
div classp-icons idJ_pro_3092062 data-done1 i classgoods-icons J-picon-tips J-picon-fix data-idx1 data-tips京东自营品质保障自营/i
/div
div classp-operate a classp-o-btn contrast J_contrast contrast data-sku3092062 hrefjavascript:; onclicksearchlog(1, 3092062,29,6,,flagsClk2097574)i/i对比/a a classp-o-btn focus J_focus data-sku3092062 hrefjavascript:; onclicksearchlog(1, 3092062,29,5,,flagsClk2097574)i/i关注/a a classp-o-btn addcart data-stocknew3092062 href//cart.jd.com/gate.action?pid3092062amp;pcount1amp;ptype1 target_blank onclicksearchlog(1, 3092062,29,4,,flagsClk2097574) data-limit0i/i加入购物车/a
/div
div classp-stock hide data-stocknew3092062 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.最终代码
package com.xhf;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;/*** 解析京东界面, 爬取商品数据*/
public class JsoupTest {static String url https://search.jd.com/Search?keyword%E9%A4%90%E5%B7%BE%E7%BA%B8;public static void main(String[] args) throws IOException {// 设置cookieMapString, String cookies new HashMapString, 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);}}
}