input_sina_day_k.class.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. class Input_sina
  3. {
  4. const INPUT_SINA_URL = "http://hq.sinajs.cn/list=";
  5. static public function add_day_k($code, $exchange)
  6. {
  7. $data = self::_parse_day_k_data($code, $exchange);
  8. return Day_k::add($data);
  9. }
  10. /***
  11. * @param $code
  12. * @param $date
  13. * @return mixed
  14. * 日k线表 day_k_******(每月存一张表,比如boniu_day_k_202011)
  15. * 抓取当天的数据,结合腾讯的接口,每4秒抓取一条数据
  16. *
  17. */
  18. static public function add_to_immediate_day_k($code, $exchange)
  19. {
  20. $data = self::_parse_day_k_data($code, $exchange);
  21. return Immediate_base::add($data);
  22. }
  23. private static function _parse_day_k_data($code, $exchange)
  24. {
  25. $stock_code = $exchange . $code;
  26. $url = self::INPUT_SINA_URL . $stock_code;
  27. $content3 = self::_render_k_day_curl_data($url);
  28. if (empty($content3)) {
  29. throw new Exception('抓取的数据不能为空', 102);
  30. }
  31. $data['timestamp'] = time();
  32. $data['date'] = (int)date("Ymd", time());
  33. $data['code'] = $code;//股票代码此时去掉sh,sz
  34. $data['name'] = $content3[0];
  35. $data['open_price'] = floatval($content3[1]);//开盘价
  36. $data['close_price'] = floatval($content3[3]);//3点之后的当前价格就是收盘价
  37. $data['highest_price'] = floatval($content3[4]);//今日最高价
  38. $data['lowest_price'] = floatval($content3[5]);//今日最低价
  39. $data['amount'] = floatval($content3[8]);//成交的股票数,以百为单位
  40. $data['value'] = floatval($content3[9]);//成交金额以万为单位
  41. $dataContent = self::_get_tecent_stock_data($code, $exchange);
  42. $data["increase_price"] = empty($content1["increase_price"]) ? 0 : $content1["increase_price"]; // 涨跌价
  43. $data["increase_ratio"] = empty($content1["increase_ratio"]) ? 0 : $content1["increase_ratio"];// 涨跌幅
  44. $data["turnover"] = empty($content1["turnover"]) ? 0 : $content1["turnover"];// 换手率
  45. $data["pe_ttm"] = empty($dataContent["pe_ttm"]) ? 0 : $dataContent["pe_ttm"];//pe_ttm市盈率
  46. $data["tradable_value"] = empty($dataContent["tradable_value"]) ? 0 : (int)($dataContent["tradable_value"] * 100000000);//流通市值
  47. $data["total_value"] = empty($dataContent["total_value"]) ? 0 : (int)($dataContent["total_value"] * 100000000);//总市值
  48. $data["pb"] = empty($dataContent["pb"]) ? 0 : $dataContent["pb"];//市净率
  49. $data["pe_dynamic"] = empty($dataContent["pe_dynamic"]) ? 0 : $dataContent["pe_dynamic"]; //动态市盈率
  50. $data["pe_static"] = empty($dataContent["pe_static"]) ? 0 : $dataContent["pe_static"];//静态市盈率
  51. return $data;
  52. }
  53. static private function _render_k_day_curl_data($url)
  54. {
  55. $content = self::curl_exec($url);
  56. $content2 = iconv("gbk", "utf-8", $content);//子串
  57. $content3 = substr($content2, stripos($content2, "=\"") + 2); //获取 var hq_str_sz000002="万 科A,30.780,30.800,30.510, ="之后部分
  58. $content4 = substr($content3, 0, strripos($content3, "\";")); //获取 万 科A,30.94,0.14,0.45,584039,178827"; ";之前部分
  59. $content5 = explode(",", $content4);//分割
  60. return $content5;
  61. }
  62. private static function _get_tecent_stock_data($code, $exchange)
  63. {
  64. $dataContent = Input_tencent_day_k::get_stock_data($code, $exchange);
  65. if (!empty($dataContent)) {
  66. return $dataContent;
  67. } else {
  68. return [];
  69. }
  70. }
  71. /****
  72. * @param $url
  73. * @return array|bool|string
  74. * 对curl_setopt进行封装,消除代码冗余
  75. */
  76. static private function curl_exec($url)
  77. {
  78. $curlHandle = curl_init();
  79. curl_setopt($curlHandle, CURLOPT_URL, $url);
  80. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  81. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  82. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  83. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  84. $content = curl_exec($curlHandle);
  85. curl_close($curlHandle);//防止中文乱码
  86. return $content;
  87. }
  88. }