我是最近接触到Jsoup的,是在公司的项目中!之前没有接触到爬虫一类的数据交互方式,今天写下这篇文章是为自己复习使用Jsoup,也望大家看到之后可以共同进步!
毕竟我是一个菜鸟!
Jsoup是解析HTML信息的爬虫技术,非常方便,在项目中加入jar包之后,调用API就可以满足需求!
1.Jsoup.parse解析HTML字符串,如Jsoup.parse("<html><head><title>Firstparse</title></head>");
2.Jsoup.connect解析url网站地址,如Jsoup.connect(http://www.baidu.com).get());
3.基本Jsoup需要设置的以下几项:
- Document doc = Jsoup.connect("http://www.baidu.com/")
- .data("query", "Java") // 请求参数
- .userAgent("I ’ m jsoup") // 设置 User-Agent
- .cookie("auth", "token") // 设置 cookie
- .timeout(5000) // 设置连接超时时间
- .post(); // 使用 POST 方法访问 URL
<li class="dn on" data-dn="7d1">
<h1>今天</h1>
<h2>8日</h2>
<big class="jpg50 d04"></big>
<big class="jpg50 n04"></big>
<p class="wea" title="雷阵雨">雷阵雨</p>
<p class="tem tem1"> <span>33</span><i>°C</i> </p>
<p class="tem tem2"> <span>25</span><i>°C</i> </p>
<p class="win">
<em>
<span title="无持续风向" class=""></span>
<span title="无持续风向" class=""></span>
</em>
<i>微风</i>
</p>
<div class="slid"></div>
</li>
1 package com.zjm.www.test;
2
3 import java.io.IOException;
4
5 import org.jsoup.Jsoup;
6 import org.jsoup.nodes.Document;
7 import org.jsoup.select.Elements;
8
9 public class TestJsoup {
10
11 public Document getDocument (String url){
12 try {
13 return Jsoup.connect(url).get();
14 } catch (IOException e) {
15 e.printStackTrace();
16 }
17 return null;
18 }
19
20 public static void main(String[] args) {
21 TestJsoup t = new TestJsoup();
22 Document doc = t.getDocument("http://www.weather.com.cn/html/weather/101280101.shtml");
23 // 获取目标HTML代码
24 Elements elements1 = doc.select("[class=dn on][data-dn=7d1]");
25 // 今天
26 Elements elements2 = elements1.select("h1");
27 String today = elements2.get(0).text();
28 System.out.println(today);
29 // 几号
30 Elements elements3 = elements1.select("h2");
31 String number = elements3.get(0).text();
32 System.out.println(number);
33 // 是否有雨
34 Elements elements4 = elements1.select("[class=wea]");
35 String rain = elements4.get(0).text();
36 System.out.println(rain);
37 // 高的温度
38 Elements elements5 = elements1.select("span");
39 String highTemperature = elements5.get(0).text()+"°C";
40 System.out.println(highTemperature);
41 // 低的温度
42 String lowTemperature = elements5.get(1).text()+"°C";
43 System.out.println(lowTemperature);
44 // 风力
45 Elements elements6 = elements1.select("i");
46 String wind = elements6.get(2).text();
47 System.out.println(wind);
48 }
49 }
5.解析的java代码 :
(1)审查网页元素后发现,我们要的内容在上面的目标HTML代码中,在整个网页中是在 class="dn on" data-dn="7d1" 的 <li> 中
(2)“今天” 两字在 <h1></h1> 中
(3)“8日” 两字在 <h2></h2> 中
(4)“雷阵雨” 三字在 class="wea" 中
(5)“33” 在第一个 <span> 中
(6)“25” 在第二个 <span> 中
(7)“微风” 两字在 第三个 <i> 中
在其中获取数据源的方法有三种 :
(1)从一段 html代码字符串 获取:Document doc = Jsoup.parse(html);
(2)从一个 url 获取:Document doc = Jsoup.connect("http://baidu,com").get();
(3)从一个 html文件 获取Document doc = Jsoup.parse(input,"UTF_8","http://baidu,com");File input = new File("/up/update.html");
我们采取了第二种方法,从url中获取
6.案例解析
- //eg1:解析百度音乐
- Document doc = Jsoup.connect("http://list.mp3.baidu.com/top/singer/A.html").get();
- Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first();
- Elements links = singerListDiv.getElementsByTag("a");
- for (Element link: links) {
- String linkHref = link.attr("href");
- String linkText = link.text().trim();
- System.out.println(linkHref);
- }
- //eg2:解析万年历
- Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get();
- Element infoTable = doc.getElementsByAttributeValue("class", "table002").first();
- Elements tableLineInfos = infoTable.select("tr");
- for (Element lineInfo : tableLineInfos) {
- String lineInfoContent = lineInfo.select("td").last().text().trim();
- System.out.println("jsoup is :" + lineInfoContent);
- }
- //eg5:查找html元素
- File input = new File("/tmp/input.html");
- Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
- Elements links = doc.select("a[href]"); // 链接
- Elements pngs = doc.select("img[src$=.png]"); // 所有 png 的图片
- Element masthead = doc.select("div.masthead").first();// div with class=masthead
- Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
7.项目局部代码实现
- package com.mike.activity;
- import java.io.File;
- import java.io.IOException;
- import org.jsoup.Connection;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import org.jsoup.select.Elements;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.TextView;
- public class JsoupDemoActivity extends Activity {
- /** Called when the activity is first created. */
- private StringBuilder sb ;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- sb = new StringBuilder();
- TextView textView = (TextView) findViewById(R.id.textView1);
- try {
- // //eg1:解析百度音乐
- // Document doc = Jsoup.connect("http://list.mp3.baidu.com/top/singer/A.html").get();
- // Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first();
- // Elements links = singerListDiv.getElementsByTag("a");
- //
- // for (Element link: links) {
- // String linkHref = link.attr("href");
- // String linkText = link.text().trim();
- // System.out.println(linkHref);
- // }
- //
- //
- // //eg2:解析万年历
- // Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get();
- // Element infoTable = doc.getElementsByAttributeValue("class", "table002").first();
- // Elements tableLineInfos = infoTable.select("tr");
- // for (Element lineInfo : tableLineInfos) {
- // String lineInfoContent = lineInfo.select("td").last().text().trim();
- // System.out.println("jsoup is :" + lineInfoContent);
- // }
- //eg3:解析指定段落的内容----注意此代码中的语法:<div class="artHead">
- // Document doc = Jsoup.connect("http://passover.blog.51cto.com").get();
- // Elements divs = doc.select("div.artHead");
- // for (Element div: divs) {
- // System.out.println(div.select("h3[class=artTitle]"));
- // }
- //eg4:
- // Document doc = Jsoup.connect("http://passover.blog.51cto.com").get();
- // //eg5:查找html元素
- File input = new File("/tmp/input.html");
- Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
- Elements links = doc.select("a[href]"); // 链接
- Elements pngs = doc.select("img[src$=.png]"); // 所有 png 的图片
- Element masthead = doc.select("div.masthead").first();// div with class=masthead
- Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
- // //test
- // File input = new File("D:/test.html");
- // Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");
- /*
- * 项目数据准备
- */
- //eg5:万年历:http://www.zdic.net/nongli/2012-3-7.htm
- //data1:dayFav(宜)
- // Document doc = Jsoup.connect("http://www.zdic.net/nongli/2012-3-7.htm").get();
- // Element dayFav = doc.getElementsByAttributeValue("class", "ly2").first();
- // Elements dayFavItems = dayFav.getElementsByTag("a");
- // for (Element dayFavItem:dayFavItems) {
- // System.out.println(dayFavItem.text());
- // }
- //data2:dayUnfav(忌)
- // Element dayUnfav = doc.getElementsByAttributeValue("class", "lj2").first();
- // Elements dayUnfavItems = dayUnfav.getElementsByTag("a");
- // for (Element dayUnfavItem:dayUnfavItems) {
- // System.out.println(dayUnfavItem.text());
- // }
- //data3:taiSheng(胎神)
- // Element taiSheng = doc.getElementsByAttributeValue("class", "lts2").first();
- // System.out.println(taiSheng.text());
- //data4:chong sha(冲煞信息)
- // Element chong = doc.getElementsByAttributeValue("class", "lcs").first();
- // Element sha = doc.getElementsByAttributeValue("class", "lcs").get(1);
- // System.out.println(chong.text());
- // System.out.println(sha.text());
- //data5:zhengChong(正冲)和zhiXing(值星)
- // Element zhengChong = doc.getElementsByAttributeValue("class", "lzc2").first();
- // Element zhiXing = doc.getElementsByAttributeValue("class", "lzx2").first();
- // System.out.println(zhengChong.text());
- // System.out.println(zhiXing.text());
- //data6:godFav(吉神宜趋)
- // Element godUnfav = doc.getElementsByAttributeValue("class", "js2").first();
- // System.out.println(godUnfav.text());
- //data7:godUnfav(凶神宜忌)
- // Element godFav = doc.getElementsByAttributeValue("class", "xs2").first();
- // System.out.println(godFav.text());
- //data8:pengZuBaiJi(彭祖百忌)
- // Element pengZuBaiJi = doc.getElementsByAttributeValue("class", "pz2").first();
- // System.out.println(pengZuBaiJi.text());
- //data9:wuXing(五行)
- // Element wuXing = doc.getElementsByAttributeValue("class", "wuh2").first();
- // System.out.println(wuXing.text());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
1、Rule.java用于指定查询url,method,params等
这个规则类定义了我们查询过程中需要的所有信息,方便我们的扩展,以及代码的重用,我们不可能针对每个需要抓取的网站写一套代码
2、需要的数据对象,目前只需要链接,LinkTypeData.java
3、核心的查询类:ExtractService.java 4、异常类:RuleException.java5、测试类:这里使用了两个网站进行测试,采用了不同的规则view plain cop 输出结果: