aizhan.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. require_once('vendor/autoload.php');
  3. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  4. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  5. $word = $_GET['t'];
  6. $js = new JS();
  7. $header = [[
  8. '关键词',
  9. 'PC',
  10. '移动'
  11. ]];
  12. $html = $js->getPage($word);
  13. $ql = (new QL\QueryList)->html($html);
  14. $table = $ql->find('table');
  15. // 采集表头
  16. $tableHeader = $table->find('tr:eq(0)')->find('td')->texts();
  17. // 采集表的每行内容
  18. $tableRows = $table->find('tr:gt(0)')->map(function ($row) {
  19. return $row->find('td')->texts()->all();
  20. });
  21. //print_r($tableHeader->all());
  22. $data = $tableRows->all();
  23. $rt = $ql->find('.pager li');
  24. $pages = $rt->count();
  25. for ($page = 2; $page <= $pages; $page++) {
  26. $_data = $js->getPage($word, $page);
  27. $_ql = (new QL\QueryList)->html($html);
  28. $table = $_ql->find('table');
  29. // 采集表的每行内容
  30. $tableRows = $table->find('tr:gt(0)')->map(function ($row) {
  31. return $row->find('td')->texts()->all();
  32. });
  33. $_data = $tableRows->all();
  34. if ($_data) {
  35. $data = array_merge($data, $_data);
  36. }
  37. }
  38. $new_data = array_map(function ($a) {
  39. $pat = "#\d+#";
  40. preg_match_all($pat, $a[2], $arr);
  41. return [
  42. 'title' => $a[1],
  43. 'pc' => $arr[0][0],
  44. 'mobile' => $arr[0][1],
  45. ];
  46. }, $data);
  47. $data=array_merge($header,$new_data);
  48. $spreadsheet = new Spreadsheet();
  49. try {
  50. $title="关键词挖掘-" . $word;
  51. $sheet = $spreadsheet->getActiveSheet();
  52. $sheet->setTitle($title);
  53. $sheet->fromArray($data);
  54. $writer = new Xlsx($spreadsheet);
  55. header("Pragma: public");
  56. header("Expires: 0");
  57. header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
  58. header("Content-Type:application/force-download");
  59. header("Content-Type:application/vnd.ms-execl");
  60. header("Content-Type:application/octet-stream");
  61. header("Content-Type:application/download");
  62. header('Content-Disposition:attachment;filename="'.$title.'.xlsx"');
  63. header("Content-Transfer-Encoding:binary");
  64. $writer->save('php://output');
  65. $spreadsheet->disconnectWorksheets();
  66. } catch (\PhpOffice\PhpSpreadsheet\Exception $e) {
  67. }
  68. class JS
  69. {
  70. private $cookie_file = "/www/cookie_wyt.txt";
  71. public function getPage($word, $page = 1)
  72. {
  73. $word = $this->encode($word);
  74. $curl = curl_init();
  75. if ($page == 1) {
  76. $url = "https://ci.aizhan.com/" . $word . "/";
  77. } else {
  78. $url = "https://ci.aizhan.com/" . $word . "/" . $page;
  79. }
  80. curl_setopt_array($curl, array(
  81. CURLOPT_URL => $url,
  82. CURLOPT_RETURNTRANSFER => true,
  83. CURLOPT_ENCODING => "",
  84. CURLOPT_MAXREDIRS => 10,
  85. CURLOPT_TIMEOUT => 0,
  86. CURLOPT_FOLLOWLOCATION => true,
  87. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  88. CURLOPT_CUSTOMREQUEST => "GET",
  89. CURLOPT_HTTPHEADER => array(
  90. "Connection: keep-alive",
  91. "Pragma: no-cache",
  92. "Cache-Control: no-cache",
  93. "Upgrade-Insecure-Requests: 1",
  94. "DNT: 1",
  95. "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36",
  96. "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
  97. "Sec-Fetch-Site: same-origin",
  98. "Sec-Fetch-Mode: navigate",
  99. "Sec-Fetch-User: ?1",
  100. "Sec-Fetch-Dest: document",
  101. "Referer: https://ci.aizhan.com/",
  102. "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8",
  103. "Cookie: _csrf=07a32f1f032d03f1d744d53696ae7add08ec7d0fe08202093af6bd0183354165a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22meXqZAnQyb4P9Tp2mYSl8zuGXy-6uMbT%22%3B%7D; Hm_lvt_b37205f3f69d03924c5447d020c09192=1603156102; allWords=%E6%B8%B8%E6%88%8F%E4%B8%8B%E8%BD%BD%7C%E6%B5%8B%E8%AF%95%2C0; userId=19553; userName=readulikebook%40gmail.com; userGroup=1; userSecure=KsG0JKVlwgoH%2FrokCFL8oKkXf3YhJSs5DuMHwIGUJ%2FTJBhOUP18zEkv9o60j6UW8s4Nz4IALGxr%2FDrMStuTq5dKPifo%3D; Hm_lpvt_b37205f3f69d03924c5447d020c09192=1603458033"
  104. ),
  105. ));
  106. curl_setopt($curl, CURLOPT_COOKIEJAR, $this->cookie_file); //连接结束后保存cookie信息的文件。
  107. curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  108. $response = curl_exec($curl);
  109. curl_close($curl);
  110. return $response;
  111. }
  112. /**
  113. * 将字符串转换为ascii码
  114. * @param string $c 要编码的字符串
  115. * @param string $prefix 前缀,默认:&#
  116. * @return string
  117. */
  118. public function encode($c, $prefix = "&#")
  119. {
  120. $len = strlen($c);
  121. $a = 0;
  122. $scill = '';
  123. while ($a < $len) {
  124. $ud = 0;
  125. if (ord($c{$a}) >= 0 && ord($c{$a}) <= 127) {
  126. $ud = ord($c{$a});
  127. $a += 1;
  128. } else if (ord($c{$a}) >= 192 && ord($c{$a}) <= 223) {
  129. $ud = (ord($c{$a}) - 192) * 64 + (ord($c{$a + 1}) - 128);
  130. $a += 2;
  131. } else if (ord($c{$a}) >= 224 && ord($c{$a}) <= 239) {
  132. $ud = (ord($c{$a}) - 224) * 4096 + (ord($c{$a + 1}) - 128) * 64 + (ord($c{$a + 2}) - 128);
  133. $a += 3;
  134. } else if (ord($c{$a}) >= 240 && ord($c{$a}) <= 247) {
  135. $ud = (ord($c{$a}) - 240) * 262144 + (ord($c{$a + 1}) - 128) * 4096 + (ord($c{$a + 2}) - 128) * 64 + (ord($c{$a + 3}) - 128);
  136. $a += 4;
  137. } else if (ord($c{$a}) >= 248 && ord($c{$a}) <= 251) {
  138. $ud = (ord($c{$a}) - 248) * 16777216 + (ord($c{$a + 1}) - 128) * 262144 + (ord($c{$a + 2}) - 128) * 4096 + (ord($c{$a + 3}) - 128) * 64 + (ord($c{$a + 4}) - 128);
  139. $a += 5;
  140. } else if (ord($c{$a}) >= 252 && ord($c{$a}) <= 253) {
  141. $ud = (ord($c{$a}) - 252) * 1073741824 + (ord($c{$a + 1}) - 128) * 16777216 + (ord($c{$a + 2}) - 128) * 262144 + (ord($c{$a + 3}) - 128) * 4096 + (ord($c{$a + 4}) - 128) * 64 + (ord($c{$a + 5}) - 128);
  142. $a += 6;
  143. } else if (ord($c{$a}) >= 254 && ord($c{$a}) <= 255) { //error
  144. $ud = false;
  145. }
  146. $scill .= dechex($ud);
  147. }
  148. return $scill;
  149. }
  150. }