有时候我们在访问别人网站资源的时候,因为网站做了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语句并没有进行严格的限制,注意网络安全!
评论 (2)