【Python爬虫实战】爬虫封你ip就不会了?ip代理池安排上

news2025/1/11 17:04:35

前言

在进行网络爬取时,使用代理是经常遇到的问题。由于某些网站的限制,我们可能会被封禁或者频繁访问时会遇到访问速度变慢等问题。因此,我们需要使用代理池来避免这些问题。本文将为大家介绍如何使用IP代理池进行爬虫,并带有代码和案例。

1. 什么是IP代理池

IP代理池是一种能够动态获取大量代理IP地址的服务,通过不断更新代理IP列表和检测可用性,避免爬虫访问被封禁。代理池通常由多个代理服务器组成,而这些代理服务器提供的IP地址是不断变化的。

2. 如何使用IP代理池进行爬虫

使用IP代理池进行爬虫有以下几个步骤:

2.1 获取代理IP

获取代理IP的方法有多种,比如购买第三方代理服务、自己搭建代理服务器、爬取免费代理网站等。其中,爬取免费代理网站是最为常见的方法,但是免费代理大多数不稳定,质量也参差不齐,所以购买第三方代理服务或者自己搭建代理服务器会更加可靠。

2.2 构建代理池

将获取到的代理IP存储在一个代理池中,通常可以使用List或Queue等数据结构存储,然后按照一定的时间间隔进行检测,将失效的IP进行移除或重新获取新的IP存入池中。

2.3 在爬虫中使用代理IP

在爬虫的请求中使用代理IP,可以使用requests库或者Scrapy框架中的代理中间件进行实现。以requests库为例,需要在请求头中添加代理IP,如下所示:

import requests

proxies = {
  'http': 'http://ip:port',
  'https': 'http://ip:port',
}

response = requests.get(url, proxies=proxies)

2.4 异常处理

在爬虫的过程中,由于代理IP的稳定性和可用性不同,可能会遇到一些错误或异常情况。比如请求超时、代理IP失效、网络波动等。这时我们需要进行异常处理,可以设置重试请求、更换代理IP等方式来保证程序的正常运行。

3. 代码实现

以下是一个简单的IP代理池实现代码:

import requests
import threading
import time
from queue import Queue

# 获取代理IP
def get_proxies():
    # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    url ="http.//open.zdaye.com/ExclusiveProxy/GetIP/"
    response = requests.get(url).json()
    return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]

# 测试代理IP是否可用
def test_proxy(proxy, q):
    try:
        proxies = {
          'http': proxy,
          'https': proxy
        }
        response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=5)
        if response.status_code == 200:
            q.put(proxy)
            print(f"{proxy}可用")
    except:
        print(f"{proxy}不可用")

# 构建代理池
def build_proxies_pool():
    proxies_list = get_proxies()
    pool = Queue()
    threads = []
    # 开启多个线程对代理IP进行测试
    for proxy in proxies_list:
        t = threading.Thread(target=test_proxy, args=(proxy, pool))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    return pool

# 在爬虫中使用代理IP
def spider_request(url, proxies):
    try:
        response = requests.get(url, proxies={'http': proxies, 'https': proxies}, timeout=5)
        if response.status_code == 200:
            print(response.text)
    except:
        print(f"{proxies}请求失败")

if __name__ == '__main__':
    while True:
        pool = build_proxies_pool()
        if not pool.empty():
            proxies = pool.get()
            spider_request('http://httpbin.org/ip', proxies)
        time.sleep(5)

4. 案例分析

以爬取知乎用户信息为例,演示IP代理池的使用。

import requests
import random
import time

# 构造请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

# 获取代理IP
def get_proxies():
    # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    url ="http.//open.zdaye.com/ExclusiveProxy/GetIP/"
    response = requests.get(url).json()
    return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]

# 构造代理池
proxies_pool = get_proxies()

