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,如需转载请自行联系原作者

目录
相关文章
|
6天前
|
数据采集 存储 架构师
上进计划 | Python爬虫经典实战项目——电商数据爬取!
在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优惠券都是消费者在网购时的刚需,但在这些“优惠”背后已产生灰色地带。
|
5天前
|
数据采集 存储 开发者
Python爬虫实战:打造高效数据采集工具
本文将介绍如何利用Python编写一个高效的网络爬虫,实现对特定网站数据的快速抓取与处理,帮助开发者更好地应对大规模数据采集的需求。
|
6天前
|
JSON JavaScript 文件存储
Python爬虫之文件存储#5
TXT文件存储、JSON文件存储、CSV文件存储【2月更文挑战第16天】
27 2
Python爬虫之文件存储#5
|
7天前
|
数据采集 数据挖掘 API
主流电商平台数据采集API接口|【Python爬虫+数据分析】采集电商平台数据信息采集
随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序,抓取电商平台的商品信息、价格、评论等数据。 当然,如果是电商企业,跨境电商企业,ERP系统搭建,我们经常需要采集的平台多,数据量大,要求数据稳定供应,有并发需求,那就需要通过接入电商API数据采集接口,封装好的数据采集接口更方便稳定高效数据采集。
|
8天前
|
数据采集 数据处理 开发者
Python爬虫技术在数据收集与分析中的应用
随着互联网信息的爆炸式增长,数据收集与分析变得愈发重要。本文将介绍Python爬虫技术在实际项目中的应用,探讨其在数据收集、清洗和分析过程中的作用,以及如何利用Python相关库提高爬虫效率。
|
6天前
|
数据采集 前端开发 JavaScript
Python爬虫 pyquery库详解#4
pyquery 初始化,基本CSS选择器,查找节点,遍历,节点操作,伪类选择器【2月更文挑战第15天】
23 1
Python爬虫 pyquery库详解#4
|
6天前
|
存储 NoSQL MongoDB
Python爬虫之非关系型数据库存储#5
MongoDB、Redis【2月更文挑战第18天】
35 1
|
1天前
|
数据采集 数据可视化 Java
分享66个Python爬虫源码总有一个是你想要的
分享66个Python爬虫源码总有一个是你想要的
11 1
|
1天前
|
JavaScript 前端开发 Go
Python爬虫之Splash详解#7
Splash 基本使用、Splash Lua脚本、Splash对象属性、Splash对象方法、Splash API调用等。【2月更文挑战第27天】
5 0
|
1天前
|
数据采集 存储 前端开发
Python爬虫实战:动态网页数据抓取与分析
本文将介绍如何利用Python编写爬虫程序,实现对动态网页的数据抓取与分析。通过分析目标网站的结构和请求方式,我们可以利用Selenium等工具模拟浏览器行为,成功获取到需要的数据并进行进一步处理与展示。

相关产品

  • 云迁移中心