Android 使用jsoup 進行資料抓取
阿新 • • 發佈:2018-11-23
一,身為安卓開發人員,在沒有介面的情況下是很操蛋的。索性就抓點資料測試用了。
準備工作:jsoup.jar
這裡 已經 是 已經實現好 邏輯的方法。
public class MianHuanJsoup {
public static final String MH_URL_WWW="http://www.cncotton.com/";//中國棉花網,
/**
* 請求棉花最新 新聞列表
* @param url
*/
public static List<MianHuaNewsInfo> getMiaHuaListTitle (String url){
List<MianHuaNewsInfo> mhList=new ArrayList<>();
try {
//載入HTML
Document document= Jsoup.connect(url).get();
//獲取指定 選擇器中的資料
Element div1 = document.getElementsByAttributeValue("class", "main4").first();
//這個網頁存在多個main4 所以 要先查到屬於誰下面的,再查。
Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first();
Elements lis=div2.select("li");//2
Elements links = lis.select("a[href]");
MianHuaNewsInfo mh;//每個標題算一個物件。
for (int i = 0; i <links.size() ; i++) {
mh=new MianHuaNewsInfo();
mh.setTitle(links.get(i).text());//標題名字
mh.setUrl(url+links.get(i).attr("href"));//連線
// mh.setTimes(TimeUtils.getStr(links.get(i).attr("href")));//剪下時間。
mhList.add(mh);
// getMianHuaContext(mhList.get(i).getUrl());
// System.out.println("時間 : " + mhList.get(i).getTimes()+mhList.get(i).getUrl());//標題名字
OkLogger.e("biaoti--- : " + links.get(i).text());//標題名字
OkLogger.e("111111111--- : " + mhList.get(i).getTitle());//標題名字
}
// for (Element link : links) {
// System.out.println("\nlink : "+url + link.attr("href"));
// System.out.println("text : " + link.text());//標題名字
//
// }
} catch (IOException e) {
e.printStackTrace();
}
return mhList;
}
/**
* 獲取每個標題下面的詳細資訊
* @param url
*/
public static List<MHNewsContextInfo> getMianHuaContext(String url){
List<MHNewsContextInfo> mhList = new ArrayList<>();
MHNewsContextInfo mh=new MHNewsContextInfo();
try {
Document doc= Jsoup.connect(url).get();
//需要哪一塊的資料。只有圖片就用這個
Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first();
//如果 有段落就用這個。
Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first();
//TODO: 由於資料結構的不一致性,此處判空
Elements p_null=doc.getElementsByTag("p");
Elements img_null=doc.getElementsByTag("img");
if (!img_null.isEmpty()){
//陣列
for (int i = 0; i <img_null.size() ; i++) {
mh.setImgUrl(img_null.get(i).attr("src"));
if (null!=mh) {
mhList.add(mh);
}
}
// for (Element img : div_imgs) {
// System.out.print("---path:" +img.attr("src"));
// }
}
if (!p_null.isEmpty()){
//段落的資料
Elements p = p_null.select("p");//段落
if (null!=p){
for (int i = 0; i <p.size() ; i++) {
mh.setStrContext(p.get(i).select("p").text());
if (null!=mh) {
mhList.add(mh);
}
}
// for (Element ets:p) {
// System.out.println("\n : "+ ets.select("p").text());
// }
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.print("---棉花詳情抓取出錯:");
}
return mhList;
}
}
這裡寫程式碼片
這是我的實體類
public class MianHuaNewsInfo {
private String title;//文章標題
private String url;//文章詳情連結。
private String name="--";//釋出者
private String times;//時間
public boolean read=false;//是否已讀 true 讀 , 預設未讀
/**
* 放詳情內容。
*/
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTimes() {
//時間就等於,詳情連結中的 時間,這裡擷取,
times=TimeUtils.getStr(url);
return times;
}
public void setTimes(String times) {
this.times = times;
}
}
這裡主要是測試類。建議從這裡看 思路會清晰些
package ctp.pdz.cropstradingplatform;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import java.io.IOException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import static ctp.pdz.cropstradingplatform.jsoup.MianHuanJsoup.getMiaHuaListTitle;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
private String url="http://www.cncotton.com/";//棉花
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
getMiaHuaListTitle_test(url);
}
//抓取棉花網最新資訊標題及路徑
public void getMiaHuaListTitle_test(String url){
try {
//載入HTML
Document document= Jsoup.connect(url).get();
//獲取指定 選擇器中的資料
Element div1 = document.getElementsByAttributeValue("class", "main4").first();
//這個網頁存在多個main4 所以 要先查到屬於誰下面的,再查。
Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first();
Elements lis=div2.select("li");//2
Elements links = lis.select("a[href]");
for (Element link : links) {
System.out.println("\nlink : "+url + link.attr("href"));
System.out.println("text : " + link.text());
}
/// zmjgdatayep_13
Element time=document.getElementById("zmjgdatayep_13");
System.out.println("text : " + time);
} catch (IOException e) {
e.printStackTrace();
}
}
//獲取標題下面的詳情
public void getMianHuaContext_test(String url){
try {
Document doc= Jsoup.connect(url).get();
//需要哪一塊的資料。只有圖片就用這個
Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first();
//如果 有段落就用這個。
Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first();
//TODO: 由於資料結構的不一致性,此處判空
Elements p_null=doc.getElementsByTag("p");
Elements img_null=doc.getElementsByTag("img");
if (!img_null.isEmpty()){
//圖片的資料
Elements div_imgs = div_all.getElementsByTag("img");//圖片。
for (Element img : div_imgs) {
System.out.print("---path:" + img.attr("src"));
}
}
if (!p_null.isEmpty()){
//段落的資料
Elements p = div_p.select("p");//段落
if (null!=p){
for (Element ets:p) {
System.out.println("\n : "+ ets.select("p").text());
}
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.print("---棉花詳情抓取出錯:");
}
}
//獲取價格表單
public void getFrom(){
/// 新疆 部分收購價格--http://dc.cncotton.com/dc/data/XJMData.action
//籽棉價格 ---http://dc.cncotton.com/dc/data/ZMData.action
}
/**
* 擷取 把20171121 ☞ 2017-11-21
*
* */
public static void getStr(String url){
String userNameUrl="./sy_59/gnmh_1388/rdxw/201711/t20171121_575890.html";
int beginIndex = 0;
int endIndex = 0;
beginIndex = userNameUrl.indexOf("/t")+1;
endIndex = userNameUrl.lastIndexOf("_");
String t=userNameUrl.substring(beginIndex,endIndex);
String a=t.substring(1,5);//0 開始,後面不擷取
String b=t.substring(5,7);
String c=t.substring(7);
System.out.println("--a:"+a+"--b:"+b+"--c"+c);
}
}
第一個 方法獲取標題,和路徑。這裡還抓不到內容。
執行 getMiaHuaListTitle_test();
這個方法結果如下:
再執行getMianHuaContext_test()
方法,取得這條路徑下面的詳細內容。