java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取

本文介绍了使用java spring+mybatis框架整合实现的今日头条搞笑动态图片爬虫,通过jsoup操作HTML避开正则表达式,利用ajax请求获取数据,解析json并保存到mysql数据库,同时探讨了爬虫的技术选型和实现细节。
摘要由CSDN通过智能技术生成

java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取(详细)

原文地址原博客地址


先上效果图

抓取的动态图:

数据库:

一.此爬虫介绍

今日头条本身就是做爬虫的,爬取各大网站的图片文字信息,再自己整合后推送给用户,特别是里面的动态图片,很有意思。在网上搜了搜,大多都是用Python来写的,本人是学习javaweb这块的,对正则表达式也不是很熟悉,就想着能不能换个我熟悉的方式来写。此爬虫使用spring+mybatis框架整合实现,使用mysql数据库保存爬取的数据,用jsoup来操作HTML的标签节点(完美避开正则表达式),获取文章中动态图片的链接,通过响应头中“Content-Type”的值来判断图片的格式,再将图片保存在本地。当然也可以爬取里面的文字,比如一些搞笑的黄段子,在此基础上稍加改动就可以实现,此爬虫只是提供一个入门的思路,更多好玩的爬虫玩法还待大家去开发,哈哈。

二.技术选型

  1. 核心语言:java;
  2. 核心框架:spring;
  3. 持久层框架:mybatis;
  4. 数据库连接池:Alibaba Drui;
  5. 日志管理:Log4j;
  6. jar包管理:maven; 。。。。

三.找规律,划重点

打开头条首页,找到点击搞笑模块,点击F12,下滚后加载下一页,发现是通过ajax请求api来获取的数据,如下图:

这是响应的json数据,里面的参数和值顾名思义大家都懂得。

是ajax访问就好解决了,通过我百度谷歌各种研究后发现,ajax请求的前三个参数是不变的,改变category参数是请求不同的模块,本列子是请求的搞笑模块所以值为funny,max_behot_time和max_behot_time_tmp这两个参数值是时间戳,首次请求是0,之后的值是响应json数据里面的next中的值。as和cp值是通过一段js生成的,其实就是一个加密了的时间戳而已。js代码后面会贴。

四.开始搭框架撸代码

项目搭建后之后为下图所示的文件结构,不懂得自行谷歌 哈哈

不多说直接上核心代码了:

public class TouTiaoCrawler {
   

    // 搞笑板块的api地址
    public static final String FUNNY = "http://www.toutiao.com/api/pc/feed/?utm_source=toutiao&widen=1";

    // 头条首页地址
    public static final String TOUTIAO = "http://www.toutiao.com";

    // 使用"spring.xml"和"spring-mybatis.xml"这两个配置文件创建Spring上下文
    static ApplicationContext ac = new ClassPathXmlApplicationContext(
            "spring-mybatis.xml");

    // 从Spring容器中根据bean的id取出我们要使用的funnyMapper对象
    static FunnyMapper funnyMapper = (FunnyMapper) ac.getBean("funnyMapper");

    // 接口访问次数
    private static int refreshCount = 0;

    // 时间戳
    private static long time = 0;

    public static void main(String[] args) {
        System.out.println("----------开始干活!-----------------");
        while (true) {
            crawler(time);
        }
    }

    public static void crawler(long hottime) {
  // 传入时间戳,会获取这个时间戳的内容
        refreshCount++;
        System.out.println("----------第" + refreshCount + "次刷新------返回的请求时间为:"
                + hottime + "----------");
        String url = FUNNY + "&max_behot_time=" + hottime
                + "&max_behot_time_tmp=" + hottime;
        JSONObject param = getUrlParam(); // 获取用js代码得到的as和cp的值
        // 定义接口访问的模块
        /*
         * __all__ : 推荐 news_hot: 热点 funny:搞笑
         */
        String module = "funny";
        url += "&as=" + param.get("as") + "&cp=" + param.get("cp")
                + "&category=" + module;
        JSONObject json = null;
        try {
            json = getReturnJson(url);// 获取json串
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (json != null) {
            time = json.getJSONObject("next").getLongValue("max_behot_time");
            JSONArray data = json.getJSONArray("data");
            for (int i = 0; i < data.size(); i++) {
                try {
                    JSONObject obj = (JSONObject) data.get(i);
                    // 判断这条文章是否已经爬过
                    if (funnyMapper.selectByGroupId((String) obj
                            .get("group_id")) != null) {
                        System.out
                                .println("----------此文章已经爬过啦!-----------------");
                        continue;
                    }
                    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值