本文主要介绍Java爬虫工具Jsoup的相关信息,供大家参考。
Java 爬虫工具Jsoup详解
Jsoup是一个Java HTML解析器,可以直接解析一个URL地址和HTML文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来读取和操作数据。
jsoup 的主要功能如下:
1.解析HTML从URL、文件或字符串;
2.使用DOM或CSS选择器查找和获取数据;
3.可操作的HTML元素、属性和文本;
Jsoup是基于MIT协议发布的,可以安全地用于商业项目。
Jsoup可以从字符串、URL地址和本地文件中加载HTML文档,并生成文档对象实例。
简单来说,Jsoup是一个强大的html解析器,它首先获取html页面代码,然后解析这些页面,通过Jsoup携带的各种选择器从这个页面中获取我们需要的重要数据,满足我们绝大多数的需求。但也只是相对而言,这里的页面是一个死的静态页面。如果您想获得动态生成的页面数据,那么您必须使用其他java爬虫技术。我会不定期更新这些技术,一起探讨。下面详细说说如何使用Jsoup。
一、如何取页面
Jsoup提供了parse(),一种用于解析html页面的方法。通过解析它,我们可以得到整个页面的dom对象,通过这个对象,我们可以得到你需要的页面的所有参数。获取页面的方法有很多。以下是几个例子:
Jsoup携带的connect()方法
string html page=jsoup . connect(' https://www . Baidu . com ')。获取()。toString();
这个方法说必需的参数是一个字符串url链接,但是你应该注意添加这些链接的保护以避免问题。其实这个方法解决了我们很多问题。我们完全可以把Jsoup解析html提取到一个通用的工具类中,然后通过改变拼接的url参数得到很多我们想要的东西。比如JD.COM和淘宝的商品链接是固定的,可以通过改变其三方商品id获得详细的商品参数。
string URL=' https://item . JD . com/11476104681 . html ';
可以完全被替换为
string URL=' https://item . JD . com/' skuId '。html ';
通过改变他的三方产品ID,可以得到这个页面的一些基本数据,比如产品的图片和标题,价格也可以因为一些相关的处理而动态得到。这里就不解释了,以后再解释。
直接通过httpclient获取该页面的静态页面。
先贴一部分httpclient获取页面工具。
导入Java . io . io exception;
import Java . io . unsupportedencodingexception;
导入Java . util . ArrayList;
导入Java . util . list;
导入Java . util . map;
导入Java . util . set;
导入org . Apache . http . http entity;
导入org . Apache . http . httpresponse;
import org . Apache . http . name value pair;
导入org . Apache . http . parse exception;
import org . Apache . http . client . client protocol exception;
导入org . Apache . http . client . entity . urlencodedformentity;
导入org . Apache . http . client . methods . http get;
导入org . Apache . http . client . methods . http post;
导入org . Apache . http . client . methods . httpurirequest;
import org . Apache . http . impl . client . default http client;
import org . Apache . http . message . basic name value pair;
导入org . Apache . http . protocol . http;
导入org . Apache . http . util . entity utils;
/**
* HTTP请求工具类。
* @作者洛龙
* @自20150513
*
*/
公共类HttpClientUtils {
/**
* post模式请求。
* @param url请求地址。
* @param params请求参数
* @返回字符串
*/
公共静态字符串post(字符串url,映射字符串,字符串参数){
default http client http client=new default http client();
String body=null
HttpPost post=postForm(url,params);
body=invoke(httpclient,post);
http client . getconnectionmanager()。关机();
返回正文;
}
/**
*获取模式请求。
* @param url请求地址。
* @返回字符串
*/
公共静态字符串get(字符串url) {
id='s_tab '
b网页/b
a href='http://news.baidu.com/ns?cl=2amprn=20安培;' tn=newsamp' word=' rel='外部无跟随' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab':'news'})'新闻/a
a href='http://tieba.baidu.com/f?kw=ampfr=wwwt ' rel='外部无跟随' wd field=' kw ' onmousedown=' return c({ ' FM ':' tab ',' tab':'tieba'})'贴吧/a
a href='http://zhidao.baidu.com/q?CT=17安培;pn=安培;tn=ikaslistamprn=10安培;' word=ampfr=wwwt ' rel='外部无跟随' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab':'zhidao'})'知道/a
音乐。百度一下。com/search?fr=psampie=utf-8 amp;key=' rel='外部无跟随' wd field=' key ' onmousedown=' return c({ ' FM ':' tab ',' tab':'music'})'音乐/a
一个href=' http://图像。百度一下。com/search/index?TN=baiduimageampps=1 ampct=201326592 ampl=-1 amp;' cl=2 ampnc=1 ampie=utf-8 amp;'word=' rel=' external no follow ' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab':'pic'})'图片/a
a href='http://v.baidu.com/v?ct=301989888amprn=20安培;pn=安培;db=安培;s=25安培;ie=utf-8 amp;'' word=' rel=' external no follow ' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab':'video'})'视频/a
a href='http://map.baidu.com/m?' word=ampfr=PS 01000 ' rel='外部无跟随' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab':'map'})'地图/a
闻库。百度一下。com/search?word=amplm=0ampod=安培;ie=utf-8 ' rel='外部无跟随' wd field=' word ' onmousedown=' return c({ ' FM ':' tab ',' tab ':'闻库' })'文库/a
a href='//www。百度一下。' com/more/' rel=' external no follow ' onmousedown=' return c({ ' FM ':' tab ',' tab':'more'})'更多raquo/a
/div
div class='qrcodeCon '
div id='qrcode '
div class='二维码-商品二维码-商品-1 '
div class='qrcode-img'/div
div class='二维码-文本'
平装书手机百度/b/p
/div
/div
/div
/div
div id='ftCon '
div class='ftCon-Wrapper '
div id='ftConw '
p id=' LH ' a id=' setf ' href='//www。百度一下。com/cache/set help/help。html ' rel=' external no follow ' onmousedown=' return ns _ c({ ' FM ':' behs ',' tab':'favorites ',' pos':0})' target='_blank '把百度设为主页/aa onmousedown=' return ns _ c({ ' FM ':' behs ',' tab ':' TJ _ about ' })' href=' http://home。百度一下。com ' rel='外部无跟随'关于百度/aa onmousedown=' return ns _ c({ ' FM ':' behs ',' tab ':' TJ _ about _ en ' })' href=' http://IR。百度一下。com ' rel=' external no follow '关于nbsp。nbsp Baidu/aa onmousedown=' return ns _ c({ ' FM ':' behs ',' tab ':' TJ _ tui guang ' })' href=' http://e . Baidu。com/?refer=888' rel='外部“不跟随”百度推广/a/p
p id=' CP ' copy 2017 nbspbaidunbspa href=' http://www。百度一下。' com/duty/' rel=' external no follow ' onmousedown=' return ns _ c({ ' FM ':' behs ',' tab':'tj_duty'})'使用百度前必读/anbsp;a href=' http://简一。百度一下。' com/' rel=' external no follow ' class=' CP-feedback ' onmousedown=' return ns _ c({ ' FM ':' behs ',' tab':'tj_homefb'})'意见反馈/anbsp;京电感耦合等离子体(电感耦合等离子体)证030173号nbspi class=' c-icon-ICR logo '/in bsp .a id=' jgwab ' target=' _ blank ' href=' http://www。北安。gov . cn/portal/registerSystemInfo?recordcode=11000002000001' rel='外部“不跟随”京公网安备11000002000001号/anbsp;i class='c-icon-jgwablogo'/i/p
/div
/div
/div
div id='wrapper_wrapper '
/div
/div
id='c-tips-container'/div
在贴上Jsoup自身携带的常用的几个获取数字正射影像图对象具体元素的方法:
方法描述
getElementsByClass()通过班级属性来定位元素,获取的是所有带这个班级属性的集合
getElementsByTag();通过标签名字来定位元素,获取的是所有带有这个标签名字的元素结合
getElementById();通过标签的身份证明来定位元素,这个是精准定位,因为页面的身份证明基本不会重复
getElementsByAttributeValue();通过属性和属性名来定位元素,获取的也是一个满足条件的集合;
getElementsByAttributeValueMatching()通过正则匹配属性
比如说我现在要获取百度首页这个标题,那么我们得先确定这玩意在哪,通过查看我们发现它是id="u "的差异标签的一个子元素,那么不管那么多我们先通过这个身份取到这个对象然后在获取这个标题,下面是具体操作
//获取页面对象
字符串起始页=' https://www。百度一下。com’;
document=jsoup。连接(起始页).用户代理(' Mozilla/5.0(Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/52。0 .2743 .116 Safari/537.36’).get();
//定位元素父级
元素父元素=文档。getelementbyid(' u ');
//定位具体元素
元素标题元素=父元素。getelementsbytag(' a ').get(0);
//获取所需数据
字符串标题=标题元素。text();
System.out.println(标题);
又或者我需要获取页面《手机百度》 这个数据:
字符串起始页=' https://www。百度一下。com’;
document=jsoup。连接(起始页).用户代理(' Mozilla/5.0(Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/52。0 .2743 .116 Safari/537.36’).get();
元素byid=文档。getelementbyid('二维码');
string text=element byid。getall元素().获取(0)。getAllElements().得到(1).getElementsByTag('b ').text();
系统。出去。println(文本);
这就是一个很简单的爬虫编写工具,j组功能很强大,对直接爬取没有动态加载的静态资源页面再适合不过。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。