需求:
用户喜欢在微博上发布*****的问题,但是由于人工处理的时效性原因,没法及时有效的对其中负面的信息做发现和回复,影响用户对于*******的认知感受。
微博爬取的实现代码:
/**
* 根据不同关键字查询
* 根据URL获取网页信息
*
* @param Url
* @return
*/
private ResponseEntity<String> getBody(String Url) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
headers.put("user-agent", Collections.singletonList("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"));
headers.put("content-encoding", Collections.singletonList("gzip"));
headers.put("content-security-policy", Collections.singletonList("upgrade-insecure-requests"));
headers.put("content-type", Collections.singletonList("application/json; charset=utf-8"));
headers.put("proc_node", Collections.singletonList("web-111.mweibo.bx.intra.weibo.cn"));
headers.put("server", Collections.singletonList("Tengine/2.2.2"));
headers.put("ssl_node", Collections.singletonList("ssl-010.mweibo.tc.intra.weibo.cn"));
headers.put("status", Collections.singletonList("200"));
headers.put("vary", Collections.singletonList("Accept-Encoding"));
headers.put("x-powered-by", Collections.singletonList("PHP/7.2.1"));
MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();
RestTemplate restTemplate = new RestTemplate();
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity(params, headers);
ResponseEntity<String> baseRspBean = null;
try {
baseRspBean = restTemplate.postForEntity(Url, httpEntity, String.class);
} catch (Exception e) {
LOGGER.info("爬取数据不成功" + Url);
e.printStackTrace();
}
return baseRspBean;
}
URL可以采用:
/**
* 微博查询URL
*/
private final String WEIBOSEARCHURL = "https://m.weibo.cn/api/container/getIndex?containerid=100103type=61%26q=****&page_type=searchall&page=";
需求难点:
难点1:要求十分钟间隔查询一次,严格的十分钟查询一次容易让微博方发现使用爬虫程序爬取数据
难点2:线上是两个服务器,两台服务器如何考虑协作的问题。
难点3:支持关键字可配置,通知人可配置
难点4:推送爬取数据不要重复
系统设计:
关键字数据表设计为:
解决多台等间隔推送消息:等间隔采用的是使用new Timer()时间类设置定时任务,当当前时间与数据库表中关键字时间差值大于间隔时才会进行查询并且更新时间。采用这种方式无论是多少台机器都可以是间隔相同是时间进行爬虫并且发送消息。在采用这个方式时,注意点是查询和更新要保证原子性。
允许运营人员实时配置的解决方式是,设计监听器,对运营人员的对关键字信息进行监控,如果发现运营人员的配置发生改变,则暂停定时任务,更新数据库,然后在重新创建任务爬虫推送消息。这样的方式减少去创建管理关键字系统,仅仅是建立一个简单的监控程序。
推送去重复,由于每次定时任务爬取数据都是从当前时间到数据库存储的时间(上次关键字爬取的时间)所以爬取出来的数据库中数据都是最新且是不重复的数据。