我也好奇为什么每次写博客都要写心理活动,害,算了算了,不管那么多了。反正大概的起因都是想试试php+curl+代理ip可不可以做到刷网站ip的效果,然后需要大量代理ip,一个一个复制太慢(懒癌晚期患者)于是便想直接采集下来,方便自己使用。
虽然说不知道为什么,但是我感觉你们已经猜到这部分的标题是“说干就干”了,是不是还少一句现在补上。想到了不做不是我的性格,所以说既让想到了就要实现! 首先我们去度娘搜索一下代理ip的网站,找一个代理ip多还免费的网站,然后我选的是快代理(不是广告)
然后Ctrl+U分析网页源代码,然后发现我们需要获取的数据在<tbody>
和</tbody>
之间,然后我们先利用正则表达式把<tbody>
和</tbody>
之间的内容都过滤出来。
<?php
$a = get_curl("https://www.kuaidaili.com/free/inha/1/");
preg_match_all("/<tbody>(.*)<\\/tbody>/si",$a,$b);
$array = $b[0][0];
就这样$array
这个的内容就是这个页面<tbody>
和</tbody>
之间的内容了,接着我们需要把字符串替换一下,替换成我们需要的形式
//需替换的字符串
$text = ['<tbody>','</tbody>','<tr>','</td>',' ',"\n"];
//替换成的字符串
$replace = ['','','','+','',''];
$array = array_filter(explode('</tr>',str_replace($text,$replace,$array)));
就这样$array
大变身,成了方便我们进行下一步操作的形式,我们可以利用explode()
函数来将它分割成了数组,所以说下面我们可以加一个for循环
来生成代理ip的数组
for($i=0;$i<count($array);$i++){
//需要替换一下剩下的内容
$arr1 = ['<tddata-title="IP">','<tddata-title="PORT">','<tddata-title="匿名度">','<tddata-title="类型">','<tddata-title="位置">','<tddata-title="响应速度">','<tddata-title="最后验证时间">'];
$arr2 = ['','','','','','',''];
//再再再次分割数组
$info = array_filter(explode('+',str_replace($arr1,$arr2,$array[$i])));
//生成代理ip列表
$proxy[] = ['ip'=>$info[0],'port'=>$info[1],'anonymous'=>$info[2],'type'=>$info[3],'location'=>$info[4]];
}
就这样我们已经完成了所有的步骤,$proxy
就是整个代理ip的列表,我们只采集了第一页,需要其他页码可以改一下页码,但是我还是比较喜欢json,所以说还是把它当做json输出吧。
exit(json_encode($proxy));
本次测试一下,看看输出的json是什么样的
// 20200405201929
// http://127.0.0.1/
[
{
"ip": "171.11.178.164",
"port": "9999",
"anonymous": "高匿名",
"type": "HTTP",
"location": "河南省济源市电信"
},
{
"ip": "175.42.123.178",
"port": "9999",
"anonymous": "高匿名",
"type": "HTTP",
"location": "福建省宁德市联通"
},
{
"ip": "163.204.243.10",
"port": "9999",
"anonymous": "高匿名",
"type": "HTTP",
"location": "广东省汕尾市联通"
},
{
"ip": "1.198.111.240",
"port": "9999",
"anonymous": "高匿名",
"type": "HTTP",
"location": "河南省鹤壁市电信"
}
]
其实我本来想直接上传的服务器然后提供接口的,但是后来发现这里的代理ip根本用不了(也用可能是我不会用)所以说还是提供一个思路出来,方便你们改代码。
如无特殊说明《提供一个采集代理ip网站的思路》为博主MoLeft原创,转载请注明原文链接为:https://moleft.cn/post-118.html