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,模擬使用者使用者頁面訪問操作。會的小夥伴們也可以交流一下~~