首先最为一个职业爬虫,代理ip来源肯定不是网络收集资源,这样效率太低了,常规的方法一般是购买代理ip、或者是搭建adsl动态拨号服务器,此处为了测试,我特意买了一个便宜的代理ip,通过代理ip服务商的api接口,获取代理ip。
1、调用api获取代理
根据服务商啊api手册,我配置了代理链接,把参数放进去;这是哪一家代理ip,我就不说了,代理ip质量不咋地,整个服务系统也垃圾!!!
根据接口文档,我配置好了我的api参数,下一步我是采用的requests模块get一下接口,返回值的,我只要对返回值进行处理即可
2、引入队列
既然是多线程,那这边就是采用队列来处理线程之间的通讯:创建队列很简单,导包,创建队列,队列操作即可;
队列提取,用get()、发送put()、计数减一:task_done()
3、编写代理ip验证模块
这里我采用的是requests模块,请求验证网站,其实一般只要用requests请求,不出错就算代理ip有效,我这边为了更好的演示,采用的是get请求验证网站,判断网站状态,获取网站返回值验证,这样的验证,一目了然知道,代理ip是有效的;此模块中,采用了破获异常的处理方法,因为检测代理时候,坏ip不能访问网站是会报错了,为了不影响程序运行,就捕获异常,发出代理不可用的响应:
4、多线程配置
此次采用模块 threading,创建线程,指向check_ip函数,设置守护线程setDaemon(True),目的是为了主线程结束后,等待回收子线程,防止孤儿线程的产生。当然采用了多线程技术,就一定要考虑,线程安全的问题,此处将采用线程锁的方式处理:
5、整体代码