突然想爬知乎问题的答案, 然后就开始研究知乎页面,刚开始是爬浏览器渲染好的页面, 解析DOM,找到特定的标签,
后来发现,每次只能得到页面加载出来的几条数据,想要更多就要下拉页面,然后浏览器自动加载几条数据,这样的话解析DOM没用啊,
不能获得所有的回答,然后就搜索了下问题,发现可以使用模拟浏览器发送请求给服务器,获取服务器响应,解析返回的数据,
有了方法,接着就是分析网络请求了, 我用的是火狐浏览器, 按F12点击 网络
鼠标定位到当前位置的最底端
然后下拉滚动条,感觉已经加载新内容了就可以停止了, 这个时候请求新内容的url肯定已经出来了, 剩下的就是找出这个url。
一种方法是看url的意思, 这个不太好看的出来,另一种就是直接复制url到浏览器, 看返回结果,最后得到的请求url是
把链接拿到浏览器地址栏,查看的结果是
接下来就是写代码了
import com.google.gson.Gson; import com.google.gson.internal.LinkedTreeMap; import java.io.*; import java.net.*; import java.util.*; public class ZhiHu { public static void main(String[] args){ //请求链接 String url = "https://www.zhihu.com/api/v4/questions/62209505/answers?" + "include=data[*].is_normal,admin_closed_comment,reward_info," + "is_collapsed,annotation_action,annotation_detail,collapse_reason," + "is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content," + "editable_content,voteup_count,reshipment_settings,comment_permission," + "created_time,updated_time,review_info,relevant_info,question,excerpt," + "relationship.is_authorized,is_author,voting,is_thanked,is_nothelp;data[*].mark_infos[*].url;" + "data[*].author.follower_count,badge[?(type=best_answerer)].topics&sort_by=default"; //调用方法 StringBuffer stringBuffer = sendGet(url,20,0); //输出结果 System.out.println(delHTMLTag(new String(stringBuffer)));
} public static StringBuffer sendGet(String baseUrl,int limit,int offset) {// 存放每次获取的返回结果 String responseResult = "" ; //读取服务器响应的流 BufferedReader bufferedReader = null ; // 存放所有的回答内容 StringBuffer stringBuffer = new StringBuffer(); // 每次返回的回答数 int num = 0 ; try { // 更改链接的limit设置每次返回的回答条数, 更改offset设置查询的起始位置 // 即上一次的limit+offset是下一次的起始位置,经过试验,每次最多只能返回20条结果 String urlToConnect = baseUrl + "&limit="+limit+"&offset="+ offset; URL url = new URL(urlToConnect); // 打开和URL之间的连接 URLConnection connection = url.openConnection(); // 设置通用的请求属性,这个在上面的请求头中可以找到 connection.setRequestProperty("Referer","https://www.zhihu.com/question/276275499" ); connection.setRequestProperty("origin","https://www.zhihu.com" ); connection.setRequestProperty("x-udid"," 换成自己的udid值" ); connection.setRequestProperty("Cookie"," 换成自己的cookie值" ); connection.setRequestProperty("accept", "application/json, text/plain, */*" ); connection.setRequestProperty("connection", "Keep-Alive" ); connection.setRequestProperty("Host", "www.zhihu.com" ); connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" ); // 建立实际的连接 connection.connect(); // 定义 BufferedReader输入流来读取URL的响应 bufferedReader = new BufferedReader( new InputStreamReader(connection.getInputStream())); String line = null ; while ((line = bufferedReader.readLine()) != null ) { responseResult += line; }