sina.class.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. /**
  3. * @author:王刚涛
  4. * 用于获取 当天的股票数据并存入数据库,通过$url,可以设置需要获取的时间段
  5. */
  6. error_reporting(E_ALL & ~E_NOTICE);
  7. class Sina
  8. {
  9. /****
  10. * @param $url
  11. * @return array|bool|string
  12. * 对curl_setopt进行封装,消除代码冗余
  13. */
  14. static private function curl_get_data($url){
  15. $curlHandle = curl_init();
  16. curl_setopt($curlHandle, CURLOPT_URL, $url);
  17. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  18. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  19. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  20. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  21. $content = curl_exec($curlHandle);
  22. curl_close($curlHandle);//防止中文乱码
  23. $content2 = iconv("gbk", "utf-8", $content);//子串
  24. $content3 = substr($content2, stripos($content2, "=\"") + 2); //获取 var hq_str_sz000002="万 科A,30.780,30.800,30.510, ="之后部分
  25. $content4 = substr($content3, 0, strripos($content3, "\";")); //获取 万 科A,30.94,0.14,0.45,584039,178827"; ";之前部分
  26. $content5 = explode(",", $content4);//分割
  27. return $content5;
  28. }
  29. /****
  30. * @param $url
  31. * @return array|bool|string
  32. * 对curl_setopt进行封装,消除代码冗余
  33. */
  34. static private function curl_get_data_list($url, $codeList){ //一次批量获取股票列表
  35. if (empty($codeList)) {
  36. return 0;
  37. }
  38. $curlHandle = curl_init();
  39. curl_setopt($curlHandle, CURLOPT_URL, $url);
  40. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  41. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  42. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  43. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  44. $content = curl_exec($curlHandle);
  45. curl_close($curlHandle);//防止中文乱码
  46. $content2 = iconv("gbk", "utf-8", $content);//子串
  47. $arr1 = explode(";", $content2);//按股票分割
  48. $arr2 = array();
  49. $index = 0;
  50. $codeIndex = 0;
  51. foreach ($arr1 as $key => $item) {
  52. $tempItem = substr($item, stripos($item, "=\"") + 2); //获取 var hq_str_sz000002="万 科A,30.780,30.800,30.510, ="之后部分
  53. $tempItem = substr($tempItem, 0, strripos($tempItem, "\"")); //获取 万 科A,30.94,0.14,0.45,584039,178827"; ";之前部分
  54. $tempItem = trim($tempItem);
  55. if (!empty($tempItem)) {
  56. $arr2[$index] = explode(",", $tempItem);//分割
  57. $arr2[$index]['code'] = $codeList[$codeIndex];
  58. $index++;
  59. }
  60. $codeIndex++;
  61. }
  62. return $arr2;
  63. }
  64. //获取全部股票代码和名称列表
  65. static public function getStockCodeAndNameList($exchange, $sector, $start, $end)
  66. {
  67. $url = "http://hq.sinajs.cn/list=";
  68. $data['exchange'] = $exchange;
  69. $data['sector'] = $sector;
  70. $codeList = array();
  71. $codeIndex = 0;
  72. for($code = $start;$code <= $end; $code++){
  73. $codeStr = sprintf('%06s', $code);
  74. $url .= 's_'.$exchange.$codeStr.',';
  75. $codeList[$codeIndex] = $codeStr;
  76. $codeIndex++;
  77. }
  78. $contentList = self::curl_get_data_list($url, $codeList);
  79. foreach ($contentList as $key => $item) {
  80. $data['code'] = $item['code'];
  81. $data['name'] = trim($item[0]);
  82. if (!empty($item[0])) { //判断非法股票代码
  83. Stock::updateCodeAndName($data);
  84. }
  85. }
  86. return;
  87. }
  88. /****
  89. * @param $code
  90. * @return string
  91. * 判断股票的类型,属于创业板,科创板,主板,$code
  92. */
  93. static public function get_boniu_block($code)
  94. {
  95. if (strncmp($code, "30", 2) == 0) {
  96. //创业板
  97. $code= "sz". $code;
  98. } else if (strncmp($code, "68", 2) == 0) {
  99. //科创板
  100. $code= "sh" .$code;
  101. } else if (strncmp($code, "60", 2) == 0) {
  102. //主板
  103. $code = "sh".$code;
  104. } else if (strncmp($code, "00", 2) == 0) {
  105. //中小板
  106. $code= "sz".$code;
  107. }
  108. return $code;
  109. }
  110. /****
  111. * @param string $code
  112. * @return mixed
  113. //上证指数表(boniu_index_sh)
  114. */
  115. static public function get_boniu_index_sh($code="000001")
  116. {
  117. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  118. $content3=sina::curl_get_data($url);
  119. $data['increase_value'] = floatval($content3[3]);//涨跌率
  120. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  121. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  122. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  123. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  124. $data['open_price'] = floatval($data2[1]);//开盘价
  125. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  126. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  127. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  128. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  129. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  130. return Index_sh::add($data);
  131. }
  132. /****
  133. * @param string $code
  134. * @return mixed
  135. * 深成指数表(boniu_index_scz)
  136. */
  137. static public function get_boniu_index_scz($code="399001")
  138. {
  139. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  140. $content3=sina::curl_get_data($url);
  141. $data['increase_value'] = floatval($content3[3]);//涨跌率
  142. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  143. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  144. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  145. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  146. $data['open_price'] = floatval($data2[1]);//开盘价
  147. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  148. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  149. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  150. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  151. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  152. return Index_scz::add($data);
  153. }
  154. /***
  155. * @param string $code
  156. * @return mixed
  157. * 上证50指数表(boniu_index_sh50) 000016
  158. */
  159. static public function get_boniu_index_sh50($code="000016")
  160. {
  161. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  162. $content3=sina::curl_get_data($url);
  163. $data['increase_value'] = floatval($content3[3]);//涨跌率
  164. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  165. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  166. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  167. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  168. $data['open_price'] = floatval($data2[1]);//开盘价
  169. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  170. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  171. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  172. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  173. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  174. return Index_sh50::add($data);
  175. }
  176. /***
  177. * @param string $code
  178. * @return mixed
  179. * //沪深300指数表(boniu_index_csi300) 399300
  180. */
  181. static public function get_boniu_index_csi300($code="399300")
  182. {
  183. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  184. $content3=sina::curl_get_data($url);
  185. $data['increase_value'] = floatval($content3[3]);//涨跌率
  186. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  187. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  188. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  189. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  190. $data['open_price'] = floatval($data2[1]);//开盘价
  191. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  192. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  193. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  194. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  195. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  196. return Index_csi300::add($data);
  197. }
  198. //
  199. /***
  200. * @param string $code
  201. * @return mixed
  202. * 创业板指数表(boniu_index_gem) 399006
  203. */
  204. static public function get_boniu_index_gem($code="399006")
  205. {
  206. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  207. $content3=sina::curl_get_data($url);
  208. $data['increase_value'] = floatval($content3[3]);//涨跌率
  209. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  210. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  211. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  212. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  213. $data['open_price'] = floatval($data2[1]);//开盘价
  214. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  215. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  216. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  217. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  218. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  219. return Index_gem::add($data);
  220. }
  221. /****
  222. * @param string $code
  223. * @return mixed
  224. * //科创50指数( boniu_index_kc50) 000688
  225. */
  226. static public function get_boniu_index_kc50($code="000688")
  227. {
  228. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  229. $content3=sina::curl_get_data($url);
  230. $data['increase_value'] = floatval($content3[3]);//涨跌率
  231. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  232. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  233. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  234. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  235. $data['open_price'] = floatval($data2[1]);//开盘价
  236. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  237. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  238. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  239. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  240. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  241. return Index_kc50::add($data);
  242. }
  243. //
  244. /***
  245. * @param $code
  246. * @param $date
  247. * 根据股票代码获取股票的实时信息
  248. */
  249. static public function get_info_code($code){
  250. $stock_code= self::get_boniu_block($code);
  251. $url = "http://hq.sinajs.cn/list=" . $stock_code;
  252. $content3=sina::curl_get_data($url);//封装为函数,执行url获取结果并解析
  253. return $content3;
  254. }
  255. /***
  256. * @param $code
  257. * @param $date
  258. * @return mixed
  259. * 日k线表 day_k_******(每月存一张表,比如boniu_day_k_202011)
  260. * 抓取当天的数据,结合163的接口
  261. *
  262. */
  263. static public function get_day_k_base($code, $date)
  264. {
  265. $stock_code= self::get_boniu_block($code);
  266. $url = "http://hq.sinajs.cn/list=" . $stock_code;
  267. $content3=sina::curl_get_data($url);//封装为函数,
  268. if (empty($content3))
  269. {
  270. throw new Exception('抓取的数据不能为空', 102);
  271. }
  272. $data['date'] = $content3[30];
  273. $data['code'] = $code;//股票代码此时去掉sh,sz
  274. $data['name'] = $content3[0];
  275. $data['open_price'] = floatval($content3[1]);//开盘价
  276. $data['close_price'] = floatval($content3[3]);//3点之后的当前价格就是收盘价
  277. $data['hightest_price'] = floatval($content3[4]);//今日最高价
  278. $data['lowest_price'] = floatval($content3[5]);//今日最低价
  279. $data['amount'] = floatval($content3[8]);//成交的股票数,以百为单位
  280. $data['value'] = floatval($content3[9]);//成交金额以万为单位
  281. //调用网易接口获取其他字段
  282. $data163=Finance163::get_day_k_data($code);
  283. $data['close_price_qfq'] = floatval($data163["close_price_qfq"]);//成交金额以万为单位
  284. $data['increase_price'] = floatval($data163["increase_price"]);//成交金额以万为单位
  285. $data['increase_value'] = floatval($data163["increase_value"]);//成交金额以万为单位
  286. $data['turnover'] = floatval($data163["turnover"]);//成交金额以万为单位
  287. return Day_k_base::add($data, $date);
  288. }
  289. //除权除息表(boniu_xrxd_log)
  290. //st记录表(boniu_st_log)
  291. }
  292. ?>