在本文中,咱们将介绍如何运用Java编写一个抓包东西来爬取微信公众号的技能共享文章。本文首要分为以下几个过程:
- 准备工作
- 剖析微信公众号网页结构
- 编写Java程序完成文章爬取功用
1. 准备工作
在开始之前,咱们需求准备以下东西:
- Java开发环境
- 抓包东西:Fiddler或Charles
在本文中,咱们将运用Fiddler进行抓包剖析和数据获取。
2. 剖析微信公众号网页结构
首要,咱们需求剖析微信公众号的网页结构,以确定咱们需求抓取哪些数据。在微信公众号的文章列表页,咱们能够看到每篇文章都有一个仅有的URL和一个标题。咱们能够运用Fiddler东西剖析恳求,查看恳求的URL和呼应内容,以确定咱们需求获取哪些数据。
在Fiddler中,咱们能够看到恳求的URL是类似于这样的:mp.weixin.qq.com/mp/profile_…
咱们能够运用Java编写程序模仿发送恳求,并解析呼应内容,以获取文章标题和URL等信息。
3. 编写Java程序完成文章爬取功用
接下来,咱们将运用Java编写一个抓包东西,来获取微信公众号的技能共享文章。咱们首要需求导入必要的Java库和Fiddler的API库。
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.xk72.charles.CharlesContext;
import com.xk72.charles.gui.transaction.viewer.RequestViewer;
import com.xk72.charles.gui.transaction.viewer.ResponseViewer;
import com.xk72.charles.model.MapBackedDynamicObject;
import com.xk72.charles.model.Transaction;
import com.xk72.charles.model.s;
import com.xk72.charles.tools.proxy.ssl.SSLContextUtil;
import com.xk72.proxy.Proxy;
import com.xk72.proxy.ProxyListenerAdapter;
import com.xk72.proxy.ProxyServer;
然后,咱们能够界说一个抓包东西类,用于发送HTTP恳求并解析呼应内容。
public class WeChatSpider {
private static final String HOST = "mp.weixin.qq.com";
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
private ProxyServer proxyServer;
public WeChatSpider() {
initProxyServer();
}
/**
* 初始化代理服务器
*/
private void initProxyServer() {
try {
proxyServer = new ProxyServer("localhost", 8888);
proxyServer.addProxyListener(new ProxyListenerAdapter() {
@Override
public void requestReceived(Proxy proxy, final Transaction transaction) {
if (HOST.equals(transaction.getRequest().getHost())) {
RequestViewer requestViewer = new RequestViewer(transaction);
ResponseViewer responseViewer = new ResponseViewer(transaction);
String requestUrl = transaction.getRequest().getURL().toString();
if (requestUrl.startsWith("https://mp.weixin.qq.com/mp/profile_ext")) {
try {
transaction.setResponse(
createResponse(requestViewer, responseViewer));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
proxyServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 封闭代理服务器
*/
public void stop() {
proxyServer.stop();
}
/**
* 发送HTTP恳求,获取呼应内容
* @param url 恳求URL
* @return 呼应内容
* @throws IOException
*/
private String sendRequest(String url) throws IOException {
SSLContextUtil.setTrustAllCertificates(true);
s proxy = SSLContextUtil.getProxy();
MapBackedDynamicObject options = new MapBackedDynamicObject();
options.set("method", "GET");
options.set("headers", new MapBackedDynamicObject()
.set("User-Agent", USER_AGENT));
return proxy.a(url, options).f();
}
/**
* 解析呼应内容,获取文章列表
* @param requestViewer
* @param responseViewer
* @return 呼应内容
* @throws IOException
*/
private String createResponse(RequestViewer requestViewer, ResponseViewer responseViewer) throws IOException {
String responseText = responseViewer.getText();
List<Article> articleList = new ArrayList<>();
// 解析呼应内容,获取文章列表
// TODO: 完成解析逻辑
return responseText;
}
/**
* 文章数据模型
*/
private static class Article {
private String title;
private String url;
public Article(String title, String url) {
this.title = title;
this.url = url;
}
public String getTitle() {
return title;
}
public String getUrl() {
return url;
}
}
在上述代码中,咱们创建了一个WeChatSpider类,它完成了HTTP恳求的发送和呼应内容的解析。咱们首要在结构函数中初始化代理服务器,然后在代理服务器的恳求接收办法中,判断恳求的URL是否为微信公众号的文章列表页,如果是,则调用createResponse办法生成呼应内容。在sendRequest办法中,咱们运用Fiddler的API库发送HTTP恳求,并获取呼应内容。在createResponse办法中,咱们解析呼应内容,并将文章列表保存到articleList中,最终返回呼应内容。
现在,咱们能够在WeChatSpider类中添加解析呼应内容的逻辑。详细的解析逻辑能够根据微信公众号的网页结构进行定制。在本文中,咱们简略地运用正则表达式解析文章列表。鄙人面的代码中,咱们假定呼应内容中包括一个class为”txt-box”的div标签,每个div标签中包括一个class为”tit”的a标签,a标签的href属性为文章的URL,a标签的文本为文章的标题。
/**
* 解析呼应内容,获取文章列表
* @param requestViewer
* @param responseViewer
* @return 呼应内容
* @throws IOException
*/
private String createResponse(RequestViewer requestViewer, ResponseViewer responseViewer) throws IOException {
String responseText = responseViewer.getText();
List<Article> articleList = new ArrayList<>();
// 解析呼应内容,获取文章列表
Pattern pattern = Pattern.compile("<div class=\"txt-box\">.*?<a href=\"(.*?)\".*?class=\"tit\">(.*?)</a>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(responseText);
while (matcher.find()) {
String title = matcher.group(2);
String url = matcher.group(1);
articleList.add(new Article(title, url));
}
// 结构呼应内容
String responseBody = "<html><body>";
for (Article article : articleList) {
responseBody += "<a href=\"" + article.getUrl() + "\">" + article.getTitle() + "</a><br>";
}
responseBody += "</body></html>";
return createHTTPResponse(responseBody);
}
/**
* 结构HTTP呼应
* @param responseBody 呼应内容
* @return HTTP呼应
*/
private String createHTTPResponse(String responseBody) {
String httpResponse = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html;charset=UTF-8\r\n" +
"Content-Length: " + responseBody.length() + "\r\n" +
"Connection: close\r\n" +
"\r\n" +
responseBody;
return httpResponse;
}
在上述代码中,咱们运用正则表达式解析呼应内容,并将解析结果保存到articleList中。然后,咱们运用StringBuilder结构HTML呼应内容,遍历articleList中的文章,并将文章标题和URL结构为HTML的a标签。最终,咱们调用createHTTPResponse办法结构HTTP呼应,并返回给Fiddler。
最终,咱们能够编写一个Main类来运用WeChatSpider类进行爬取。在Main类中,咱们运用WeChatSpider类发送HTTP恳求,获取呼应内容,并打印出文章列表。
public class Main {
public static void main(String[] args) throws IOException {
WeChatSpider spider = new WeChatSpider();
String response = spider.sendRequest("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI3Njg3NTIyMw==&scene=124#wechat_redirect");
System.out.println(response);
spider.stop();
}
}
在上述代码中,咱们首要创建一个WeChatSpider目标,然后调用sendRequest办法发送HTTP恳求,并获取呼应内容。最终,咱们打印出呼应内容,并调用stop办法封闭代理服务器。
综上所述,利用JAVA和抓包东西Fiddler,咱们能够完成爬取微信公众号文章的功用。在实践应用中,咱们能够根据详细的需求,对代码进行定制和优化。