生活随笔
收集整理的這篇文章主要介紹了
爬取虎牙之三:通过json数据获取所有直播情况
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
動態(tài)ajax頁面為什么會再同一個(gè)頁面有多個(gè)分頁,就是因?yàn)楫?dāng)你點(diǎn)擊其他頁的時(shí)候服務(wù)器返回一串json串,js執(zhí)行json參數(shù)達(dá)到改變頁面效果。下面說說如何抓取json串。
1:爬取信息要對源頁有所了解,首先打開虎牙直播,谷歌F12選取network。點(diǎn)xhr。里面可能會有多個(gè)json文件,點(diǎn)擊第三頁。
發(fā)現(xiàn)點(diǎn)擊第三頁后會出現(xiàn)一個(gè)新的json串。點(diǎn)擊看下
會發(fā)現(xiàn)服務(wù)器返回的數(shù)據(jù)就是這個(gè)頁面所顯示的。你想要的數(shù)據(jù)都在里面。可以通過這個(gè)數(shù)據(jù)爬取有用的信息。查看服務(wù)器的請求
最下面一行的Query String Parameters就是需要的請求,這樣我們模擬請求就可以獲取信息。
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;public class test2 {public static void main(String[] args) throws IOException{String url="https://www.huya.com/";Connection connect = Jsoup.connect(url).timeout(20000);Map header = new HashMap(); header.put("m", "LiveList");header.put("do", "getLiveListByPage");header.put("tagAll", "0"); header.put("page", "3"); connect.data(header);Document doc=connect.get();System.out.println(doc.text());}
}
卻發(fā)現(xiàn)輸出的是
這個(gè)就是前面xhr中的response文件。并且這是一個(gè)json串,要想轉(zhuǎn)換json變成我們想要的東西。就要使用阿里的fastjson解析工具,導(dǎo)入fastjson包就可以使用。對于fastjson的簡單使用,可以先簡單對單個(gè)數(shù)據(jù)摸索。嘗試看看。就可以獲得想要的數(shù)據(jù)。json串的解析和獲取信息需要自己慢慢摸索。貼上最終的代碼:
package 虎牙斗魚直播平臺
;import java
.io
.IOException
;
import java
.sql
.DriverManager
;
import java
.sql
.PreparedStatement
;
import java
.sql
.ResultSet
;
import java
.sql
.SQLException
;
import java
.util
.HashMap
;
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
;
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("數(shù)據(jù)庫驅(qū)動加載成功");con
= DriverManager
.getConnection("jdbc:mysql:" + "//127.0.0.1:3306/db?useSSL=true", "root", "123456");System
.out
.println("數(shù)據(jù)庫連接成功");String url
= "https://www.huya.com/";Connection connect
= Jsoup
.connect(url
).timeout(20000);Map
<String, String> header
= new HashMap<String, String>();header
.put("m", "LiveList");header
.put("do", "getLiveListByPage");header
.put("tagAll", "0");int page
= 0;Document exam
= Jsoup
.connect("https://www.huya.com/l").get();Elements links
= exam
.getElementsByClass("list-page");page
= Integer
.parseInt(links
.attr("data-pages"));System
.out
.println(page
);for (int i
= 0; i
< page
; i
++) {header
.put("page", 1 + i
+ "");Connection data
= connect
.data(header
);Document doc
= data
.get(); try {JSONObject jsonObj
= JSON
.parseObject(doc
.text()); JSONObject jsonOb
= JSON
.parseObject(jsonObj
.getString("data"));JSONArray jarr
= jsonOb
.getJSONArray("datas");for (Object jar
: jarr
) {JSONObject js
= JSON
.parseObject(jar
.toString());int renshu
= Integer
.parseInt((String
) js
.get("totalCount"));String type
= js
.get("gameFullName").toString();String sql2
= "insert into satuday(name,href,number,type)value(?,?,?,?)";PreparedStatement pstmt
= con
.prepareStatement(sql2
);pstmt
.setString(1, (String
) js
.get("nick")); pstmt
.setString(2, "https://www.huya.com/" + js
.get("profileRoom"));pstmt
.setInt(3, renshu
);pstmt
.setString(4, type
);pstmt
.execute();System
.out
.println(js
.get("gameFullName") + "" + id
++ + " " + i
+ "");}} catch (Exception e
) {System
.out
.println(e
.getMessage());}}con
.close();}
}
- 如果對爬蟲,數(shù)據(jù)結(jié)構(gòu),java感興趣可以關(guān)注筆者公眾號:bigsai
總結(jié)
以上是生活随笔為你收集整理的爬取虎牙之三:通过json数据获取所有直播情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。