Python代理抓取并验证使用多线程实现


Posted in Python onMay 03, 2013

没有使用队列,也没有线程池还在学习只是多线程

#coding:utf8 
import urllib2,sys,re 
import threading,os 
import time,datetime 
''''' 
这里没有使用队列 只是采用多线程分发对代理量不大的网页还行但是几百几千性能就很差了 
''' 
def get_proxy_page(url): 
'''''解析代理页面 获取所有代理地址''' 
proxy_list = [] 
p = re.compile(r'''''<div>(.+?)<span class="Apple-tab-span" style="white-space:pre">.*?</span>(.+?)<span class="Apple-tab-span" style="white-space:pre">.+?</span>(.+?)(<span.+?)?</div>''') 
try: 
res = urllib2.urlopen(url) 
except urllib2.URLError: 
print 'url Error' 
sys.exit(1) 
pageinfo = res.read() 
res = p.findall(pageinfo) #取出所有的 
#组合成所有代理服务器列表成一个符合规则的list 
for i in res: 
ip = i[0] 
port = i[1] 
addr = i[2] 
l = (ip,port,addr) 
proxy_list.append(l) 
return proxy_list 
#同步锁装饰器 
lock = threading.Lock() 
def synchronous(f): 
def call(*args, **kw): 
lock.acquire() 
try: 
return f(*args, **kw) 
finally: 
lock.release() 
return call 
#时间计算器 
def sumtime(f): 
def call(*args, **kw): 
t1 = time.time() 
try: 
return f(*args, **kw) 
finally: 
print u'总共用时 %s' % (time.time() - t1) 
return call 
proxylist = [] 
reslist = [] 
#获取单个代理并处理 
@synchronous 
def getoneproxy(): 
global proxylist 
if len(proxylist)>0: 
return proxylist.pop() 
else: 
return '' 
#添加验证成功的代理 
@synchronous 
def getreslist(proxy): 
global reslist 
if not (proxy in reslist): 
reslist.append(proxy) 
def handle(): 
timeout = 10 
test_url = r'http://www.baidu.com' 
test_str = '030173' 
while 1: 
proxy = getoneproxy() 
#最后一个返回是空 
if not proxy: 
return 
print u"正在验证 : %s" %proxy[0] 
#第一步启用 cookie 
cookies = urllib2.HTTPCookieProcessor() 
proxy_server = r'http://%s:%s' %(proxy[0],proxy[1]) 
#第二步 装载代理 
proxy_hander = urllib2.ProxyHandler({"http":proxy_server}) 
#第三步 组合request 
try: 
opener = urllib2.build_opener(cookies, proxy_hander) 
pass 
except urllib2.URLError: 
print u'url设置错误' 
continue 
#配置request 
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1')] 
#发送请求 
urllib2.install_opener(opener) 
t1 = time.time() 
try: 
req = urllib2.urlopen(test_url,timeout=timeout) 
result = req.read() 
pos = result.find(test_str) 
timeused = time.time() - t1 
if pos>1: 
#保存到列表中 
getreslist((proxy[0],proxy[1],proxy[2],timeused)) 
print u'成功采集',proxy[0],timeused 
else: 
continue 
except Exception,e: 
print u'采集失败 %s :timeout' %proxy[0] 
continue 
def save(reslist): 
path = os.getcwd() 
filename = path + '/Proxy-'+datetime.datetime.now().strftime(r'%Y%m%d%H%M%S')+'.txt' 
f = open(filename,'w+') 
for proxy in reslist: 
f.write('%s %s %s %s \r\n'%(proxy[0],proxy[1],proxy[2],proxy[3])) 
f.close() 
@sumtime 
def main(): 
url = r'http://www.free998.net/daili/httpdaili/8949.html' 
global proxylist,reslist 
#获取所有线程 
proxylist = get_proxy_page(url) 
print u'一共获取 %s 个代理' %len(proxylist) 
#print proxylist 
print '*'*80 
#线程创建和分发任务 
print u'开始创建线程处理.....' 
threads = [] 
proxy_num = len(proxylist) 
for i in range(proxy_num): 
th = threading.Thread(target=handle, args=()) 
threads.append(th) 
for thread in threads: 
thread.start() 
for thread in threads: 
threading.Thread.join(thread) 
print u'获取有效代理 %s 个,现在开始排序和保存 '%len(reslist) 
reslist = sorted(reslist,cmp=lambda x,y:cmp(x[3],y[3])) 
save(reslist) 
if __name__=='__main__': 
main()

