摘要

昨天下午的时候,真的是无语至极。本以为CSDN上博友们应都是与人为善类型的。没想到都博客专家级别的了,出口竟是如此不堪。难道请教问题就得是一副高高在上,别人必须给你解决问题,给你代码吗?

对于此类人,我不做过多评价。我只会在心里默默说一句,好自为之吧。希望此后永远不会有交集!


言归正传,写爬虫的时候。难免会使用代理IP技术。于Python中调用代理IP实则是一件轻松的事,但是有一个不大不小的问题,那就是代理IP的有效性。

往往做爬虫的时候会事先爬取很多的代理ip作为备用,但是有些可能还用,有些可能就失效了。所以程序会因此变得不甚稳定。于是在爬虫运行之前,保证代理IP的高可用性,是有一定的必要的。

今日,就来做这么一件“清洗”工作。

原理

当然,测试代理IP有效性的方法有很多。我想到的无非也就其中一种,不具权威性,仅供参考罢了。

我个人认为,测试代理IP有效性还是得从服务器端下手,毕竟代理IP是要去访问真正的服务器端的。所以在服务器端进行验证最合适不过了。服务器端验证完毕之后,将结果返回给客户端,如此“清洗”工作就可以据此完成。保留有效的代理IP,去除失效的代理IP。

接下来,按部就班的实现就行了。

服务器端

服务器端使用什么语言都是可以的,我这里正好有php环境,自然选择了PHP了。

$_SERVER

$_SERVER变量中包含了客户端来访的全部信息,所以仅仅需要把相关的部分剖取出来就够了。

脚本

<?php
echo "Client IP:".$_SERVER['REMOTE_ADDR'];

是不是足够简单。

不过为了接下来客户端“清洗”方便,我们仅仅把客户端IP输出就行了。这样免得客户端在进行字符串分割处理。

<?php
echo $_SERVER['REMOTE_ADDR'];

简单的测试一下:
检测客户端IP

此时,仅仅使用浏览器作为客户端,所以没用到代理IP。可见,服务器端搭建依然成功了。接下来就是在客户端进行验证了。

客户端

客户端这块,毕竟爬虫使用Python的还是比较多的,而且对我自己而言,Python也顺手,所以就是用Python好了。

在我印象中,涉及到代理部分的库以urllib2和requests最为常见。下面简单的贴下代码。

urllib2

在urllib2中使用的代理IP分为http类型和https类型,需要分别处理一下。

  • http类型:
proxy=urllib2.ProxyHandler({'http': '代理IP'})
opener=urllib2.build_opener(proxy)
urllib2.install_opener(opener)
  • https类型:
proxy=urllib2.ProxyHandler({'https': '代理IP'})
opener=urllib2.build_opener(proxy)
urllib2.install_opener(opener)

requests

相比之下,requests 就更为方便了。不管是http类型还是https类型都是兼容的。统统放到一个字典内说明即可。

#coding: utf8

import requests

proxies = {
    "http": "115.231.105.109:8081",
    "http": "101.230.214.25:8080",
    "https": "218.29.111.106:9999",
    }
result = requests.get('http://101.200.58.242/temp/proxytest.php', proxies=proxies)
print result.content

完整代码

# coding: utf8

import requests

# 本机IP
localip = "111.117.112.164"

# 待清洗代理IP数据池
proxies = [
    {"http": "115.231.105.109:8081" },
    {"http": "218.76.106.78:3128" },
    {"http": "183.185.0.18:9797"},
    {"https": "218.29.111.106:9999" },
    ]

# 有效代理IP池
proxypool = []

# 清洗代理IP,去除无效的代理IP
for index in range(len(proxies)):
    print proxies[index]
    try:
        result = requests.get('http://101.200.58.242/temp/proxytest.php', proxies=proxies[index])
    except Exception as e:
        continue
    # 与本机IP对比,相等则说明没用到代理IP,为无效项
    if result.content != localip:
        proxypool.append(proxies[index])

print proxypool

这样就可以简单的测试出代理IP的有效性了。当然效率确实不够高,有必要的话使用多线程来进行加速也是可以的。

演示

提示

在演示之前,我觉得还是有必要啰嗦一下的。

在做爬虫的时候,不管是公司内还是学校里。大部分都是在局域网内,这样获取本机的IP就需要动点心思了。当然,现在网络上资源很多,各种获取本机IP的接口。随便处理一下就可以了。如一开始我那样直接用浏览器访问自己的服务器来测试也是可以的。

下面介绍一个最常用的。直接在浏览器上输入ip。
查看本机IP

然后就可以使用这个本机IP作为过滤条件来进行清理工作了。当然了,这一步还可以更加的智能化,继续写点代码来完成,我在这就权当是抛砖引玉吧。博友有需要的话知道有这么个思路就行了。

清洗效果

最后来看看测试的效果吧,我是在网上随便找了个网站,直接手动复制的几个代理IP(代码中有记录)。然后直接测了一下,发现还不错,有三个是能用的。
清洗代理IP结果

总结

最后回顾一下,本次试验代码量很少。但是思路还是蛮清晰的。实现起来也比较简单。

需要注意的是这个测试需要有服务器的支持,否则在本地localhost的时候代理IP不能有效的工作。

最后,还是觉得:

做事之前还是先学会做人的好。

社会上不是每一个人都能淡然面对他人的无礼的,总会有让你后悔的那天。与君共勉。


本文转载:CSDN博客