全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 5427|回复: 8
打印 上一主题 下一主题

求教采集高手!!关于链接的最终地址

[复制链接]
跳转到指定楼层
1#
发表于 2017-11-16 11:07:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
200金钱
这个网站的链接,如何用php获得链接最终跳转的地址?

https://slickdeals.net/?adobeRef=94393328ca6e11e7a09daa569a0b14b40002&pno=332607&afsrc=1&trd=See%20Deal&sdtid=10743527&tid=10743527&sdtrk=featured-cat&pv=943d41c0ca6e11e7a09daa569a0b14b4&au=38b8859e863011e7b3c3bafcfc572079&attr_track=Meta%3ACheckout%3Anot%20eligible

https://slickdeals.net/?adobeRef=d2b27a7eca6e11e7a5b946e4c7109be00000&afsrc=1&trd=See%20Deal&sdtid=10813599&tid=10813599&sdtrk=catpagev2&pv=d2b654d2ca6e11e7a5b946e4c7109be0&au=38b8859e863011e7b3c3bafcfc572079&attr_track=Meta%3ACheckout%3Anot%20eligible

我的程序是这样的,采集到的却还是原网站地址。
<?php
$url=$_REQUEST['url'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//若给定url自动跳转到新的url,有了下面参数可自动获取新url内容:302跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//设置cURL允许执行的最长秒数。
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0');
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
$content = curl_exec($ch);
//获取请求返回码,请求成功返回200
$code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
//echo $code . "\n\n";

//获取一个cURL连接资源句柄的信息。
//$headers 中包含跳转的url路径
$headers = curl_getinfo($ch);
echo $headers[url];

// $content 为url请求内容
//echo "\n\n" . $content . "\n";
?>


或者参考这样:
$url=$_REQUEST['url'];
$realUrl=getRedirectLocation($url);

echo "</br>--->",$realUrl;

function getRedirectLocation($url){
   
  $realUrl=$url;
  echo $url,"</br>";
  $ch=curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒
  //curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  $content=curl_exec($ch);
  //echo $content;
  $rinfo=curl_getinfo($ch);
  $matches=array();
  if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
    //echo $matches[1],"</br>";
    unset($content);
    $realUrl=getRedirectLocation($matches[1]);
  }
  if(isset($content)){
    unset($content);
  }
  return $realUrl;
}

出来的也不对。

最佳答案

查看完整内容

代码就这么简单,自带的函数。
2#
发表于 2017-11-16 11:07:41 | 只看该作者
本帖最后由 bigtiger8 于 2017-11-16 11:27 编辑
  1. $url = 'https://slickdeals.net/?adobeRef=94393328ca6e11e7a09daa569a0b14b40002&pno=332607&afsrc=1&trd=See%20Deal&sdtid=10743527&tid=10743527&sdtrk=featured-cat&pv=943d41c0ca6e11e7a09daa569a0b14b4&au=38b8859e863011e7b3c3bafcfc572079&attr_track=Meta%3ACheckout%3Anot%20eligible';
  2. $headers = get_headers($url, TRUE);
  3. //输出跳转到的网址
  4. echo $headers['Location'][1];
复制代码


代码就这么简单,自带的函数。
3#
发表于 2017-11-16 11:24:16 | 只看该作者


是要获取下边这个地址么。
4#
发表于 2017-11-16 11:26:04 | 只看该作者
加上
  1. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
复制代码

试试
suzizi 该用户已被删除
5#
发表于 2017-11-16 11:37:07 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
6#
 楼主| 发表于 2017-11-16 22:30:27 | 只看该作者
bigtiger8 发表于 2017-11-16 11:25
代码就这么简单,自带的函数。

大佬指点一下,才发现问题出在我是用get传递网址,遇到“&”偶尔就会被截断。把地址直接写在php里就ok,但是怎样才能用正确传递网址呢?网上说用%26替换&,似乎不奏效。
另外,找到一个写得挺规范的代码,供参考:
function getrealurl($url){
    $header = get_headers($url,1);
    if (strpos($header[0],'301') || strpos($header[0],'302')) {
        if(is_array($header['Location'])) {
            return $header['Location'][count($header['Location'])-1];
        }else{
            return $header['Location'];
        }
    }else {
        return $url;
    }
}
7#
发表于 2017-11-17 09:01:07 | 只看该作者
本帖最后由 bigtiger8 于 2017-11-17 11:07 编辑
drice 发表于 2017-11-16 22:30
大佬指点一下,才发现问题出在我是用get传递网址,遇到“&”偶尔就会被截断。把地址直接写在php里就ok, ...

  1. <?php
  2. $url = $_GET['url'];
  3. $url = str_replace(' ','%20',$url);
  4. $url = str_replace(':','%3A',$url);
  5. $url = str_replace('%3A//','://',$url);
  6. function getrealurl($url){
  7.     $header = get_headers($url,1);
  8.     if (strpos($header[0],'301') || strpos($header[0],'302')) {
  9.         if(is_array($header['Location'])) {
  10.             return $header['Location'][count($header['Location'])-1];
  11.         }else{
  12.             return $header['Location'];
  13.         }
  14.     }else {
  15.         return $url;
  16.     }
  17. }
  18. echo getrealurl($url);
复制代码


你试试这样吧,转义之后再处理一下。在你传递get参数时,&写为%26
8#
发表于 2017-11-17 09:09:48 | 只看该作者
你自己一楼贴的是百度搜来的,那个有专门的作用。
9#
 楼主| 发表于 2017-11-17 10:20:36 | 只看该作者
bigtiger8 发表于 2017-11-17 09:01
你试试这样吧,转义之后再处理一下。在你传递get参数时,&写为%26

大佬神勇,搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-6-2 17:00 , Processed in 0.079498 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表