输出:
一共获取 31 个代理
********************************************************************************
开始创建线程处理.....
正在验证 : 122.10.48.13
正在验证 : 122.72.76.121
正在验证 : 122.72.11.129
正在验证 : 222.89.159.131
正在验证 : 218.5.74.174
正在验证 : 218.203.107.165
正在验证 : 219.224.101.81
正在验证 : 221.176.169.14
正在验证 : 112.5.254.85
正在验证 : 113.106.73.210
正在验证 : 114.247.21.212
正在验证 : 122.72.76.122
正在验证 : 219.239.26.23
正在验证 : 222.89.154.14
正在验证 : 58.67.147.197
正在验证 : 222.188.88.26
正在验证 : 103.247.16.241
正在验证 : 183.221.250.141
正在验证 : 183.221.250.137
正在验证 : 122.72.80.108
正在验证 : 122.72.76.125
正在验证 : 122.72.11.131
正在验证 : 122.72.80.101
正在验证 : 122.72.120.41
正在验证 : 122.72.120.38
正在验证 : 122.72.120.35
正在验证 : 218.203.105.26
正在验证 : 221.130.18.211
正在验证 : 110.77.236.48
正在验证 : 218.91.206.146
正在验证 : 211.162.16.210
成功采集 114.247.21.212 0.300999879837
成功采集 218.203.105.26 0.306999921799
成功采集 221.176.169.14 0.417000055313
成功采集 122.72.120.35 0.369999885559
采集失败 218.5.74.174 :timeout
成功采集 122.72.120.38 0.40900015831
成功采集 183.221.250.137 0.608999967575
成功采集 122.72.11.131 0.679999828339
成功采集 183.221.250.141 0.791000127792
成功采集 113.106.73.210 0.891000032425
成功采集 122.72.76.121 1.40299987793
成功采集 122.72.80.108 1.4470000267
成功采集 211.162.16.210 1.625
成功采集 122.72.76.125 1.6819999218
成功采集 112.5.254.85 1.74399995804
成功采集 122.72.80.101 1.79799985886
成功采集 122.72.11.129 2.00900006294
成功采集 122.72.120.41 1.99099993706
采集失败 222.188.88.26 :timeout
成功采集 122.72.76.122 3.49100017548
成功采集 218.91.206.146 3.66000008583
成功采集 122.10.48.13 3.91799998283
成功采集 222.89.154.14 3.93499994278
成功采集 222.89.159.131 3.99699997902
成功采集 221.130.18.211 3.99500012398
采集失败 219.224.101.81 :timeout采集失败 218.203.107.165 :timeout
采集失败 58.67.147.197 :timeout
采集失败 103.247.16.241 :timeout
采集失败 110.77.236.48 :timeout
成功采集 219.239.26.23 12.2809998989
获取有效代理 24 个,现在开始排序和保存
总共用时 13.2810001373
Python 相关文章推荐
浅析Python中的多进程与多线程的使用
Apr 07 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
微信跳一跳python代码实现
Jan 05 Python
python保存文件方法小结
Jul 27 Python
python使用Matplotlib画饼图
Sep 25 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
python 创建一维的0向量实例
Dec 02 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
Python如何执行系统命令
Sep 23 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 Python
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 #Python
Python的lambda匿名函数的简单介绍
Apr 25 #Python
python批量下载图片的三种方法
Apr 22 #Python
如何运行Python程序的方法
Apr 21 #Python
python读取注册表中值的方法
Apr 08 #Python
重命名批处理python脚本
Apr 05 #Python
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 #Python
You might like
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
PHP对象相关知识总结
2017/04/09 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
javascript 学习笔记(onchange等)
2010/11/14 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
javascript读写json示例
2014/04/11 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
基于js 本地存储(详解)
2017/08/16 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
django admin组件使用方法详解
2019/07/19 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python实现吃苹果小游戏
2020/03/21 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
劳动之星获奖感言
2014/02/01 职场文书
管理失职检讨书
2014/02/12 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
大专护理专业自荐信
2015/03/25 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书