上回说到,突破反爬虫限制的方法之一就是多用几个代理IP,但前提是我们得拥有有效的代理IP,下面我们来介绍抓取代理IP并多线程快速验证其有效性的过程。

一、抓取代理IP

提供免费代理IP的网站还挺多的,我在‘西刺代理’上一阵猛抓后自己的IP就被其屏蔽了。只好换‘IP巴士’并乖乖的减缓抓取速度了。贴上抓取代码

importurllib.requestimporturllibimportreimporttimeimportrandom#抓取代理IP

ip_totle=[] #所有页面的内容列表

for page in range(2,6):

url='http://ip84.com/dlgn/'+str(page)

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}

request=urllib.request.Request(url=url,headers=headers)

response=urllib.request.urlopen(request)

content=response.read().decode('utf-8')print('get page',page)

pattern=re.compile('

(\d.*?)') #截取与之间第一个数为数字的内容

ip_page=re.findall(pattern,str(content))

ip_totle.extend(ip_page)

time.sleep(random.choice(range(1,3)))#打印抓取内容

print('代理IP地址','\t','端口','\t','速度','\t','验证时间')for i in range(0,len(ip_totle),4):print(ip_totle[i],' ','\t',ip_totle[i+1],'\t',ip_totle[i+2],'\t',ip_totle[i+3])

复制以上代码即可抓取IP巴士上的大陆高匿代理IP了,其他地区或类型的可自行改URL,可能是网站内容在实时更新的原因,若从第一页开始抓取不怎么稳定,所以我从第二页开始抓取,打印部分结果如下

二、验证代理IP的有效性

由于所处的网络可能连不上此代理或该代理连不上目标网址等原因,我们抓取的代理有可能是无效的,我们有必要验证所抓取代理IP的有效性。在urllib.request包中的ProxyHandler类可以设置代理访问网页,代码如下

importurllib.request

url= "http://quote.stockstar.com/stock" #打算抓取内容的网页

proxy_ip={'http': '27.17.32.142:80'} #想验证的代理IP

proxy_support =urllib.request.ProxyHandler(proxy_ip)

opener=urllib.request.build_opener(proxy_support)

opener.addheaders=[("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64)")]

urllib.request.install_opener(opener)print(urllib.request.urlopen(url).read())

若IP是有效的,则可打印出网页源码,否则会出现错误。所以我们可以通过以上代码对所抓取的代理IP逐个进行验证。

三、多线程快速验证

按顺序逐个验证代理IP的有效性速度比较慢,python中有多线程模块,多线程类似于同时执行多个不同程序,使用多线程可以把占据长时间的程序中的任务放到后台去处理,在一些需要等待的任务实现上线程就比较有用了。

Python通过两个标准库thread和threading提供对线程的支持。thread模块提供了低级别的、原始的线程以及一个简单的锁。threading 是我们常用的用于python 多线程的模块,其功能更加丰富。threading 模块中提供了一个Thread 类,这个类可以实例化一个对象,每个对象代表一个线程。下面我们介绍下本文使用threading模块中的类。

我们先介绍线程锁,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期,比如我们的一个print语句只打印出一半的字符,这个线程就被暂停,执行另一个去了,所以我们看到的结果会很乱,这种现象叫做“线程不安全”。Threading模块为我们提供了Threading.Lock类,我们创建一个该类对象,在线程函数执行前,“抢占”该锁,执行完成后,“释放”该锁,则我们确保了每次只有一个线程占有该锁。这时候对一个公共的对象进行操作,则不会发生线程不安全的现象了。我们先建立了一个threading.Lock类对象lock,使用lock.acquire()获得了这个锁。此时,其他的线程就无法再获得该锁了,他们就会阻塞在“if lock.acquire()”这里,直到锁被另一个线程释放:lock.release()。

然后我们来介绍threading模块中的Thread 类。class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *,daemon=None), 这个构造函数通常会用一些关键字参数,下面我们了解下这些关键字:

group :这个变量作为保留变量,是为了以后扩展用的,暂时可以不用考虑。

target: 是通过run()方法调用的可调用对象。默认为无,这意味着什么都不做。

name:线程的名字。默认情况下,一个唯一的名称是”thread-n”的形式,其中n是一个小的十进制数。

