|
@@ -0,0 +1,164 @@
|
|
|
|
|
+<?php
|
|
|
|
|
+require_once('vendor/autoload.php');
|
|
|
|
|
+
|
|
|
|
|
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
|
|
|
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
|
|
|
+
|
|
|
|
|
+$word = $_GET['t'];
|
|
|
|
|
+$js = new JS();
|
|
|
|
|
+$header = [[
|
|
|
|
|
+ '关键词',
|
|
|
|
|
+ 'PC',
|
|
|
|
|
+ '移动'
|
|
|
|
|
+]];
|
|
|
|
|
+$html = $js->getPage($word);
|
|
|
|
|
+$ql = (new QL\QueryList)->html($html);
|
|
|
|
|
+$table = $ql->find('table');
|
|
|
|
|
+
|
|
|
|
|
+// 采集表头
|
|
|
|
|
+$tableHeader = $table->find('tr:eq(0)')->find('td')->texts();
|
|
|
|
|
+// 采集表的每行内容
|
|
|
|
|
+$tableRows = $table->find('tr:gt(0)')->map(function ($row) {
|
|
|
|
|
+ return $row->find('td')->texts()->all();
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+//print_r($tableHeader->all());
|
|
|
|
|
+$data = $tableRows->all();
|
|
|
|
|
+$rt = $ql->find('.pager li');
|
|
|
|
|
+$pages = $rt->count();
|
|
|
|
|
+for ($page = 2; $page <= $pages; $page++) {
|
|
|
|
|
+ $_data = $js->getPage($word, $page);
|
|
|
|
|
+ $_ql = (new QL\QueryList)->html($html);
|
|
|
|
|
+ $table = $_ql->find('table');
|
|
|
|
|
+// 采集表的每行内容
|
|
|
|
|
+ $tableRows = $table->find('tr:gt(0)')->map(function ($row) {
|
|
|
|
|
+ return $row->find('td')->texts()->all();
|
|
|
|
|
+ });
|
|
|
|
|
+ $_data = $tableRows->all();
|
|
|
|
|
+ if ($_data) {
|
|
|
|
|
+ $data = array_merge($data, $_data);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+$new_data = array_map(function ($a) {
|
|
|
|
|
+ $pat = "#\d+#";
|
|
|
|
|
+ preg_match_all($pat, $a[2], $arr);
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'title' => $a[1],
|
|
|
|
|
+ 'pc' => $arr[0][0],
|
|
|
|
|
+ 'mobile' => $arr[0][1],
|
|
|
|
|
+ ];
|
|
|
|
|
+}, $data);
|
|
|
|
|
+$data=array_merge($header,$new_data);
|
|
|
|
|
+
|
|
|
|
|
+$spreadsheet = new Spreadsheet();
|
|
|
|
|
+try {
|
|
|
|
|
+ $title="关键词挖掘-" . $word;
|
|
|
|
|
+ $sheet = $spreadsheet->getActiveSheet();
|
|
|
|
|
+ $sheet->setTitle($title);
|
|
|
|
|
+ $sheet->fromArray($data);
|
|
|
|
|
+ $writer = new Xlsx($spreadsheet);
|
|
|
|
|
+ header("Pragma: public");
|
|
|
|
|
+ header("Expires: 0");
|
|
|
|
|
+ header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
|
|
|
|
|
+ header("Content-Type:application/force-download");
|
|
|
|
|
+ header("Content-Type:application/vnd.ms-execl");
|
|
|
|
|
+ header("Content-Type:application/octet-stream");
|
|
|
|
|
+ header("Content-Type:application/download");
|
|
|
|
|
+ header('Content-Disposition:attachment;filename="'.$title.'.xlsx"');
|
|
|
|
|
+ header("Content-Transfer-Encoding:binary");
|
|
|
|
|
+ $writer->save('php://output');
|
|
|
|
|
+ $spreadsheet->disconnectWorksheets();
|
|
|
|
|
+} catch (\PhpOffice\PhpSpreadsheet\Exception $e) {
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class JS
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+ private $cookie_file = "/www/cookie_wyt.txt";
|
|
|
|
|
+
|
|
|
|
|
+ public function getPage($word, $page = 1)
|
|
|
|
|
+ {
|
|
|
|
|
+ $word = $this->encode($word);
|
|
|
|
|
+ $curl = curl_init();
|
|
|
|
|
+ if ($page == 1) {
|
|
|
|
|
+ $url = "https://ci.aizhan.com/" . $word . "/";
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $url = "https://ci.aizhan.com/" . $word . "/" . $page;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ curl_setopt_array($curl, array(
|
|
|
|
|
+ CURLOPT_URL => $url,
|
|
|
|
|
+ CURLOPT_RETURNTRANSFER => true,
|
|
|
|
|
+ CURLOPT_ENCODING => "",
|
|
|
|
|
+ CURLOPT_MAXREDIRS => 10,
|
|
|
|
|
+ CURLOPT_TIMEOUT => 0,
|
|
|
|
|
+ CURLOPT_FOLLOWLOCATION => true,
|
|
|
|
|
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
|
|
|
|
+ CURLOPT_CUSTOMREQUEST => "GET",
|
|
|
|
|
+ CURLOPT_HTTPHEADER => array(
|
|
|
|
|
+ "Connection: keep-alive",
|
|
|
|
|
+ "Pragma: no-cache",
|
|
|
|
|
+ "Cache-Control: no-cache",
|
|
|
|
|
+ "Upgrade-Insecure-Requests: 1",
|
|
|
|
|
+ "DNT: 1",
|
|
|
|
|
+ "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",
|
|
|
|
|
+ "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",
|
|
|
|
|
+ "Sec-Fetch-Site: same-origin",
|
|
|
|
|
+ "Sec-Fetch-Mode: navigate",
|
|
|
|
|
+ "Sec-Fetch-User: ?1",
|
|
|
|
|
+ "Sec-Fetch-Dest: document",
|
|
|
|
|
+ "Referer: https://ci.aizhan.com/",
|
|
|
|
|
+ "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8",
|
|
|
|
|
+ "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%B5%8B%E8%AF%95%2C0; userId=508549; userName=824711626%40qq.com; userGroup=1; userSecure=6LJjF3kwjMXxZsIW%2BWciJlC40ros0bUvHZJE5v9IJRUsJoIQoJh1JD177E1B3fHCTMdQsv4I1vRADQgf; Hm_lpvt_b37205f3f69d03924c5447d020c09192=1603180587"
|
|
|
|
|
+ ),
|
|
|
|
|
+
|
|
|
|
|
+ ));
|
|
|
|
|
+ curl_setopt($curl, CURLOPT_COOKIEJAR, $this->cookie_file); //连接结束后保存cookie信息的文件。
|
|
|
|
|
+ curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
|
|
|
|
|
+
|
|
|
|
|
+ $response = curl_exec($curl);
|
|
|
|
|
+
|
|
|
|
|
+ curl_close($curl);
|
|
|
|
|
+ return $response;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 将字符串转换为ascii码
|
|
|
|
|
+ * @param string $c 要编码的字符串
|
|
|
|
|
+ * @param string $prefix 前缀,默认:&#
|
|
|
|
|
+ * @return string
|
|
|
|
|
+ */
|
|
|
|
|
+ public function encode($c, $prefix = "&#")
|
|
|
|
|
+ {
|
|
|
|
|
+ $len = strlen($c);
|
|
|
|
|
+ $a = 0;
|
|
|
|
|
+ $scill = '';
|
|
|
|
|
+ while ($a < $len) {
|
|
|
|
|
+ $ud = 0;
|
|
|
|
|
+ if (ord($c{$a}) >= 0 && ord($c{$a}) <= 127) {
|
|
|
|
|
+ $ud = ord($c{$a});
|
|
|
|
|
+ $a += 1;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 192 && ord($c{$a}) <= 223) {
|
|
|
|
|
+ $ud = (ord($c{$a}) - 192) * 64 + (ord($c{$a + 1}) - 128);
|
|
|
|
|
+ $a += 2;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 224 && ord($c{$a}) <= 239) {
|
|
|
|
|
+ $ud = (ord($c{$a}) - 224) * 4096 + (ord($c{$a + 1}) - 128) * 64 + (ord($c{$a + 2}) - 128);
|
|
|
|
|
+ $a += 3;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 240 && ord($c{$a}) <= 247) {
|
|
|
|
|
+ $ud = (ord($c{$a}) - 240) * 262144 + (ord($c{$a + 1}) - 128) * 4096 + (ord($c{$a + 2}) - 128) * 64 + (ord($c{$a + 3}) - 128);
|
|
|
|
|
+ $a += 4;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 248 && ord($c{$a}) <= 251) {
|
|
|
|
|
+ $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);
|
|
|
|
|
+ $a += 5;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 252 && ord($c{$a}) <= 253) {
|
|
|
|
|
+ $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);
|
|
|
|
|
+ $a += 6;
|
|
|
|
|
+ } else if (ord($c{$a}) >= 254 && ord($c{$a}) <= 255) { //error
|
|
|
|
|
+ $ud = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ $scill .= dechex($ud);
|
|
|
|
|
+ }
|
|
|
|
|
+ return $scill;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|