场景描述:
在用户提出需要爬取微信公总号推送消息的时候,感觉是懵逼的,之前从来没爬取过,无从下手,没办法顾客是上帝,既然用户提出了需求,我们只能想法去解决问题。
然后根据用户提供微信公总号 安泰科现货报价 去爬取,发现公总号推送的消息的url并不是固定不变的,这咋整。好在对于我们开发人员来说有度娘,ok,百度一下,发现搜狗微信能解决该问题。写了一个测试发现,果然能解决,之后就有了这篇博文,用来记录,免得忘记,也多少能给大家一些参考,废话不多说,言归正传:
首先需要jsoup的jar包,我用的1.10.2版本。
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
然后是测试类的代码,简单的注释已经写上,如下
package crawler;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.junit.Test;
/**
* 微信公总号测试类
* @author siqiangming 2018年5月9日 上午9:59:18
*/
public class WeChatTest{
@Test
public void getFirst(){
String baseUrl = "http://weixin.sogou.com/weixin?type=1&ie=utf8&query=";//搜狗微信的基础地址
String searchUrl = baseUrl + "gh_3756da4d163e";//加上安泰科现货价格的微信公总号
Document document = getDocument(searchUrl);
String listUrl = document.select(".tit a").attr("href");//查询到所有列表信息的url
System.out.println(listUrl);
System.out.println("-----------------------");
Document doc = getDocument(listUrl);
//截取前10条推送信息的json中的list数据
String jsonList = doc.html().split("var msgList = ")[1].split("seajs.use")[0].trim();
//截取出来第一条信息的url
String url = jsonList.split("content_url\":\"")[1].split("\",\"copyright_stat")[0].replaceAll("amp;", "");
if(url.startsWith("/s")){//如果url以/s开头,处理成http格式
url = "http://mp.weixin.qq.com" + url;
}
System.out.println(url);
//获取第一条推送信息的标题
String title = jsonList.split("title\":\"")[1].split("\"},\"comm_msg_info")[0];
System.out.println(title);
}
/**
* 获取页面
* @author siqiangming 2018年5月9日 下午2:23:01
* @param url url
* @return
*/
public Document getDocument(String url){
Document document = null;
try {
document = Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
return document;
}
}
ok,url已经获取到,剩下的爬取的就省略了。