args:元组参数,为target所调用的。

kwargs:关键字参数的字典,为target所调用的。

daemon: 设置daemon是否daemon 如果没有显示设置,daemon的属性时从当前线程继承。

如果子类重写此构造函数,它必须确保在做别的事情之前调用基类的构造函数thread.__init__()。本文所用到Thread 类的方法有:

start(self)

开始线程的运行,每个线程对象只有调用最多一次。它将调用被调用对象的run()方法,并控制各个对象独立运行。也就是说被调用的对象必要要有run() 方法,在使用Thread 类来实例化对象的时候,因为Thread 中已经有了run() 方法了,所以可以不用理。但是,在基础Thread 创建子类的时候,一般我们要重写子类的run()方法。

join(self, timeout=None)

阻塞主线程,直到调用该方法的子线程运行完毕或者超时。timeout 表示超时时间,可以是一个数,例如整数,小数,分数,表示超时的时间,单位是秒。返回值为 None,可以在 join 超时之后调用 isAlive 确认线程是否结束。如果线程还活动,说明 join 触发了超时,此时你可以继续调用 join 或者做其他处理。当 timeout 没有给或者为 None 的时候,将阻塞直到调用此方法的子线程结束。一个线程可以调用多次 join 方法。

多线程验证的主要程序如下

#多线程验证

threads=[]for i inrange(len(proxys)):

thread=threading.Thread(target=test,args=[i])

threads.append(thread)

thread.start()#阻塞主进程,等待所有子线程结束

for thread inthreads:

thread.join()

一开始我我令元组参数args=(i),结果报‘test() argument after * must be an iterable, not int’的错误,误打误撞把小括号改为中括号后就有用了,暂时不解中其缘由,望知情者能告知。程序部分运行结果如下

亲测多线程验证比单线程验证快了好几倍,所以以后在爬取网页量比较大时就可以先用此程序抓一些有效的代理IP,这样就可以解决IP被屏蔽的问题啦。python3抓取代理IP并用多线程快速验证的完整代码如下

importurllib.requestimporturllibimportreimporttimeimportrandomimportsocketimportthreading#抓取代理IP

ip_totle=[]for page in range(2,6):

url='http://ip84.com/dlgn/'+str(page)#url='http://www.xicidaili.com/nn/'+str(page) #西刺代理

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}

request=urllib.request.Request(url=url,headers=headers)

response=urllib.request.urlopen(request)

content=response.read().decode('utf-8')print('get page',page)

