hintData.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. set_time_limit(0);
  3. /**
  4. * Created by PhpStorm.
  5. * User: chendeben
  6. * Date: 2019-01-16
  7. * Time: 17:06
  8. */
  9. require_once('vendor/autoload.php');
  10. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  11. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  12. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  13. use QL\QueryList;
  14. //$ql = QueryList::get('https://www.baidu.com/s?wd=QueryList');
  15. //$titles = $ql->find('h3>a')->texts(); //获取搜索结果标题列表
  16. //$links = $ql->find('h3>a')->attrs('href'); //获取搜索结果链接列表
  17. //print_r($titles);
  18. //print_r($links);
  19. //die();
  20. $times = 3;
  21. $wd = $_REQUEST['wd'];
  22. if (!$wd) {
  23. ?>
  24. <!DOCTYPE html>
  25. <html lang="zh-cn">
  26. <head>
  27. <meta charset="utf-8">
  28. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  29. <meta name="viewport" content="width=device-width, initial-scale=1">
  30. <!-- ZUI 标准版压缩后的 CSS 文件 -->
  31. <link rel="stylesheet" href="//cdn.bootcss.com/zui/1.8.1/css/zui.min.css">
  32. <!-- ZUI Javascript 依赖 jQuery -->
  33. <script src="//cdn.bootcss.com/zui/1.8.1/lib/jquery/jquery.js"></script>
  34. <!-- ZUI 标准版压缩后的 JavaScript 文件 -->
  35. <script src="//cdn.bootcss.com/zui/1.8.1/js/zui.min.js"></script>
  36. </head>
  37. <body>
  38. <br>
  39. <br>
  40. <br>
  41. <br>
  42. <form method="post" action="">
  43. <div class="container">
  44. <div class="row">
  45. <div class="col-md-9">
  46. <textarea style="height: 300px;" class="form-control" rows="3" placeholder="请输入关键词,一行一个"
  47. name="wd"></textarea>
  48. </div>
  49. </div>
  50. <br>
  51. <br>
  52. <div class="row">
  53. <div class="col-md-1">
  54. <span>爬取深度</span>
  55. </div>
  56. <div class="col-md-1 col-md-offset-2">
  57. <select class="form-control"
  58. name="deep">
  59. <option value="1">1</option>
  60. <option value="2">2</option>
  61. <option value="3">3</option>
  62. </select>
  63. </div>
  64. </div>
  65. <div class="row" style="margin-top: 5px;">
  66. <div class="col-md-2 col-md-offset-8">
  67. <input type="submit" class="btn btn-primary btn-lg" value="提交"/>
  68. </div>
  69. </div>
  70. </div>
  71. </form>
  72. </body>
  73. </html>
  74. <?php
  75. } else {
  76. error_reporting(0);
  77. $origin_str = [';', ';', ',', ',', ' ', "\r\n"];
  78. $des_str = [',', ',', ',', ',', ',', ','];
  79. $wd = str_replace($origin_str, $des_str, $wd);
  80. $keys = explode(",", $wd);
  81. $deep=$_REQUEST['deep']?:1;
  82. $result = $response = [];
  83. baidu($keys);
  84. // print_r($result);
  85. // die();
  86. $spreadsheet = new Spreadsheet();
  87. $sheet = $spreadsheet->getActiveSheet();
  88. $sheet->setTitle("为你推荐-相关搜索词");
  89. $row = 1;
  90. $sheet->setCellValue("A" . $row, "序号");
  91. $sheet->setCellValue("B" . $row, "关键词");
  92. $sheet->setCellValue("C" . $row, "相关搜索词");
  93. $row++;
  94. foreach ($result as $key => $item) {
  95. $sheet->setCellValue("A" . $row, $row - 1);
  96. $sheet->setCellValue("B" . $row, $item['key']);
  97. $sheet->setCellValue("C" . $row, $item['relatedWd']);
  98. $row++;
  99. }
  100. $styleArray = [
  101. 'alignment' => [
  102. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  103. 'vertical' => Alignment::VERTICAL_CENTER,
  104. ],
  105. ];
  106. $sheet->getColumnDimension("A")->setWidth(14);
  107. $sheet->getColumnDimension("B")->setWidth(25);
  108. $sheet->getColumnDimension("C")->setWidth(25);
  109. $sheet->getStyle("A1:C" . $row)->applyFromArray($styleArray);
  110. $writer = new Xlsx($spreadsheet);
  111. header("Pragma: public");
  112. header("Expires: 0");
  113. header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
  114. header("Content-Type:application/force-download");
  115. header("Content-Type:application/vnd.ms-execl");
  116. header("Content-Type:application/octet-stream");
  117. header("Content-Type:application/download");
  118. header('Content-Disposition:attachment;filename="为你推荐-相关搜索词.xlsx"');
  119. header("Content-Transfer-Encoding:binary");
  120. $writer->save('php://output');
  121. $spreadsheet->disconnectWorksheets();
  122. // echo "完成,总耗时".$second."秒";
  123. }
  124. function baidu($wds)
  125. {
  126. global $deep;
  127. for ($i = 0; $i < $deep; $i++) {
  128. if (!isset($_wds)) {
  129. $_wds = $wds;
  130. }
  131. $wds2 = [];
  132. foreach ($_wds as $wd) {
  133. $wds2 = array_merge($wds2, getRelatedKeywords($wd));
  134. }
  135. $_wds = $wds2;
  136. }
  137. }
  138. function getRelatedKeywords($wd)
  139. {
  140. global $response, $result;
  141. $searchUrl = "http://www.baidu.com/s?ie=UTF-8&rn=20&wd=%s";
  142. $url = sprintf($searchUrl, $wd);
  143. $rules = [
  144. 'json' => ['.c-tools', 'data-tools'],
  145. ];
  146. $ql = (new QL\QueryList)->get($url);
  147. $rt = $ql->rules($rules)->query()->getData();
  148. $rt = json_decode(json_encode($rt), true);
  149. $wds = [];
  150. foreach ($rt as $item) {
  151. $json = json_decode($item['json'], true);
  152. $baiduUrl = substr($json['url'], 30);
  153. if ($baiduUrl) {
  154. $_url = "https://sp2.baidu.com/8LUYsjW91Qh3otqbppnN2DJv/link?url=%s&query=%s&cb=jQuery110206243498231922682_1558178381142&data_name=recommend_common_merger_online&format=json&t=%s";
  155. $_url = sprintf($_url, $baiduUrl, $wd, time() . "000");
  156. $data = @file_get_contents($_url);
  157. $pat = "#1558178381142\((.*)\)#";
  158. preg_match($pat, $data, $arr);
  159. $data = json_decode($arr[1], true);
  160. if ($data['data'][0]['hintData']) {
  161. foreach ($data['data'][0]['hintData'] as $hintDatum) {
  162. if ($response[md5($item['wd'])]) {
  163. continue;
  164. }
  165. foreach ($hintDatum['linkInfo'] as $item) {
  166. $response[md5($item['wd'])] = $item['wd'];
  167. $result[] = ['key' => $wd, 'relatedWd' => $item['wd']];
  168. $wds[] = $item['wd'];
  169. }
  170. foreach ($hintDatum['linkInfo2'] as $item) {
  171. $response[md5($item['wd'])] = $item['wd'];
  172. $result[] = ['key' => $wd, 'relatedWd' => $item['wd']];
  173. $wds[] = $item['wd'];
  174. }
  175. }
  176. }
  177. // print_r($data);die();
  178. }
  179. }
  180. return $wds;
  181. }