很多网站设置了301重定向,禁止游客访问,只允许百度ua真实跳转。
下面的php可以实现规则适配,批量抓取,并保存真实的落地页。
首先我们新建一个url.txt,里面放上域名及规则,一行一个,比如:https://www.weihangapi.cn/{数字5}.html
然后我们新建一个php,代码如下:
<?php
// 读取url.txt文件中的域名列表
$urls = file('url.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 支持的标签
$tags = [
'{年}' => date('Y'),
'{月}' => date('m'),
'{日}' => date('d'),
'{时}' => date('H'),
'{分}' => date('i'),
'{秒}' => date('s')
];
// 创建一个用于保存301重定向后页面的数组
$redirects = [];
// 遍历域名列表
foreach ($urls as $url) {
// 替换URL中的标签
foreach ($tags as $tag => $value) {
$url = str_replace($tag, $value, $url);
}
// 匹配并替换{n}为随机数
preg_match_all('/{数字(\d+)}/', $url, $matches);
foreach ($matches[1] as $match) {
$replace = '';
for ($i = 0; $i < $match; $i++) {
$replace .= mt_rand(0, 9);
}
$url = str_replace('{数字'.$match.'}', $replace, $url);
}
// 模拟百度蜘蛛访问
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)');
// 添加等待时间(单位:秒)
$waitTime = 3;
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $waitTime); // 连接超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $waitTime); // 总超时时间
curl_exec($ch);
// 获取重定向后的地址
$redirectUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
// 提取根域名
$parsedUrl = parse_url($redirectUrl);
$rootDomain = getRootDomain($parsedUrl['host']);
// 关闭curl请求
curl_close($ch);
// 判断是否已经存在相同的根域名,如果不存在则添加到数组中
if (!in_array($rootDomain, $redirects)) {
$redirects[] = $rootDomain;
}
}
// 将重定向地址写入301.txt文件
file_put_contents('301.txt', implode(PHP_EOL, $redirects));
echo '完成!';
/**
* 取得根域名
* @param string $domain 域名
* @return string 返回根域名
*/
function getRootDomain($domain) {
$re_domain = "";
$domain_postfix_cn_array = array("com", "net", "org", "gov", "edu", "icu","top","com.cn", "cn");
$array_domain = explode(".", $domain);
$array_num = count($array_domain) - 1;
if ($array_domain[$array_num] == 'cn') {
if (in_array($array_domain[$array_num - 1], $domain_postfix_cn_array)) {
$re_domain = $array_domain[$array_num - 2] . "." . $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
} else {
$re_domain = $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
}
} else {
$re_domain = $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
}
return $re_domain;
}
?>
我们访问上面的php文件,即可实现抓取url.txt里面的网站,它会自动获取301后的目标页面,自动去重,只保留根域名在301.txt中。