1. 程式人生 > >JAVA爬取網頁內容

JAVA爬取網頁內容

之前的文章沒有整理好,這邊重新標註一下,有需要可以到我的個人部落格看完整的三篇文章。

在此之前,大家先了解一個Jsoup,一個html頁面解析的jar包。

如果你上面的Jsoup看完了。

前期準備工作:需要去檢視一下要爬的網頁的結構,對自己要爬的資料的標籤要熟悉。

操作:在頁面上按F12檢視標籤的內容。

就是js+css+html標籤的構造,我們使用比較多的是a、img這兩個標籤。第一個是連結,第二個是圖片所以圖片也是可以爬的~~。裡面的內容也都是一個連結地址。

其餘的標籤就可能是文字資料的內容了。比如說我現在想要爬的就是這個標題中的連結。


和標題的內容。找到這裡看到這個標籤的href值。

使用Jsoup的方法:Elements elements = doc.getElementsByTag("a");//找到所有a標籤

對a標籤進行過濾就行了

也可以直接獲取class標籤下的內容,再在這個class下找到a標籤獲取a標籤的href屬性值。

好了就是這麼簡單。接下來看看程式碼吧。


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MySearchTest {
	private static String url = "https://blog.csdn.net";
	private static String blogName = "guoxiaolongonly";

	public static void main(String[] args) {
		getArticleListFromUrl(url+"/" + blogName);
	}

 /**
 * 獲取文章列表
 *
 * @param listurl
 */
public static void getArticleListFromUrl(final String listurl) {
    boolean isStop = false;
    Document doc = null;
    try {
        doc = Jsoup.connect(listurl).userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36").timeout(3000).post();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Elements elements = doc.getElementsByTag("a");//找到所有a標籤
    for (Element element : elements) {
        final String relHref = element.attr("href"); // == "/"這個是href的屬性值,一般都是連結。這裡放的是文章的連線
        //用if語句過濾掉不是文章連結的內容。因為文章的連結有兩個,但評論的連結只有一個,反正指向相同的頁面就拿評論的連結來用吧
        if (!relHref.startsWith("http://") && relHref.contains("details") && relHref.endsWith("comments")) {
            StringBuffer sb = new StringBuffer();
            sb.append(relHref);
            System.out.println(sb.substring(0, sb.length() - 9));//去掉最後的#comment輸出
            getArticleFromUrl(sb.substring(0, sb.length() - 9));//可以通過這個url獲取文章了
        }
        if (relHref.equals("https://mp.csdn.net//postlist")) {
            isStop = true;
        }
    }


    if (!isStop) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (!listurl.contains("list")) {
                    getArticleListFromUrl(listurl + "/article/list/1");//獲取下一頁的列表
                } else {
                    getArticleListFromUrl(listurl.substring(0, listurl.length() - 1) +
                            (Integer.valueOf(listurl.substring(listurl.length() - 1, listurl.length())) + 1));//獲取下一頁的列表
                }


            }
        }).start();
    }
}
	/**
	 * 獲取文章內容
	 * @param detailurl
	 */
	public static void getArticleFromUrl(String detailurl) {
		try {
			Document document = Jsoup.connect(detailurl).userAgent("Mozilla/5.0").timeout(3000).post();
			Element elementTitle = document.getElementsByClass("link_title").first();//標題。 這邊根據class的內容來過濾
			System.out.println(elementTitle.text());
			String filename = elementTitle.text().replaceAll("/", "或");
			Element elementContent = document.getElementsByClass("article_content").first();//內容。
			saveArticle(filename , elementContent.text(), blogName);
			// String Content =elementContent.te  xt().replaceAll(" ", "\t");
			// System.out.println(elementContent.text()+"\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	/**
	 * 儲存文章到本地
	 * @param titile
	 * @param content
	 * @param blogName
	 */
	public static void saveArticle(String titile, String content, String blogName) {
		String lujing = "d:\\MyLoadArticle\\" + blogName + "\\" + titile + ".txt";//儲存到本地的路徑和檔名
		File file = new File(lujing);
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		try {
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			FileWriter fw = new FileWriter(file, true);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(content);
			bw.flush();
			bw.close();
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

2018年6月4日 12:04:33 更新

先說一下不能儲存的原因,

1.CSDN現在有做CA認證了。

解決方案:所有地址帶https

2.原本的下一頁屬於靜態生成的頁面現在由js動態載入。

解決方案:

1.用另外一個框架帶模擬點選實現

2.找到js程式碼,載入js來獲取跳轉內容(沒找到js)

3.下下之策,因為文章列表地址為 https://blog.csdn.net/guoxiaolongonly/article/list/pageIndex 我把下一頁寫成預設跳轉,如果當前頁不存在文章內容就不在翻頁。然後因為測試太多次被CSDN強制登入了。再見

我封裝了獲取文章列表、獲取文章內容儲存文章內容的方法。

大家可以設定blogName去爬你想要的文章了,比如說我:guoxiaolongonly

這邊用post模擬瀏覽器請求。因為直接get,頁面無法載入。還有就是使用cookie,模擬使用者使用者頁面訪問操作。會的小夥伴們也可以交流一下~~吐舌頭

針對文字文件編碼亂碼問題。還希望大家自己研究一下。