# 爬虫主体程序
def get_user_info(user_url):
    # 从代理池中随机选择一个代理IP
    proxies = random.choice(proxies_pool)
    try:
        response = requests.get(user_url, headers=headers, proxies={'http': proxies, 'https': proxies})
        if response.status_code == 200:
            print(response.text)
    except:
        print(f"{proxies}请求失败")

if __name__ == '__main__':
    user_list = ['https://www.zhihu.com/people/xie-ke-bai-11-86-24-2/followers',
                 'https://www.zhihu.com/people/gong-xin-10-61-53-51/followers',
                 'https://www.zhihu.com/people/y-xin-xin/followers']
    for user_url in user_list:
        get_user_info(user_url)
        time.sleep(5)

以上是一个简单的知乎用户信息爬虫程序,其中使用了IP代理池,避免了访问速度受限和访问被封禁的问题。

5. 总结

本文介绍了如何使用IP代理池避免被封禁和访问受限的问题,通过获取代理IP、构建代理池、在爬虫中使用代理IP以及异常处理等步骤进行实现。同时,结合了一个简单的案例进行演示,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二章:CompletableFuture

Future接口理论知识复习 Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 比如主线程让一个子线程去执行任务,子线程可能…

JBoss 5.x/6.x 反序列化漏洞复现(CVE-2017-12149)

一、漏洞说明 该漏洞存在于http invoker组件的ReadOnlyAccessFilter的doFilter中,在/invoker/readonly请求中,服务器将用户提交的POST内容进行了Java反序列化 二、搭建环境 cd vulhub/jboss/CVE-2017-12149 docker-compose up -d 三、漏洞验证 访问:80…

海南热带海洋学院金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​

海南热带海洋学院金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​

最新在线IDE流行度最新排名(每月更新)

2023年09月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧,那么TOP ODE索引可以帮助您决定在软件开发项目中…

Win10 ping 虚拟机kali 请求超时解决办法

出现这种问题应该是windows休眠导致的 这里我的解决方法是先禁用再启用连接 然后再ping 虚拟机ip和kali ip,发现就可以连上了

zookeeper没有.log日志,只有.out日志

zookeeper没有.log日志,只有.out日志 背景:发现zookeeper没有.log日志,只有.out日志 发现在logs目录下,只有.out文件,且每次重启zk,.out日志都会被覆盖写 为了有完整的log日志,需要如下参数 1…

2023上半年京东运动鞋服市场数据分析(京东数据运营)

大众线下运动生活恢复,掀起新一轮户外潮流,运动热潮迭起。由此产生的运动鞋服及专业装备需求,为运动品牌们带来了诸多增长机会。近日各大运动品牌陆续发布上半年财报,回答了品牌对复苏机遇、发展挑战的应对情况。接下来结合具体数…

LDR6020 USB PD3.1的 3组6通道CC控制SOC芯片介绍和运用

随着USB-IF 协会发布了全新的USB PD3.1规范,该规范将快充功率上限从100 W提升至240 W,充电功率的提升也让USB PD的应用领域更加广泛。 USB PD在手机、笔记本电脑,扩展到便携式设备、物联网设备、智能家居、通信和安防设备、汽车和医疗等领域…

SpringMVC文件的上传下载JRebel的使用

目录 前言 一、JRebel的使用 1.IDea内安装插件 2.激活 3.离线使用 使用JRebel的优势 二、文件上传与下载 1 .导入pom依赖 2.配置文件上传解析器 3.数据表 4.配置文件 5.前端jsp页面 6.controller层 7.测试结果 前言 当涉及到Web应用程序的开发时&…

IE浏览器打开变成别的浏览器怎么办

最近很多朋友发现自己的IE浏览器打开时会自动跳转到别的浏览器上去,又不知道怎么恢复回来。所以今天小编就来告诉大家解决的方法,下面就是详细的教程,想知道的快来看看吧。 IE浏览器打开变成别的浏览器解决方法 方法一 1、打开的浏览器中找…

