要想搞爬虫,看这篇就够了-------------记一次微博爬虫系统设计与实现

需求:

用户喜欢在微博上发布*****的问题,但是由于人工处理的时效性原因,没法及时有效的对其中负面的信息做发现和回复,影响用户对于*******的认知感受。

微博爬取的实现代码:

/**
 * 根据不同关键字查询
 * 根据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()时间类设置定时任务,当当前时间与数据库表中关键字时间差值大于间隔时才会进行查询并且更新时间。采用这种方式无论是多少台机器都可以是间隔相同是时间进行爬虫并且发送消息。在采用这个方式时,注意点是查询和更新要保证原子性。

       允许运营人员实时配置的解决方式是,设计监听器,对运营人员的对关键字信息进行监控,如果发现运营人员的配置发生改变,则暂停定时任务,更新数据库,然后在重新创建任务爬虫推送消息。这样的方式减少去创建管理关键字系统,仅仅是建立一个简单的监控程序。

      推送去重复,由于每次定时任务爬取数据都是从当前时间到数据库存储的时间(上次关键字爬取的时间)所以爬取出来的数据库中数据都是最新且是不重复的数据。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值