博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 爬虫IP代理池的实现
阅读量:5797 次
发布时间:2019-06-18

本文共 5138 字,大约阅读时间需要 17 分钟。

很多时候,如果要多线程的爬取网页,或者是单纯的反爬,我们需要通过代理IP来进行访问。下面看看一个基本的实现方法。

代理IP的提取,网上有很多网站都提供这个服务。基本上可靠性和银子是成正比的。国内提供的免费IP基本上都是没法用的,如果要可靠的代理只能付费;国外稍微好些,有些免费IP还是比较靠谱的。

网上随便搜索了一下,找了个网页,本来还想手动爬一些对应的IP,结果发现可以直接下载现成的txt文件

下载之后,试试看用不同的代理去爬百度首页

#!/usr/bin/env python#! -*- coding:utf-8 -*-# Author: Yuan Liimport re,urllib.requestfp=open("c:\\temp\\thebigproxylist-17-12-20.txt",'r')lines=fp.readlines()for ip in lines:    try:            print("当前代理IP "+ip)            proxy=urllib.request.ProxyHandler({
"http":ip}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) url="http://www.baidu.com" data=urllib.request.urlopen(url).read().decode('utf-8','ignore') print("通过") print("-----------------------------") except Exception as err: print(err) print("-----------------------------")fp.close()

结果如下:

C:\Python36\python.exe C:/Users/yuan.li/Documents/GitHub/Python/Misc/爬虫/proxy.py当前代理IP 137.74.168.174:80通过-----------------------------当前代理IP 103.28.161.68:8080通过-----------------------------当前代理IP 91.151.106.127:53281HTTP Error 503: Service Unavailable-----------------------------当前代理IP 177.136.252.7:3128
-----------------------------当前代理IP 47.89.22.200:80通过-----------------------------当前代理IP 118.69.61.57:8888HTTP Error 503: Service Unavailable-----------------------------当前代理IP 192.241.190.167:8080通过-----------------------------当前代理IP 185.124.112.130:80通过-----------------------------当前代理IP 83.65.246.181:3128通过-----------------------------当前代理IP 79.137.42.124:3128通过-----------------------------当前代理IP 95.0.217.32:8080
-----------------------------当前代理IP 104.131.94.221:8080通过

不过上面这种方式只适合比较稳定的IP源,如果IP不稳定的话,可能很快对应的文本就失效了,最好可以动态地去获取最新的IP地址。很多网站都提供API可以实时地去查询

还是用刚才的网站,这次我们用API去调用,这里需要浏览器伪装一下才能爬取

#!/usr/bin/env python#! -*- coding:utf-8 -*-# Author: Yuan Liimport re,urllib.requestheaders=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")opener=urllib.request.build_opener()opener.addheaders=[headers]#安装为全局urllib.request.install_opener(opener)data=urllib.request.urlopen("http://www.thebigproxylist.com/members/proxy-api.php?output=all&user=list&pass=8a544b2637e7a45d1536e34680e11adf").read().decode('utf8')ippool=data.split('\n')for ip in ippool:    ip=ip.split(',')[0]    try:            print("当前代理IP "+ip)            proxy=urllib.request.ProxyHandler({
"http":ip}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) url="http://www.baidu.com" data=urllib.request.urlopen(url).read().decode('utf-8','ignore') print("通过") print("-----------------------------") except Exception as err: print(err) print("-----------------------------")fp.close()

结果如下:

C:\Python36\python.exe C:/Users/yuan.li/Documents/GitHub/Python/Misc/爬虫/proxy.py当前代理IP 213.233.57.134:80HTTP Error 403: Forbidden-----------------------------当前代理IP 144.76.81.79:3128通过-----------------------------当前代理IP 45.55.132.29:53281HTTP Error 503: Service Unavailable-----------------------------当前代理IP 180.254.133.124:8080通过-----------------------------当前代理IP 5.196.215.231:3128HTTP Error 503: Service Unavailable-----------------------------当前代理IP 177.99.175.195:53281HTTP Error 503: Service Unavailable

因为直接for循环来按顺序读取文本实在是太慢了,我试着改成多线程来读取,这样速度就快多了

#!/usr/bin/env python#! -*- coding:utf-8 -*-# Author: Yuan Liimport threadingimport queueimport re,urllib.request#Number of threadsn_thread = 10#Create queuequeue = queue.Queue()class ThreadClass(threading.Thread):    def __init__(self, queue):        threading.Thread.__init__(self)                super(ThreadClass, self).__init__()    #Assign thread working with queue        self.queue = queue    def run(self):        while True:        #Get from queue job            host = self.queue.get()            print (self.getName() + ":" + host)            try:                # print("当前代理IP " + host)                proxy = urllib.request.ProxyHandler({
"http": host}) opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler) urllib.request.install_opener(opener) url = "http://www.baidu.com" data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore') print("通过") print("-----------------------------") except Exception as err: print(err) print("-----------------------------") #signals to queue job is done self.queue.task_done()#Create number processfor i in range(n_thread): t = ThreadClass(queue) t.setDaemon(True) #Start thread t.start()#Read file line by linehostfile = open("c:\\temp\\thebigproxylist-17-12-20.txt","r")for line in hostfile: #Put line to queue queue.put(line)#wait on the queue until everything has been processedqueue.join()
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/2052791,如需转载请自行联系原作者
你可能感兴趣的文章
2019届高二(下)半期考试题(文科)
查看>>
【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>
SettingsNotePad++
查看>>
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
Angular2, NativeScript 和 React Native比较[翻译]
查看>>
论模式在领域驱动设计中的重要性
查看>>
国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
查看>>
微软将停止对 IE 8、9和10的支持
查看>>
微服务架构会和分布式单体架构高度重合吗
查看>>
如何测试ASP.NET Core Web API
查看>>
《The Age of Surge》作者访谈
查看>>