DataTables.js综合应用开发(ajax筛选查询、同列数据汇总、环比数据)

筛选数据 <!--筛选数据--><div class"layui-card" style"margin-bottom: 50px;"><div class"layui-row"><form class"layui-form layui-col-md12" style"margin: 10px;"><div class"demoTa…

百望云蝉联2023「Cloud 100 China 」榜单 综合实力再获认可

9月7日&#xff0c;2023 Cloud 100 China 榜单于上海中心正式发布&#xff0c;榜单由靖亚资本与崔牛会联合推出&#xff0c;百望云凭借着过硬的综合实力与卓越的技术创新能力&#xff0c;再次荣登榜单&#xff0c;位居第六位。 本届评选&#xff0c;Top 100 企业的数据指标的权…

EMC滤波器对DC电源模块影响有多大?

BOSHIDA EMC滤波器对DC电源模块影响有多大&#xff1f; 随着电子设备的广泛应用&#xff0c;EMC&#xff08;电磁兼容性&#xff09;问题越来越受到关注。而EMC滤波器作为一种常见的电路器件&#xff0c;其作用在于抑制电源的干扰和防止外界干扰的影响。在DC电源模块的设计中&…

直击永悦科技半年报:双轮驱动下的“增长曲线”

詹姆斯卡斯的著作《有限与无限的游戏》中&#xff0c;传递出这样一种观点&#xff1a; “有限的游戏&#xff0c;其目的在于赢得胜利&#xff1b;无限的游戏&#xff0c;却旨在让游戏永远进行下去。有限的游戏在边界内玩&#xff0c;无限的游戏玩的就是边界。” 企业要实现持…

ME21N 采购订单新增页签增强

1、实现效果 根据客制化需求&#xff0c;要在采购订单中新增大量字段&#xff0c;所以要在界面上添加一个单独的页签。效果如下&#xff1a; 2、增强实现 2.1、增强结构 因为是在抬头上边添加&#xff0c;所以增强CI_EKKODB结构 2.2、函数组 仿照Function Group MEPOBADIEX…

vue 项目npm 打包遇到的一些bug记录

问题场景 &#xff1a;npm 的版本正确&#xff0c;nodejs 的版本也是正常的&#xff0c;之前npm run build 打包都正常没问题&#xff0c;但是因为其他原因电脑重装了&#xff0c;环境重新配置了。npm run dev 跑没问题,打包就报错了&#xff0c;信息如下&#xff1a; rc/util…

Java从入门到精通-数组(三)

0. 数组 1. 数组概述 练习1&#xff1a; 创建一个整数数组&#xff0c;存储喜欢的5个数字&#xff0c;并编写代码打印出这些数字。 创建一个整数数组 public class Main {public static void main(String[] args) {// 创建一个整数数组&#xff0c;存储5个喜欢的数字int[] f…

G4学术期刊《中学教学参考》简介及投稿要求

G4学术期刊《中学教学参考》简介及投稿要求 《中学教学参考》为广西教育学院杂志社主办的国内外公开发行刊物&#xff0c;坚持为基础教育服务的宗旨&#xff0c;竭诚为全国教育工作者服务&#xff0c;提供最新教改信息和教育理论成果&#xff0c;为广大教育工作者交流经验、发…

python系列:requests库+BS4库及综合实例

仅供学习、交流使用&#xff0c;不具有任何商业用途&#xff0c;如有问题请及时联系我们以作处理。 文章目录 前言requests安装使用第一种 requests.request("请求方式", ...)第二种 requests.请求方式(参数)URL中传递参数 paramsxx响应内容 r.text二进制响应内容 r.…

从零开始的PICO教程(1)Pico游戏开发项目配置

从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置 文章目录 从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置一、前言1、大纲 二、成为Pico开发者1、注册 PICO 开发者帐号2、创建组织3、创建应用 三、导入PICO的SDK1、PICO设备开启 “开发者…