关于爬虫,之前一直用做第一个站的时候,记得那时候写的
爬虫
是爬
sina
的数据,用的就是
htmlparser
可能是由于好奇和满足我当时的需求,那开始就各种写啊,一个页面,把需要的内容处理下来,复杂的写完后不写注释自己都看不懂,一直我也知道
JSOUP
好,也感觉没空学习新的
爬虫
(完全是借口啊)
。最近我试了一下用
JSOUP
,尼玛,完全爱上了,完全秒杀
htmlparser
。
PS:用过都知道
JSOUP
是支持
css select
(CSS选择器),对于我这样的
jQuery
用的非常
6666
的人来说,哪就是一个字,爽死了。
Maven
依赖包:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version></dependency>
下面展示的代码是,实现了相同的一个业务,爬取了百度的一些内容。但是你可以看到,Htmlparser繁琐,JSOUP轻量级。不多说下面看代码。
Htmlparser Java代码:
String url = "http://www.baidu.com/s?wd=site:(www.zybang.com)&rn=50";/**开始爬取*/Parser parser = new Parser(url);//设置字符集parser.setEncoding("utf-8");//创建一个filterNodeFilter contentFilter = new AndFilter(new TagNameFilter("div"), new HasAttributeFilter("id","content_left"));//通过Filter过滤NodeList contents = parser.parse(contentFilter);//再创建Filter,用途通过父类去过滤子类NodeFilter divsFilter = new AndFilter(new TagNameFilter("div"), new HasAttributeFilter("data-tools"));NodeList divs = contents.extractAllNodesThatMatch(divsFilter,true);//取值for (int i = 0; i < divs.size(); i++) { Div div = (Div) divs.elementAt(i); String json = div.getAttribute("data-tools"); if(StringUtils.isNotBlank(json) && json.trim().startsWith("{")){ //获取到json JSONObject jsonObj = JSONObject.fromObject(json.trim()); //获取url String durl = jsonObj.getString("url");//内容url //do something }}
相同业务之后改成 JSOUP Java代码:
String url = "http://www.baidu.com/s?wd=site:(www.zybang.com)&rn=50";Document doc = Jsoup.connect(url).get();Elements divs = doc.select("div#content_left div[data-tools]");for (Element element : divs) { String json = element.attr("data-tools"); if(StringUtils.isNotBlank(json) && json.trim().startsWith("{")){ //获取到json JSONObject jsonObj = JSONObject.fromObject(json.trim()); //获取url String durl = jsonObj.getString("url");//内容url //do something }}
瞬间你看看,逻辑思维都符合现在流行的链式编程。
JSOUP
创建一个模拟浏览器行为的请求头:
Document doc = Jsoup.connect(url) .header("Accept", "*/*") .header("Accept-Encoding", "gzip, deflate") .header("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3") .header("Referer", "https://www.baidu.com/") .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0") .timeout(5000) .get();
然后就开启jQuery模式了。
//获取id = 1 的元素的文本值。doc.select("#1").text();//获取id = 1 的元素的HTML值。doc.select("#1").html();//获取id =1 直接子类class='css1' , 然后所有子类的含有class = css2 的集合doc.select("#id > .css1 .css2");
.....版权所属:SO JSON 在线工具