zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Python代理多线程 实现 使用 验证 抓取
2023-06-13 09:14:52 时间
没有使用队列,也没有线程池还在学习只是多线程
复制代码代码如下:

#coding:utf8
importurllib2,sys,re
importthreading,os
importtime,datetime
"""""
这里没有使用队列只是采用多线程分发对代理量不大的网页还行但是几百几千性能就很差了
"""
defget_proxy_page(url):
"""""解析代理页面获取所有代理地址"""
proxy_list=[]
p=re.compile(r"""""<div>(.+?)<spanclass="Apple-tab-span"style="white-space:pre">.*?</span>(.+?)<spanclass="Apple-tab-span"style="white-space:pre">.+?</span>(.+?)(<span.+?)?</div>""")
try:
res=urllib2.urlopen(url)
excepturllib2.URLError:
print"urlError"
sys.exit(1)
pageinfo=res.read()
res=p.findall(pageinfo)#取出所有的
#组合成所有代理服务器列表成一个符合规则的list
foriinres:
ip=i[0]
port=i[1]
addr=i[2]
l=(ip,port,addr)
proxy_list.append(l)
returnproxy_list
#同步锁装饰器
lock=threading.Lock()
defsynchronous(f):
defcall(*args,**kw):
lock.acquire()
try:
returnf(*args,**kw)
finally:
lock.release()
returncall
#时间计算器
defsumtime(f):
defcall(*args,**kw):
t1=time.time()
try:
returnf(*args,**kw)
finally:
printu"总共用时%s"%(time.time()-t1)
returncall
proxylist=[]
reslist=[]
#获取单个代理并处理
@synchronous
defgetoneproxy():
globalproxylist
iflen(proxylist)>0:
returnproxylist.pop()
else:
return""
#添加验证成功的代理
@synchronous
defgetreslist(proxy):
globalreslist
ifnot(proxyinreslist):
reslist.append(proxy)
defhandle():
timeout=10
test_url=r"http://www.baidu.com"
test_str="030173"
while1:
proxy=getoneproxy()
#最后一个返回是空
ifnotproxy:
return
printu"正在验证:%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
excepturllib2.URLError:
printu"url设置错误"
continue
#配置request
opener.addheaders=[("User-Agent","Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTML,likeGecko)Chrome/21.0.1180.89Safari/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
ifpos>1:
#保存到列表中
getreslist((proxy[0],proxy[1],proxy[2],timeused))
printu"成功采集",proxy[0],timeused
else:
continue
exceptException,e:
printu"采集失败%s:timeout"%proxy[0]
continue
defsave(reslist):
path=os.getcwd()
filename=path+"/"+datetime.datetime.now().strftime(r"%Y%m%d%H%M%S")+".txt"
f=open(filename,"w+")
forproxyinreslist:
f.write("%s%s%s%s\r\n"%(proxy[0],proxy[1],proxy[2],proxy[3]))
f.close()
@sumtime
defmain():
url=r"http://www.free998.net/daili/httpdaili/8949.html"
globalproxylist,reslist
#获取所有线程
proxylist=get_proxy_page(url)
printu"一共获取%s个代理"%len(proxylist)
#printproxylist
print"*"*80
#线程创建和分发任务
printu"开始创建线程处理....."
threads=[]
proxy_num=len(proxylist)
foriinrange(proxy_num):
th=threading.Thread(target=handle,args=())
threads.append(th)
forthreadinthreads:
thread.start()
forthreadinthreads:
threading.Thread.join(thread)
printu"获取有效代理%s个,现在开始排序和保存"%len(reslist)
reslist=sorted(reslist,cmp=lambdax,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.2120.300999879837
成功采集218.203.105.260.306999921799
成功采集221.176.169.140.417000055313
成功采集122.72.120.350.369999885559
采集失败218.5.74.174:timeout
成功采集122.72.120.380.40900015831
成功采集183.221.250.1370.608999967575
成功采集122.72.11.1310.679999828339
成功采集183.221.250.1410.791000127792
成功采集113.106.73.2100.891000032425
成功采集122.72.76.1211.40299987793
成功采集122.72.80.1081.4470000267
成功采集211.162.16.2101.625
成功采集122.72.76.1251.6819999218
成功采集112.5.254.851.74399995804
成功采集122.72.80.1011.79799985886
成功采集122.72.11.1292.00900006294
成功采集122.72.120.411.99099993706
采集失败222.188.88.26:timeout
成功采集122.72.76.1223.49100017548
成功采集218.91.206.1463.66000008583
成功采集122.10.48.133.91799998283
成功采集222.89.154.143.93499994278
成功采集222.89.159.1313.99699997902
成功采集221.130.18.2113.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.2312.2809998989
获取有效代理24个,现在开始排序和保存
总共用时13.2810001373