当前位置:代码狗 > 经验教程 > 实用教程 > 正文

使用PHP定时爬取代理IP

有时候我们在访问别人网站资源的时候,因为网站做了IP限制,所有我们需要大量的代理IP来帮助我们完成无限制的浏览。虽然网络上的代理IP网站特别多,但大多数都是不行的,不相信可以试试看,我已经试过了,一次抓取400多个IP,20秒内验证完成,有380个不能用,这淘汰率太高了。于是我就做了个代理IP验证的程序,放在服务器上自动抓取、验证、剔除无效IP。当我们需要使用时,拿到的IP基本上都是可以使用的了。

主要实现过程如下:

首先使用PHP写一个定时爬取网页的程序,并解析出网页中我们需要的代理IP与端口,至于其它信息,你想要就抓吧,我这里不需要,所以就只写代理IP与端口的程序。代码如下:

<?php

/**
 *
 *
 * @version 1.0
 * @copyright 2017
 */
ignore_user_abort(); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
$interval=60*5;// 每隔5分钟运行,这个间隔时间是可以随着 需要进行修改
do{
for($n=1;$n<2;$n++){
//抓取http://www.66ip.cn 这个网站上的IP内容
 $subject = qwbzj(gethtml("http://www.66ip.cn/".$n.".html"),"验证时间","mypage");
 $pattern = '/\d+\.\d+\.\d+\.\d+<\/td><td>\d+/';
 preg_match_all($pattern, $subject, $matches);
for ($i= 0;$i< count($matches); $i++){
 for($j=0;$j<count($matches[$i]);$j++){
 $str= $matches[$i][$j];
 $protyipss=str_replace("</td><td>",":" ,$str );
 // echo str_replace("</td><td>",":" ,$str )."<br />";
 if(mysqll($protyipss)==1){
 // echo "成功";
 }else{
 // echo "失败";
 }
 //checkproty($protyipss);
 }
 
}
}
 sleep($interval); // 休眠5分钟
}while(true);


function mysqll($ipstring){
//数据库地址
$servername = "localhost";
//数据库用户名
$username = "root";
//数据库密码
$password = "root";
// 创建连接
$con = mysql_connect($servername, $username, $password);
// 检测连接
if (!$con) {
die("数据库连接失败: " . mysql_error());
}else{
mysql_select_db("protyip",$con);
if(checkipcf($ipstring)==0){
//建立数据表用来存储IP数据 表名 protyip 其中有id , ip , 抓取时间 ,验证时间 ,存活时间这几个字段
$sql="insert into protyip(ip,zqtime,yztime,chtime) values('".$ipstring."','".gettime()."','".gettime()."'".",'0天0小时0分0秒'".")";
 $fh=mysql_query($sql,$con);
 if($fh){
 return true;
 }else{
 return FALSE;
 }
}
 mysql_close($con);
}
}
function checkipcf($prip){
//数据库地址
$servername = "localhost";
//数据库用户名
$username = "root";
//数据库密码
$password = "root";
// 创建连接
$con = mysql_connect($servername, $username, $password);
// 检测连接
if (!$con) {
die("数据库连接失败: " . mysql_error());
}else{
mysql_select_db("protyip",$con);
$sql="SELECT COUNT( * ) FROM protyip where ip='".$prip."'";
$fh=mysql_query($sql,$con);
$fhaa=mysql_fetch_array($fh);
return $fhaa['COUNT( * )'];
}
mysql_close($con);
}
/*
*取网页源码
*/
function gethtml($urlstring){
$html=file_get_contents($urlstring);
 return $html;
}
/**
*取文本中间
* */
function qwbzj($str, $leftStr, $rightStr)
{
 $left = strpos($str, $leftStr);
 //echo '左边:'.$left;
 $right = strpos($str, $rightStr,$left);
 //echo '<br>右边:'.$right;
 if($left < 0 or $right < $left) return '';
 return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
?>

写完后需要在浏览器中访问一次进行启动,访问之后即可关闭退出,不退出你就只能看到它一直在转圈。程序5分钟进行一次抓取,抓取的内容经过重复验证后插入到数据表中。效果如下:

最后一项就是自动抓到的新IP,关于IP的验证我们下次再讲。

注:本文中的源码中涉及到mysql数据库,mysql语句并没有进行严格的限制,注意网络安全!

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏

评论 2

  1. #1

    这个岂不很耗资源?

    易云2年前 (2017-03-25)回复
    • 对,个人用,如果要大量的代理,不建议使用PHP,java比较好。

      daimadog2年前 (2017-03-26)回复
×

请作者吃根烤肠!

支付宝