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和C语言混合编程实例
Jun 04 Python
python网络编程学习笔记(四):域名系统
Jun 09 Python
详解Django中的过滤器
Jul 16 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Django学习笔记之ORM基础教程
Mar 27 Python
pytorch训练imagenet分类的方法
Jul 27 Python
python config文件的读写操作示例
Sep 27 Python
Python绘图实现显示中文
Dec 04 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 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
pw的一个放后门的方法分析
2007/10/08 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
理解javascript封装
2016/02/23 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
2015年计生工作总结范文
2015/04/24 职场文书
导游词之天津古文化街
2019/11/09 职场文书