1. 程式人生 > >java爬取鬥魚:與虎牙對比

java爬取鬥魚:與虎牙對比

看了下鬥魚的基礎頁面,感覺和虎牙的有點像,但是實際上確有點不同。
首先想要獲取頁數,看了鬥魚的html頁面,發現卻不顯示頁面。這裡寫圖片描述
這是因為鬥魚把介面藏在了js頁面中,谷歌瀏覽器的右擊檢查
這裡寫圖片描述
這裡寫圖片描述
那麼接下來就是選取一款可以解析js的工具並且提取裡面的資訊了。jsoup不支援js的提取,我們用htmlunit實現。抓取頁面數。
*/
詳細看程式碼
/*
假設我們已經獲取了頁面總數,下一步需要執行的是模擬訪問,請求url解析資料,查詢json檔案
這裡寫圖片描述
對沒錯,資料就再這個檔案裡,再檢視請求
這裡寫圖片描述
你會發現這個請求和抓取虎牙的不一樣!但是細心一點你會發現request url有規律可循,這個爬取就需要我們拼湊地址。唯一不同的就是結尾。我們先試著訪問下這個檔案。
這裡寫圖片描述


發現報錯了,百度查明原因少了ignoreContentType(true)。
這裡寫圖片描述
這樣就成功訪問這個json串了,剩下的就是根據需求,爬取你想要的資訊了

import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util
.Map; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.gargoylesoftware.htmlunit.BrowserVersion; import com
.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlAnchor; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class 抓取鬥魚 { public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException { int id=1; java.sql.Connection con; Class.forName("com.mysql.jdbc.Driver"); System.out.println("資料庫驅動載入成功"); con = DriverManager.getConnection("jdbc:mysql:" + "//127.0.0.1:3306/db?useSSL=true", "root", "123456"); System.out.println("資料庫連線成功"); final WebClient webClient = new WebClient(BrowserVersion.CHROME);// webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.getOptions().setCssEnabled(false); HtmlPage page=webClient.getPage("https://www.douyu.com/directory/all"); List<HtmlAnchor>anchors=page.getAnchors(); List<HtmlAnchor>jsanchors=new ArrayList<HtmlAnchor>(); for(HtmlAnchor anchor:anchors) { String href=anchor.getAttribute("href"); /* * 抓取js的連結 然後獲取有用的資訊 */ if("#".equals(href)) { {jsanchors.add(anchor);} } } HtmlAnchor t1=jsanchors.get(jsanchors.size()-3);System.out.println(t1.asText());//載入js才能獲取頁面數 int number=Integer.parseInt(t1.asText());//頁面數 for(int i=1;i<number;i++) { String url="https://www.douyu.com/gapi/rkc/directory/0_0/"+i; Connection conn = Jsoup.connect(url).ignoreContentType(true).timeout(2000); // .header("Accept", "text/plain, */*; q=0.01") // .header("Accept-Encoding", "gzip, deflate, br") // .header("Accept-Language", "zh-CN,zh;q=0.9") // .header("Connection", "keep-alive") // .header("content type", " text/*, application/xml, or application/xhtml+xml") // .header("Mimetype", "application/json") // .header("charset", "utf-8") // .header("X-Requested-With", "XMLHttpRequest") // .header("Host", "www.douyu.com") // .header("Cookie", "dy_did=1c44f89110e75337d1bb4ab500011501; acf_did=1c44f89110e75337d1bb4ab500011501;" // + " smidV2=2018042210064794358e4a60e148cb2044dd7ccc979fb90028d0af372db9810; " // + "Hm_lvt_e99aee90ec1b2106afe7ec3b199020a7=1524114219,1524218776,1524383249,1524660154;" // + " Hm_lpvt_e99aee90ec1b2106afe7ec3b199020a7=1524660429") // .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"); Document doc=conn.get(); // System.out.print(doc); // int page=0;//頁數 try{ JSONObject jsonObj = JSON.parseObject(doc.text()); JSONObject jsonOb=JSON.parseObject(jsonObj.getString("data"));//獲取data的json內容 JSONArray jarr=jsonOb.getJSONArray("rl");// for(Object jar:jarr) { JSONObject js=JSON.parseObject( jar.toString());//獲取更具體的json值 //System.out.println(js); /* * 寫入資料庫 */ int renshu2=Integer.parseInt(js.get("ol").toString()); String type=js.get("c2name").toString(); String sql2="insert into satuday(name,href,number,type)value(?,?,?,?)";//插入mysql PreparedStatement pstmt = con.prepareStatement(sql2); pstmt.setString(1, (String) js.get("nn")); pstmt.setString(2, "https://www.douyu.com"+js.get("url")); pstmt.setInt(3, renshu2); pstmt.setString(4,type ); pstmt.execute(); System.out.println(js.get("nn")+""+id+++""+type+renshu2); } } catch(Exception e) {System.out.println(e.getMessage());} } con.close(); } }

別忘記try catch。這樣,資料就存在mysql中了
這裡寫圖片描述
晚上都是大主播呢!同理,如果想爬取他們直播間彈幕,也可以進入他的直播間試試找到他的json檔案。不過那個可能處理會很麻煩。