JAVA实现问财爬虫

这篇具有很好参考价值的文章主要介绍了JAVA实现问财爬虫。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过 RestTemplate 将查询语句申请发送至问财,实现同花顺问财的爬虫获取数据,例子中实现了将爬取的数据写入excel文件并染成红色,可将其改造放入数据库中.

通过测试发现爬虫自动能访问一百多次左右,会被官方识别为爬虫,解决办法为用浏览器打开问财,验证下图形验证码(因为问财nginx是通过识别ip访问的,短期内同一个ip访问太频繁会被识别出来)

爬取的网站地址为 http://www.iwencai.com/customized/chart/get-robot-data ,爬取过程中会发送请求头和消息体,消息头包含session,这部分是分析网站之后,抽取的js保存到本地,到本地进行运行,得到session后保存在请求头里面进行请求。

文章给出了部分代码,完整代码请移步链接Java爬虫实现访问问财数据并处理

需要用到的maven依赖
        <!--执行js脚本依赖-->
        <dependency>
            <groupId>org.openjdk.nashorn</groupId>
            <artifactId>nashorn-core</artifactId>
            <version>15.3</version>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>
部分java代码
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.swing.DesktopUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.lhk.datasql.util.MyUtil;
import org.apache.poi.ss.usermodel.*;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.File;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;


/**
 * 问财爬虫实现
 */
public class WCTool {

