Python 爬虫IP代理池的实现

简介:

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

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

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

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

#!/usr/bin/env python
#! -*- coding:utf-8 -*-
# Author: Yuan Li

import re,urllib.request

fp=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:53281

HTTP Error 503: Service Unavailable
-----------------------------
当前代理IP 177.136.252.7:3128

<urlopen error [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond>
-----------------------------
当前代理IP 47.89.22.200:80

通过
-----------------------------
当前代理IP 118.69.61.57:8888

HTTP 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

<urlopen error [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond>
-----------------------------
当前代理IP 104.131.94.221:8080

通过

不过上面这种方式只适合比较稳定的IP源,如果IP不稳定的话,可能很快对应的文本就失效了,最好可以动态地去获取最新的IP地址。很多网站都提供API可以实时地去查询
还是用刚才的网站,这次我们用API去调用,这里需要浏览器伪装一下才能爬取

#!/usr/bin/env python
#! -*- coding:utf-8 -*-
# Author: Yuan Li

import re,urllib.request

headers=("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:80
HTTP Error 403: Forbidden
-----------------------------
当前代理IP 144.76.81.79:3128
通过
-----------------------------
当前代理IP 45.55.132.29:53281
HTTP Error 503: Service Unavailable
-----------------------------
当前代理IP 180.254.133.124:8080
通过
-----------------------------
当前代理IP 5.196.215.231:3128
HTTP Error 503: Service Unavailable
-----------------------------
当前代理IP 177.99.175.195:53281
HTTP Error 503: Service Unavailable

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

#!/usr/bin/env python
#! -*- coding:utf-8 -*-
# Author: Yuan Li

import threading
import queue
import re,urllib.request

#Number of threads
n_thread = 10
#Create queue
queue = 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 process
for i in range(n_thread):
    t = ThreadClass(queue)
    t.setDaemon(True)
    #Start thread
    t.start()

#Read file line by line
hostfile = 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 processed
queue.join()





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/2052791,如需转载请自行联系原作者

目录
相关文章
|
16天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
|
3月前
|
机器学习/深度学习 算法 机器人
使用 Python TorchRL 进行多代理强化学习
本文详细介绍了如何使用TorchRL库解决多代理强化学习(MARL)问题,重点讨论了在多代理环境中应用近端策略优化(PPO)。通过使用VMAS模拟器,该文展示了如何在GPU上并行训练多机器人系统,使其在避免碰撞的同时到达目标。文章涵盖了依赖项安装、PPO原理、策略与评论家网络设计、数据收集及训练循环,并强调了TorchRL在简化开发流程、提升计算效率方面的优势。无论是集中式还是分布式评论家配置,TorchRL均能有效支持复杂的MARL研究与实践。
58 5
使用 Python TorchRL 进行多代理强化学习
|
3月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
1月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
181 66
|
14天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
17天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
1月前
|
数据采集 JavaScript 前端开发
JavaScript逆向爬虫——使用Python模拟执行JavaScript
JavaScript逆向爬虫——使用Python模拟执行JavaScript
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
1月前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
26 7
|
2月前
|
数据采集 中间件 定位技术
新手爬虫er必刷!如何使用代理IP全攻略!
在爬虫开发中,代理IP是规避IP封锁和请求频率限制的重要工具,通过分散请求压力并模拟不同地理位置,提高数据抓取稳定性和成功率。本文详细介绍了代理IP的基本概念、选择服务的关键因素、获取及使用方法,包括Python中的Requests库和Scrapy框架的具体应用,以及IP管理与轮换策略,帮助新手掌握代理IP的使用技巧。