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函数学习笔记
Oct 07 Python
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python访问sqlserver示例
Feb 10 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
Python删除n行后的其他行方法
Jan 28 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python基础之元编程知识总结
May 23 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
2009/08/21 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
Python易忽视知识点小结
2015/05/25 Python
Python标准库之collections包的使用教程
2017/04/27 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python PyQt5整理介绍
2020/04/01 Python
python实现mean-shift聚类算法
2020/06/10 Python
python 实现Harris角点检测算法
2020/12/11 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
超市仓管员岗位职责范本
2014/09/18 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
电信营业员岗位职责
2015/04/14 职场文书
运输公司工作总结
2015/08/11 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书