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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
Python自定义类的数组排序实现代码
Aug 28 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
Python错误处理操作示例
Jul 18 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
python读取文件名并改名字的实例
Jan 07 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
详解Python流程控制语句
Oct 28 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
php中rename函数用法分析
2014/11/15 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
tensorflow多维张量计算实例
2020/02/11 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
关于礼仪的演讲稿
2014/01/04 职场文书
经典公益广告词
2014/03/13 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
新闻发布会策划方案
2014/06/12 职场文书
老干部工作先进事迹
2014/08/17 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python