    private static String WC_ROBOT = "http://www.iwencai.com/customized/chart/get-robot-data";
    private static File file = FileUtil.file(MyUtil.DESKTOP_PREFIX + "市场情绪.xlsx");
    private static String[] NumToStr = new String[]{"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
    private static AtomicInteger maxHarden = new AtomicInteger(0);
    private static RestTemplate restTemplate = new RestTemplate();

    public static void main(String[] args) {
        //List<DateTime> dateSubList = MyUtil.getDateSubList("2023-05-30", "2023-06-15");
        //for (DateTime dateTime : dateSubList) {
        //    if (HolidayUtils.isWorkDay(dateTime) && !DateUtil.isWeekend(dateTime)) {
        //        String question = "非ST " + DateUtil.format(dateTime, DatePattern.CHINESE_DATE_PATTERN);
        //        writeExcelSheet1(question, dateTime);
        //        writeExcelSheet2(question, dateTime);
        //    }
        //}
        String question = "非ST 今日";
        writeExcelSheet1(question, DateUtil.date());
        writeExcelSheet2(question, DateUtil.date());
        DesktopUtil.open(file);
        //JSONArray datas = getDatas(question + "1板 概念");
        //Map<String, Integer> res = new HashMap<>();
        //for (int i = 0; i < datas.size(); i++) {
        //    String gls = StrUtil.nullToEmpty(datas.get(i, JSONObject.class).get("所属概念", String.class));
        //    for (String s : gls.split(";")) {
        //        res.put(s, res.containsKey(s) ? res.get(s) + 1 : 1);
        //    }
        //}
        //System.out.println(datas);
    }

    private static void writeExcelSheet1(String question, DateTime date) {
        ExcelReader reader = ExcelUtil.getReader(file, "表格");
        List<Object> heads = reader.read().get(0);
        int rowCount = reader.getRowCount();
        reader.close();
        JSONArray datas = getDatas(question + "1板 行业");
        Map<String, Integer> rds = new HashMap<>();
        for (int i = 0; i < datas.size(); i++) {
            for (String s : datas.get(i, JSONObject.class).get("所属同花顺行业", String.class).split("\\-")) {
                rds.put(s, rds.containsKey(s) ? rds.get(s) + 1 : 1);
            }
        }
        Map<String, Object> res = new LinkedHashMap<>(heads.size());
        res.put("日期", DateUtil.format(date, DatePattern.CHINESE_DATE_PATTERN) + ",星期" + NumToStr[DateUtil.dayOfWeek(date) - 2]);
        StringBuffer rsStr = new StringBuffer();
        MapUtil.sortByValue(rds, true).forEach((k, v) -> {
            if (v > 1) {
                rsStr.append(k + "[" + v + "]");
            }
        });
        res.put("当日热点", rsStr);
        maxHarden.set(0);
        IntStream.range(1, 13).forEach(t -> {
            Integer count = getCount(question + t + "板");
            if (count > 0) {
                maxHarden.set(t);
                res.put(NumToStr[t - 1] + "板", count);
            } else {
                res.put(NumToStr[t - 1] + "板", "");
            }
        });
        ExcelWriter writer = ExcelUtil.getWriter(file, "表格");
        writer.setCurrentRow(rowCount);
        writer.write(Arrays.asList(res));
        sheet1CellStyle(writer, rowCount, res);
        writer.close();
    }

    private static void writeExcelSheet2(String question, DateTime date) {
        ExcelReader reader = ExcelUtil.getReader(file, "折线图");
        List<Object> heads = reader.read().get(0);
        int rowCount = reader.getRowCount();
        reader.close();
        Map<String, Object> res = new LinkedHashMap<>(heads.size());
        res.put("日期", DateUtil.format(date, DatePattern.CHINESE_DATE_PATTERN) + ",星期" + NumToStr[DateUtil.dayOfWeek(date) - 2]);
        for (int i = 1; i < heads.size(); i++) {
            String str = String.valueOf(heads.get(i));
            Integer count = getCount(question + " " + str);
            res.put(str, count);
        }
        /**
         * 单独处理最高板
         */
        res.put("最高板", maxHarden.get());
        ExcelWriter writer = ExcelUtil.getWriter(file, "折线图");
        writer.setCurrentRow(rowCount);
        writer.write(Arrays.asList(res));
        sheet2CellStyle(writer, rowCount, heads.size());
        writer.close();
    }

    private static void sheet1CellStyle(ExcelWriter writer, int rowCount, Map<String, Object> map) {
        Font font = writer.getWorkbook().createFont();
        font.setFontName("楷体");
        font.setFontHeightInPoints((short) 11);
        for (int i = 0; i < 2; i++) {
            setCellStyle(writer, i, rowCount, font, IndexedColors.LIGHT_GREEN);
        }
        for (int i = 0; i < 12; i++) {
            String val = MapUtil.getStr(map, NumToStr[i] + "板");
            if (StrUtil.isNotBlank(val)) {
                setCellStyle(writer, i + 2, rowCount, font, IndexedColors.RED1);
            }
        }
    }

    private static void sheet2CellStyle(ExcelWriter writer, int rowCount, int maxCol) {
        Font font = writer.getWorkbook().createFont();
        font.setFontName("楷体");
        font.setFontHeightInPoints((short) 11);
        for (int i = 0; i < maxCol; i++) {
            setCellStyle(writer, i, rowCount, font, IndexedColors.LIGHT_GREEN);
        }
    }

    private static void setCellStyle(ExcelWriter writer, int row, int col, Font font, IndexedColors colors) {
        CellStyle cellStyle = writer.createCellStyle(row, col);
        cellStyle.setFillForegroundColor(colors.getIndex());
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cellStyle.setFont(font);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setWrapText(true);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
    }

    private static Integer getCount(String question) {
        Integer count = getBodyData(question).get("meta", JSONObject.class)
                .get("extra", JSONObject.class)
                .get("code_count", Integer.class);
        System.out.println(question + "---" + count);
        return count;
    }

    private static JSONArray getDatas(String question) {
        return getBodyData(question).get("datas", JSONArray.class);
    }

    private static JSONObject getBodyData(String question) {
        JSONObject data = null, body = null;
        try {
            Thread.sleep(1000);
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(WC_ROBOT, getHttpEntity(question), String.class);
            body = JSONUtil.parseObj(responseEntity.getBody());
            data = body.get("data", JSONObject.class)
                    .get("answer", JSONArray.class)
                    .get(0, JSONObject.class)
                    .get("txt", JSONArray.class)
                    .get(0, JSONObject.class)
                    .get("content", JSONObject.class)
                    .get("components", JSONArray.class)
                    .get(0, JSONObject.class)
                    .get("data", JSONObject.class);
        } catch (Exception e) {
            System.out.println(body);
            e.printStackTrace();
        }
        return data;
    }

    private static Map<String, Object> queryLoad(String question) {
    	///略
    }

    private static HttpEntity getHttpEntity(String question) {
    	///略
    }

    private static String getCookie() throws Exception {
    	///略
    }
}
运行截图

JAVA实现问财爬虫
JAVA实现问财爬虫
JAVA实现问财爬虫
JAVA实现问财爬虫

JAVA实现问财爬虫

访问次数过多,java会抛出异常,这个时候打开浏览器访问问财,会被警告,这个时候验证下拼图就又可以重新验证。

JAVA实现问财爬虫
Java爬虫实现访问问财数据并处理

以下内容可以忽略

发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】
发文助手会检测您的文章标题、错别字、内容质量,助您提升文章质量。【创作规范】文章来源地址https://www.toymoban.com/news/detail-493431.html

到了这里,关于JAVA实现问财爬虫的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA使用RestTemplate类实现SSL双向/单向认证(国际)

