PHP利用socket_bind函數切換IP地址採集資料

來源:互聯網
上載者:User

標籤:

在利用PHP進行資料擷取的過程中,通常會遇到IP被屏蔽或出現驗證碼的情況;為了能夠繼續採集,我們需要切換不同的ip,每訪問一次,隨機切換一個IP。當然也可以通過收集大量代理,通過切換代理的方式進行採集,原理大抵相似。
       因為本人在實際工作中遇到這種情況,剛好發生的情境在美國站群的伺服器,上面有已經綁定了200多個ip(這種伺服器1300元一月),因此可以輕鬆的利用socket_bind()函數進行出口ip的綁定,只需要隨機抽取一個IP進行綁定就可以。
           在C#中同樣可以通過Socket.Bind()函數進行ip的綁定,以此切換伺服器中不同ip進行採集!

<?php    //輸出內容    echo Getdata("http://www.baidu.com/s?wd=ip");    //Getdata()採集函數    function Getdata($url){        //隨機ip        require_once(‘D:\fang360_100dir\datas\Iplist.php‘);        $ip = $ip_arr[rand(0,count($ip_arr)-1)];         //host post path        $arr = parse_url($url);        $path=$arr[‘path‘]?$arr[‘path‘]:"/";        $host=$arr[‘host‘];        $port=isset($arr[‘port‘])?$arr[‘port‘]:80;        if ( $arr[‘query‘] ){            $path .= "?".$arr[‘query‘];        }         // Create a new socket         $sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);        if (!$sockHttp){            echo "socket_create() failed: reason: " .socket_strerror(socket_last_error()) . "\n";        }          // Bind the source address         if (socket_bind($sockHttp, $ip) === false) {            echo "socket_bind() failed: reason: " .socket_strerror(socket_last_error($sockHttp)) . "\n";        }         // Connect to destination address        $resSockHttp = socket_connect($sockHttp, $host, $port);        if (!$resSockHttp){              echo ‘socket_connect() failed!‘;          }         $user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 xttest/24.0";        $cookie = ‘‘;        $timeout = 25;        $out = "GET {$path} HTTP/1.0\r\n";        $out .= "Host: {$host}\r\n";        $out .= "User-Agent: {$user_agent}\r\n";        $out .= "Accept: */*\r\n";        $out .= "Accept-Language: zh-cn\r\n";        $out .= "Accept-Encoding: identity\r\n";        $out .= "Referer: {$url}\r\n";        $out .= "Cookie: {$cookie}\r\n";        $out .= "Connection: Close\r\n\r\n";         // Write        socket_write($sockHttp, $out,strlen($out));         $httpCode = substr(socket_read($sockHttp, 13),9,3);         $data =‘‘;        while ($sRead = socket_read($sockHttp, 4096)){          $data .= $sRead;      }    // Close    socket_close($sockHttp);     if (preg_match("#Content-Type:([^\r\n]*)#i", $data, $matches) && trim($matches[1]) != ‘‘)    {        $content_type_array = explode(‘;‘, $matches[1]);        $ContentType = strtolower(trim($content_type_array[0]));    }    else    {        $ContentType = ‘text/html‘;    }     header("Content-type: $ContentType");     $data=preg_replace("/^[^<]*?\r\n\r\n/","",$data);     if($httpCode>=400){        $data = "Request Error";    }      return $data;} ?>                        

 

PHP利用socket_bind函數切換IP地址採集資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.