技術准備
HttpClient
Java比較常用的發起請求的工具,功能有:
- 方便的發起get、post等請求
- 可以設置連接池(類似線程池),使用池化思想降低頻繁創建連接的開銷
- 可以自己編寫代碼設置多線程爬取
- ...
代碼模板
public static void main(String[] args) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
URIBuilder uriBuilder = new URIBuilder("https://mp.weixin.qq.com/cgi-bin/bizlogin");
HttpPost httpPost = new HttpPost(uriBuilder.build());
httpPost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36");
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("action","startlogin"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params,"utf8");
httpPost.setEntity(formEntity);
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpPost);
if(response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(),"utf8");
System.out.println(content);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是post請求的代碼模板,get等其他請求也差不太多,將HttpPost換成HttpGet就行了
Jsoup
一個html解析工具,可以在后台很方便的像jquery一樣以標簽、類、屬性選擇器的方式,獲取指定的html標簽下的文本內容。
微信公眾平台
爬取方法
一般爬取的接口是搜狗微信、或者是微信公眾平台,這里使用的是微信公眾平台
- 登錄微信公眾平台
- 選擇草稿箱->新的創作
- 選擇鏈接->其他公眾號
- 選擇公眾號名稱或者公眾號id,就可以看到該公眾號下的內容了
- filder進行抓包,找到該接口,使用該接口就可以抓取公眾號內容
自動登錄
動機:因為cookie過三天就會過期,每次都需要人工重新登錄,想試試可不可以自動登錄
想法:filder抓取賬號密碼登錄接口,cookie過期就使用賬號密碼重新登錄一下,填充新的cookie
實踐
抓取到登錄接口是這個:https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin&username=sdf&pwd=1234&imgcode&token
編寫代碼嘗試登錄,發現還是會跳轉到掃碼登錄,也就是說掃碼登錄是繞不開的。
因此看了一下掃碼登錄的流程,和OAuth2授權過程很像。其中必須要用到手機端進行掃碼,因此無法實現完全自動化。
掃碼登錄流程
- 頁面上會出現二維碼,微信服務器會一直用長連接或者輪詢判斷二維碼是否被掃描
- 二維碼被掃描,微信服務器會接收到掃描請求,向公眾號平台服務器發送手機確認請求
- 微信公眾號平台服務器向手機發送確認請求
- 手機確認授權,網頁得到token,跳轉登錄成功