    以管理员身份打开Windows PowerShel,通过cd(与linux系统类似)命令进入到JDK的bin目录:如C:Program FilesJavajdk1.8.0_221jrebin,找到目录下有keytool.exe就是正确进入目录了 参数说明: genkey 表示要创建一个新的密钥 alias 表示 keystore 的别名、 keyalg 表示使用的加密算法是 RSA ,一种非

    2024年02月15日
    浏览(39)
  • java直接使用dsl语句查询ES

    2024年02月03日
    浏览(43)
  • RestTemplate通过HTTPS协议访问接口

    RestTemplate 默认不支持https协议,需要支持有两种方式,第一种是忽略认证,第二种是导入证书(比第一种安全) 在这里只实现第一种方式,实现代码如下

    2024年02月11日
    浏览(45)
  • IDEA Java1.8通过sqljdbc4连接sqlserver插入语句

    1. 下载sqljdbc4:https://mvnrepository.com/artifact/com.microsoft.sqlserver.jdbc/sqljdbc4/4.0 下载后在IDEA放入仓库内,可以放在resources下,右键“add as library”。 2. 在控制面板中开启Telnet客户端,默认是不开启的。 若报错“ java.lang.classNotFoundException:com.microsoft.sqlserver.jdbc”说明1或2没有设置成功

    2024年02月09日
    浏览(36)
  • 【java爬虫】将优惠券数据存入数据库排序查询

    本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客  前两篇文章介绍了如何获取优惠券的基础信息,本文将获取到的基本信息存到数据库中

    2024年02月16日
    浏览(49)
  • [Selenium] 通过Java+Selenium查询文章质量分

    通过Java+Selenium查询文章质量分 通过Java+Selenium查询某个博主的Top40文章质量分 大家好,我是青花,本篇给大家分享一下《通过Java+Selenium查询文章质量分》。 浏览器:本篇使用的是Chrome Chrome浏览器版本:113 Chrome驱动版本:113(Java爬虫第一篇) Java版本:Jdk1.8 selenium版本: 4

    2024年02月10日
    浏览(46)
  • 通过myBatis将sql语句返回的值自动包装成一个java对象(1)以及SqlSessionFactory

    如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可

    2024年01月18日
    浏览(48)
  • MyBatis动态语句且如何实现模糊查询及resultType与resultMap的区别---详细介绍

    前面我们学习了如何使用Mybatis实现简单的增删改查。今天我们来学习如何使用动态语句来根据不同的条件生成不同的SQL语句。这在实际开发中非常有用,因为通常查询条件是多样化的,需要根据实际情况来拼接SQL语句,那什么是MyBatis动态语句呢,看下面详细简介 MyBatis动态语

    2024年02月11日
    浏览(46)
  • 【java爬虫】使用selenium通过加载cookie的方式跳过登录

    前言 相信很多人在使用selenium的时候都有一个困惑,就是每一次打开的浏览器实例都是不带cookie的,当有一些页面需要登录操作的时候可能就会比较麻烦,每次都需要手动登录。 其实会造成这个问题的原因是每次打开的浏览器都不会加载本地的cookie,相当于环境被隔离了。

    2024年04月12日
    浏览(43)
  • 基于 FFlogs API 快速实现的 logs 颜色查询小爬虫

    首先试了一下爬虫,发现和wow一样官网上有暴露的 API,链接在:FFlogs v1 API 文档链接 通过查询官方提供的 API 接口得知: 通过调用上面的接口,获得的数据解析进 json 文件,得到一个对象列表,这些数据就可以作为原始数据导入你的小工具了~ 其中一个对象代表了一个职业在

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包