前面已经成功将各个网站上的Proxy获取到了,并且存储到了redis之中,那么,现在我们需要实现一个检测模块来检测Proxy,检测可用,则Score就设置为100,不可用,则score减1,这样就可以实时改变每个Proxy的可用情况。
由于Proxy的数量很多,为了提高检测效率,可以使用异步请求库aiohttp来进行检测,requests是一个同步请求库,发出请求后,程序需要等待网页加载完成后才能继续执行,这个过程会阻塞等待响应,如果服务器响应非常慢,比如一个请求等待十几秒,那么使用requests完成一个请求会需要十几秒的时间,程序也不会继续往下执行,非常浪费时间。异步请求库类似于Javascript中的回调函数,请求发出后,程序可以继续处理其他事情,当响应到达时,程序再去处理这个事情,程序不会被阻塞,可以充分利用时间和资源,效率较高。
我们先定义一个Tester类,__init__()方法中建立了一个RedisClient对象,接下来定义了一个test_single_proxy()方法,这个方法用来检测单个Proxy的可用情况,其前面添加了async关键字,这代表这个方法是异步的,方法内部先创建了aiohttp的ClientSession对象,然后调用其get()方法,这里我们通过proxy参数将Proxy传递给get()方法。
打开凤凰新闻,查看更多高清图片run()方法中,我们获取所有的Proxy列表,使用aiohttp分配任务,启动运行。