想看看各家上市公司的研发费用,所以去东方财富里面抓取数据。

1抓取准备工作

1首先找到研发费用的数据的key名字
2找去找到是如何访问得到这些数据
查看源代码

得到研发费用的名字是RDEXP,再去看是访问了什么url获取了资源的
从名字看就知道是通过ajax获取数据的,所以我们进去看ajax返回数据有没有复合要求的,找到了
http://f10.eastmoney.com/NewFinanceAnalysis/lrbAjax?companyType=4&reportDateType=0&reportType=1&endDate=&code=SH603893
从参数看code就是上市公司的代码,其他的参数,没关注。
返回的数据是一个json字符串,大家自己发掘。
从哪里获取上市公司的code呢?
同花顺有数据导出excel功能,可以把代码、市盈率、市值等指标导出,这样我们就有了所有的代码了。
2抓取数据代码
//由于同花顺导出来的xls,一直解析不了,不知道哪里有问题,所以我自己重新创建了一个xls,把同花顺的内容拷贝过去

package com.xreport2_demo;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import org.apache.commons.collections4.Put;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.matrix.ssm.service.impl.UserServiceImpl;//http://f10.eastmoney.com/NewFinanceAnalysis/lrbAjax?companyType=4&reportDateType=0&reportType=1&endDate=&code=SH603893public class HttpClientDemo {private static Logger logger = Logger.getLogger(HttpClientDemo.class);private static String columns[] = {"空白","代码",  "名称","所属行业","TTM市盈率","净利润","市净率","总市值","流通市值"};private static String columnsNew[] = {"空白    ","代码",  "名称","所属行业","TTM市盈率","净利润","市净率","总市值","流通市值","研发费用","研发日期","研发费用与总市值比"};
//  private static String columns[] = {"代码"};public static void main(String[] args) throws Exception {//由于同花顺导出来的xls,一直解析不了,不知道哪里有问题,所以我自己重新创建了一个xls,把同花顺的内容拷贝过去//解析出excel中的数据List<Map<String, String>> list = readExcel("D://data//1.xls", columns);
//      int i=0;for(Map map : list){
//          if(i>=10){
//              break;
//          }
//          i++;//怕东方财富一下给我拉黑Thread.sleep((int)Math.random()*1000);//获取研发费用与研发日期,因为年报有的公司没有出getCostResarch(map);}//将list的值写入到新的excelexportExcel(list,"D://data//研发费用.xls");}/*** 传入单元格中的* @param map* @return*/public static void getCostResarch(Map<String,String> map){//获取urlString companyCode =  map.get("代码");String surl = "http://f10.eastmoney.com/NewFinanceAnalysis/lrbAjax?companyType=4&reportDateType=0&reportType=1&endDate=&code="+companyCode;BufferedReader br = null;try {URL url = new URL(surl);//下载数据InputStream is = url.openStream();br = new BufferedReader(new InputStreamReader(is,"utf-8"));String msg = null;while (null != (msg = br.readLine())){String tmp = StringEscapeUtils.unescapeJavaScript(msg);tmp = tmp.substring(1,tmp.length()-1);logger.info(msg);List<Map<String,String>> listObjectFir = (List<Map<String,String>>) JSONArray.parse(tmp);for(Map<String,String> data : listObjectFir){if(("2019/12/31 0:00:00").equals(data.get("REPORTDATE"))){map.put("RDEXP", data.get("RDEXP"));map.put("REPORTDATE", data.get("REPORTDATE"));}//3月份的数据在前面,用年报数据覆盖3月份数据if(("2020/3/31 0:00:00").equals(data.get("REPORTDATE"))){map.put("RDEXP", data.get("RDEXP"));map.put("REPORTDATE", data.get("REPORTDATE"));}}}} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 读取excel* @param filePath* @param columns* @return*/public static List<Map<String, String>> readExcel(String filePath,String columns[]) {Sheet sheet = null;Row row = null;Row rowHeader = null;List<Map<String, String>> list = null;String cellData = null;Workbook wb = null;if (filePath == null) {return null;}String extString = filePath.substring(filePath.lastIndexOf("."));InputStream is = null;try {is = new FileInputStream(filePath);if (".xls".equals(extString)) {wb = new HSSFWorkbook(is);} else if (".xlsx".equals(extString)) {wb = new XSSFWorkbook(is);} else {wb = null;}if (wb != null) {// 用来存放表中数据list = new ArrayList<Map<String, String>>();// 获取第一个sheetsheet = wb.getSheetAt(0);// 获取最大行数int rownum = sheet.getPhysicalNumberOfRows();// 获取第一行rowHeader = sheet.getRow(0);row = sheet.getRow(0);// 获取最大列数int colnum = row.getPhysicalNumberOfCells();for (int i = 1; i < rownum; i++) {Map<String, String> map = new LinkedHashMap<String, String>();row = sheet.getRow(i);if (row != null) {for (int j = 0; j < colnum; j++) {if(columns[j].equals(getCellFormatValue(rowHeader.getCell(j)))){cellData = (String) getCellFormatValue(row.getCell(j));map.put(columns[j], cellData);}}} else {break;}list.add(map);}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return list;}/**  获取单个单元格数据* @param cell* @return* @author lizixiang ,2018-05-08*/private static String getCellFormatValue(Cell cell) {if(cell==null){return null;}String returnValue = null;switch (cell.getCellType()) {case NUMERIC:   //数字Double doubleValue = cell.getNumericCellValue();// 格式化科学计数法,取一位整数DecimalFormat df = new DecimalFormat("0");returnValue = df.format(doubleValue);break;case STRING:    //字符串returnValue = cell.getStringCellValue();break;case BOOLEAN:   //布尔Boolean booleanValue = cell.getBooleanCellValue();returnValue = booleanValue.toString();break;case BLANK:     // 空值break;case FORMULA:   // 公式returnValue = cell.getCellFormula();break;case ERROR:     // 故障break;default:break;}return returnValue;}// public static Object getCellFormatValue(Cell cell) {
//      Object cellValue = null;
//      if (cell != null) {
//          // 判断cell类型
//          switch (cell.getCellType()) {
//          case Cell.CELL_TYPE_NUMERIC: {
//              cellValue = String.valueOf(cell.getNumericCellValue());
//              break;
//          }
//          case Cell.CELL_TYPE_FORMULA: {
//              // 判断cell是否为日期格式
//              if (DateUtil.isCellDateFormatted(cell)) {
//                  // 转换为日期格式YYYY-mm-dd
//                  cellValue = cell.getDateCellValue();
//              } else {
//                  // 数字
//                  cellValue = String.valueOf(cell.getNumericCellValue());
//              }
//              break;
//          }
//          case Cell.CELL_TYPE_STRING: {
//              cellValue = cell.getRichStringCellValue().getString();
//              break;
//          }
//          default:
//              cellValue = "";
//          }
//      } else {
//          cellValue = "";
//      }
//      return cellValue;
//  }/*** 到处数据* @param list*/public static void exportExcel(List<Map<String, String>> list, String exportFilePath){// 写入数据到工作簿对象内Workbook workbook = exportData(list);// 以文件的形式输出工作簿对象FileOutputStream fileOut = null;try {File exportFile = new File(exportFilePath);if (!exportFile.exists()) {exportFile.createNewFile();}fileOut = new FileOutputStream(exportFilePath);workbook.write(fileOut);fileOut.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (null != fileOut) {fileOut.close();}if (null != workbook) {workbook.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 生成Excel并写入数据信息* * @param dataList*            数据列表* @return 写入数据后的工作簿对象*/public static Workbook exportData(List<Map<String, String>> dataList) {// 生成xlsx的Excel
//      Workbook workbook = new SXSSFWorkbook();// 如需生成xls的Excel,请使用下面的工作簿对象,注意后续输出时文件后缀名也需更改为xlsWorkbook workbook = new HSSFWorkbook();// 生成Sheet表,写入第一行的列头Sheet sheet = buildDataSheet(workbook);// 构建每行的数据内容int rowNum = 1;for (Map data :dataList) {if (data == null) {continue;}// 输出行数据Row row = sheet.createRow(rowNum++);convertDataToRow(data, row);}return workbook;}/*** 生成sheet表,并写入第一行数据(列头)* * @param workbook*            工作簿对象* @return 已经写入列头的Sheet*/private static Sheet buildDataSheet(Workbook workbook) {Sheet sheet = workbook.createSheet();// 设置列头宽度for (int i = 0; i < columnsNew.length; i++) {sheet.setColumnWidth(i, 4000);}// 设置默认行高sheet.setDefaultRowHeight((short) 400);// 构建头单元格样式CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());// 写入第一行各列的数据Row head = sheet.createRow(0);for (int i = 0; i < columnsNew.length; i++) {Cell cell = head.createCell(i);cell.setCellValue(columnsNew[i]);cell.setCellStyle(cellStyle);}return sheet;}/*** 设置第一行列头的样式* * @param workbook*            工作簿对象* @return 单元格样式对象*/private static CellStyle buildHeadCellStyle(Workbook workbook) {CellStyle style = workbook.createCellStyle();// 对齐方式设置style.setAlignment(HorizontalAlignment.CENTER);// 边框颜色和宽度设置style.setBorderBottom(BorderStyle.THIN);style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下边框style.setBorderLeft(BorderStyle.THIN);style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边框style.setBorderRight(BorderStyle.THIN);style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边框style.setBorderTop(BorderStyle.THIN);style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边框// 设置背景颜色style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 粗体字设置Font font = workbook.createFont();font.setBold(true);style.setFont(font);return style;}/*** 将数据转换成行* * @param data*            源数据* @param row*            行对象* @return*/private static void convertDataToRow(Map<String, String> data, Row row) {int cellNum = 0;Cell cell;// 空白cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("空白") ? "" : data.get("空白"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("代码") ? "" : data.get("代码"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("名称") ? "" : data.get("名称"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("所属行业") ? "" : data.get("所属行业"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("TTM市盈率") ? "" : data.get("TTM市盈率"));cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("市净率") ? "" : data.get("市净率"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("净利润") ? "" : data.get("净利润"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("总市值") ? "" : data.get("总市值"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("流通市值") ? "" : data.get("流通市值"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("RDEXP") ? "" : data.get("RDEXP"));// 代码cell = row.createCell(cellNum++);cell.setCellValue(null == data.get("REPORTDATE") ? "" : data.get("REPORTDATE"));// 代码cell = row.createCell(cellNum++);if(data.get("RDEXP")==null||"".equals(data.get("RDEXP"))){cell.setCellValue("0");}else{try {cell.setCellValue(Double.parseDouble(data.get("RDEXP"))/Double.parseDouble(data.get("总市值")));} catch (Exception e) {cell.setCellValue("出错");}}}
}
<dependencies><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.6.0</version></dependency><!-- <dependency> <groupId>com.bstek.ureport</groupId> <artifactId>ureport2-console</artifactId> <version>2.2.9</version> </dependency> --><!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.3</version></dependency><!-- https://mvnrepository.com/artifact/cn.bestwu/common-lang --><!-- <dependency> <groupId>cn.bestwu</groupId> <artifactId>common-lang</artifactId> <version>1.1.5</version> </dependency> --><!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><!-- <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency> --><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.61</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient --><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency>