pattern=re.compile('

(\d.*?)') #截取与之间第一个数为数字的内容

ip_page=re.findall(pattern,str(content))

ip_totle.extend(ip_page)

time.sleep(random.choice(range(1,3)))#打印抓取内容

print('代理IP地址','\t','端口','\t','速度','\t','验证时间')for i in range(0,len(ip_totle),4):print(ip_totle[i],' ','\t',ip_totle[i+1],'\t',ip_totle[i+2],'\t',ip_totle[i+3])#整理代理IP格式

proxys =[]for i in range(0,len(ip_totle),4):

proxy_host= ip_totle[i]+':'+ip_totle[i+1]

proxy_temp= {"http":proxy_host}

proxys.append(proxy_temp)

proxy_ip=open('proxy_ip.txt','w') #新建一个储存有效IP的文档

lock=threading.Lock() #建立一个锁#验证代理IP有效性的方法

deftest(i):

socket.setdefaulttimeout(5) #设置全局超时时间

url = "http://quote.stockstar.com/stock" #打算爬取的网址

try:

proxy_support=urllib.request.ProxyHandler(proxys[i])

opener=urllib.request.build_opener(proxy_support)

opener.addheaders=[("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64)")]

urllib.request.install_opener(opener)

res=urllib.request.urlopen(url).read()

lock.acquire()#获得锁

print(proxys[i],'is OK')

proxy_ip.write('%s\n' %str(proxys[i])) #写入该代理IP

lock.release() #释放锁

exceptException as e:

lock.acquire()print(proxys[i],e)

lock.release()#单线程验证

'''for i in range(len(proxys)):

test(i)'''

#多线程验证

threads=[]for i inrange(len(proxys)):

thread=threading.Thread(target=test,args=[i])

threads.append(thread)

thread.start()#阻塞主进程,等待所有子线程结束

for thread inthreads:

thread.join()

proxy_ip.close()#关闭文件

proxy_ip

python 代理ip验证_python爬虫成长之路(二):抓取代理IP并多线程验证相关推荐

  1. Python爬虫成长之路:抓取证券之星的股票数据(转)

    获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...

  2. python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇

    前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...

  3. python爬斗鱼直播_Python爬虫:利用API实时爬取斗鱼弹幕

    原标题:Python爬虫:利用API实时爬取斗鱼弹幕 这些天一直想做一个斗鱼爬取弹幕,但是一直考试时间不够,而且这个斗鱼的api接口虽然开放了但是我在github上没有找到可以完美实现连接.我看了好多 ...

  4. python获取登录按钮_Python:Selenium模拟Chrome浏览器抓取淘宝商品信息

    对于采用异步加载技术的网页,有时候想通过逆向工程的方式来设计爬虫进行爬取会比较困难,因此,要想通过python获取异步加载数据往往可以使用Selenium模拟浏览器的方式来获取. Selenium是一 ...

  5. python爬wos数据库,分布式爬虫困惑,如何合理安排抓取/解析/储存?

    目前情况: 一个 50 个目标网站的爬虫项目,有个 200 台的集群服务器. 爬取的内容基本上是从列表页(需要翻页)开始,抓取详情页 url,然后通过 url 抓取详情页内容. 目前架构: maste ...

  6. python精彩小视频_Python爬虫:全民小视频爬取,你想到了什么?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次目标 爬取全民小视频 在这里插入图片描述 选择影视类目 在这里插入图片描 ...

  7. python爬虫抓取分页_Python爬虫—简书首页数据抓取

    简书 本该昨天完成的文章,拖了一天.可能是没休息好吧,昨天的在思路以及代码处理上存在很多问题,废话不多说,我们一起来看一下简书首页数据的抓取. 抓取的信息 2.2)简书首页文章信息 http://ww ...

  8. python爬虫:批量抓取代理ip,进行验证,抓取豆瓣网站影视信息

    本文作为学习笔记参考用: [1]批量抓取代理ip: 找到第三方ip代理的网站,进行分析,并批量抓取,抓取程序放到Proxies_spider.py中,如下所示: import re import re ...

  9. python爬虫成长之路(一):抓取证券之星的股票数据

    python爬虫成长之路(一):抓取证券之星的股票数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇 ...

最新文章

  1. xml放在工程的那个路径下_Ubuntu下配置pyrouge
  2. 2018-3-15模式识别--学习笔记(一)
  3. 菜鸟学PureMVC记
  4. AGG第二十二课 conv_contour函数auto_detect_orientation的字体应用
  5. java多态和继承_Java学习--继承与多态
  6. Date类的构造方法以及成员方法220
  7. java final属性
  8. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
  9. 【推荐实践】Bandit算法在携程推荐系统中的应用与实践
  10. JavaScript
  11. Http接口开发以及异常调试
  12. 行测题相关,在线测评(图形找规律。逻辑思维)
  13. 详解K均值聚类算法(K-means Clustering)简易实例:从空调温度判别使用者
  14. spark2.2以后版本任务调度将增加黑名单机制
  15. 如何快速无损地把flv格式文件转换为mp4格式(可在iPhone上播放)
  16. 微软原版系统安装Win7篇
  17. StarGAN-多领域图像翻译
  18. 杭电计算机考研经验总结
  19. 在ubuntu下用mosquitto搭建mqtt服务器,mqtt.fx的tls加密连接
  20. 最简单的库存管理开发(一)

热门文章

  1. Linux系统下查看目录大小
  2. IDC评述网:7月上旬国内域名解析服务商Top10
  3. 【原】unity3d刀光闪过
  4. ADF Jar包循环引用会出问题
  5. js获取过滤条件中参数的快捷方式
  6. Django实现任意文件上传(最简单的方法)
  7. FTP服务(vsftpd)配置
  8. SPOJ 375. Query on a tree (树链剖分)
  9. prototype.js 1.4版开发者手册
  10. python自动登录教程_python实现校园网自动登录的示例讲解