java實現(xiàn)簡單的爬蟲之今日頭條
更新時間:2016年11月06日 11:37:32 作者:maylor_zhu
最近在學習搜索方面的東西,需要了解網(wǎng)絡爬蟲方面的知識,雖然有很多開源的強大的爬蟲,但本著學習的態(tài)度,想到之前在做資訊站的時候需要用到爬蟲來獲取一些文章,今天剛好有空就研究了一下.在網(wǎng)上看到了一個demo,使用的是Jsoup,我拿過來修改了一下,有需要的朋友可以參考
前言
需要提前說下的是,由于今日頭條的文章的特殊性,所以無法直接獲取文章的地址,需要獲取文章的id然后在拼接成url再訪問。下面話不多說了,直接上代碼。
示例代碼如下
public class Demo2 { public static void main(String[] args) { // 需要爬的網(wǎng)頁的文章列表 String url = "http://www.toutiao.com/news_finance/"; //文章詳情頁的前綴(由于今日頭條的文章都是在group這個目錄下,所以定義了前綴,而且通過請求獲取到的html頁面) String url2="http://www.toutiao.com/group/"; //鏈接到該網(wǎng)站 Connection connection = Jsoup.connect(url); Document content = null; try { //獲取內(nèi)容 content = connection.get(); } catch (IOException e) { e.printStackTrace(); } //轉換成字符串 String htmlStr = content.html(); //因為今日頭條的文章展示比較奇葩,都是通過js定義成變量,所以無法使用獲取dom元素的方式獲取值 String jsonStr = StringUtils.substringBetween(htmlStr,"var _data = ", ";"); System.out.println(jsonStr); Map parse = (Map) JSONObject.parse(jsonStr); JSONArray parseArray = (JSONArray) parse.get("real_time_news"); Map map=null; List<Map> maps=new ArrayList<>(); //遍歷這個jsonArray,獲取到每一個json對象,然后將其轉換成Map對象(在這里其實只需要一個group_id,那么沒必要使用map) for(int i=0;i<parseArray.size();i++){ map = (Map)parseArray.get(i); maps.add((Map)parseArray.get(i)); System.out.println(map.get("group_id")); } //遍歷之前獲取到的map集合,然后分別訪問這些文章詳情頁 for (Map map2 : maps) { connection = Jsoup.connect(url2+map2.get("group_id")); try { Document document = connection.get(); //獲取文章標題 Elements title = document.select("[class=article-title]"); System.out.println(title.html()); //獲取文章來源和文章發(fā)布時間 Elements articleInfo = document.select("[class=articleInfo]"); Elements src = articleInfo.select("[class=src]"); System.out.println(src.html()); Elements time = articleInfo.select("[class=time]"); System.out.println(time.html()); //獲取文章內(nèi)容 Elements contentEle = document.select("[class=article-content]"); System.out.println(contentEle.html()); } catch (IOException e) { e.printStackTrace(); } } } }
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關文章
spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關限流
這篇文章主要介紹了spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關限流,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01SpringBoot Redis配置Fastjson進行序列化和反序列化實現(xiàn)
這篇文章主要介紹了SpringBoot Redis配置Fastjson進行序列化和反序列化實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10java多線程編程之使用Synchronized關鍵字同步類方法
JAVA中要想解決“臟數(shù)據(jù)”的問題,最簡單的方法就是使用synchronized關鍵字來使run方法同步,看下面的代碼,只要在void和public之間加上synchronized關鍵字2014-01-01