上一篇博文已经完成了代理IP抓取的核心部分,这一篇主要讲一下代理IP的检测。
所谓HTTP代理,检测方法很简单,就是用代理去请求一个网址,看看是否能够拿到正确回应。因为我们抓取IP是周期进行的,所以代理IP的验证也要不停的进行,简单说来就是一个队列的形式,抓取系统不停往队列里扔IP,检测进程不停取出IP进行检测,检测合格的IP放入另一个队列,不合格的直接丢弃。当然,因为代理IP的时效性,存放检测合格的代理IP的队列,自身也需要进行检测维护。
实现方法很简单,Python就是个工具库,利用urllib2的绑定代理功能,可以很简单的完成这个工作,稍微注意一点的就是和mongodb的交互,python上使用pymongo库和mongodb交互,API比较简单。为了提高检测效率,我选择了多线程模式。检测IP看做一个任务,这些任务完全可以并行进行,唯一需要注意的就是取IP和放IP。利用mongodb里一些线程安全的API(find_and _delete),可以避开线程锁的使用。(当然,我没有严格验证是否存在数据冲突,作为练手,这个实现方式足以,而且错误的代价基本忽略)
这个检测的进程不停读取IP队列里的数据,如果读不到了,则sleep一些时间,然后继续尝试读取。
这样一套方案搭建好之后,mongodb里时刻都存有当前30分钟内搜索到代理IP资源,这可以作为其他scrapy的准备资源,妈妈再也不用担心我的IP- -。。
我在测试代理IP的时候,把测试用的网页链接设置成了上一篇博客的地址http://blog.csdn.net/mingz_free/article/details/45967725。。。于是乎。。。。
这个博客的阅读量就飞起来了。。。我没有恶意刷点击量的意思。。求别封我的博客- -。。
附上部分源码:
scan.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
USAGE = """This is s special daemon used for checking whether the IP proxy works.
It