结果

爬取东方财富的利润表数据记录相关推荐

  1. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  2. 爬虫实战 | 爬取东方财富网股票数据

    本文转载来自:公众号 志斌的python笔记 今天有个朋友说,他想做个关于股票的可视化网页,但是缺乏股票的数据,想让志斌帮他做个爬虫来每天获取数据.所以我将它写成一个实战案例,供大家一起参考学习! 1 ...

  3. 爬取东方财富网可转债数据并清洗

    2019年开始可转债进入了黄金时期,2020因为忙活毕业和读研的事一直没什么时间写一写东西,现在重新拿出来之前的代码梳理一下爬虫的思路. 1.确定爬取链接,修改http headers 确定爬取链接很 ...

  4. python项目实战:爬取东方财富热门股票数据

    前言 今天为大家分享一个用Python爬取股票的今开 成交量 ,最高, 涨停, 内盘 ,成交额 ,委比 ,流通市值市盈率MRQ ,每股收益总股本 ,昨收 ,换手率, 跌停等一系列信息,能够帮你更好的分 ...

  5. Python项目实战(三):爬取东方财富热门股票数据

    前言 今天为大家分享一个用Python爬取股票的今开 成交量 ,最高, 涨停, 内盘 ,成交额 ,委比 ,流通市值市盈率MRQ ,每股收益总股本 ,昨收 ,换手率, 跌停等一系列信息,能够帮你更好的分 ...

  6. 爬取东方财富网数据笔记

    小白是如何学习爬虫的?首先先从简单的入手,在b站上寻找爬虫视频,这里推荐Python爬虫编程基础5天速成(2021全新合集)Python入门+数据分析_哔哩哔哩_bilibili 有编程基础的仅需要观 ...

  7. 爬虫学习笔记(用python爬取东方财富网实验)

    参考文章以及视频:(11条消息) 爬虫实战 | 爬取东方财富网股票数据_简说Python的博客-CSDN博客.手把手教你从东方财富网上获取股票数据_哔哩哔哩_bilibili.[Python爬虫案例] ...

  8. 使用python爬取东方财富网机构调研数据

    最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...

  9. python培训机构调研最多的股票_使用python爬取东方财富网机构调研数据

    标签: 最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只 ...

  10. 用python爬取东方财富网网页信息_爬取东方财富网数据的网页分析

    自学Python已有3个月之多,浏览无数大神的佳作,收获颇丰.当初自学python就是为了学习爬虫,爬取网站上好看妹子的图片--[流口水][流口水] 言归正传,近期学习量化交易知识,发现东方财富网(e ...

最新文章

  1. 2020图灵年度好书大赏 | 15周年视频纪念版
  2. (0059)iOS开发之添加自定义字体库并设置文本字体
  3. 1.4 VC6.0在win7下安装的兼容性问题以及解决办法
  4. mysql数据库财务_MySQL数据库——从入门到删库跑路(二)
  5. mvc怎么套用html模板,ASP.NET MVC3模板页的使用(2)
  6. Elasticsearch环境搭建和介绍(Windows)
  7. 利用Linux命令行进行文本按行去重并按重复次数排序
  8. [转]ubuntu network is unreachable 解决记
  9. vue-awesome-swiper 的安装和使用
  10. python财经数据接口工具有哪些_Python财经数据接口包TuShare的使用
  11. 前端FISH框架学习笔记
  12. Appium下载安装教程及环境变量配置(安装教程)
  13. 927. 三等分(每日一难phase2--day26)
  14. 前端代码规范【结合实际和官方】
  15. python-机器学习的两种传统算法-knn,k-means
  16. 下面哪个不是python合法的变量名_下面哪个不是Python合法的标识符
  17. 【前端——Node.js】:身份认证
  18. H3C交换机的应用优势
  19. 能真正帮你实现沟通表达能力提升的书籍推荐:《沟通与说服必读12篇》
  20. 学java需要装jdk吗_JAVA基础之JDK安装

热门文章

  1. linux文件名乱码删除,linux下删除文件名乱码文件
  2. app逆向入门分析——破解某APP登陆请求参数
  3. 【机器学习】逻辑回归 LR 算法 整理
  4. win10无法启用shockwave flash object的解决
  5. 天线匹配与人体之间的关系
  6. php获取客户端IP和服务器端IP
  7. HashMap底层原理实现源码分析
  8. 转发表(MAC表)、ARP表、路由表总结
  9. 乐高机器人巡线C语言程序,乐高机器人巡线原理
  10. 机器人巡线算法优化方案