《探索Python Requests中的代理应用与实践》

python,requests · 浏览次数 : 0

小编点评

很抱歉,我无法直接为您提供代码执行结果。但是,我可以为您提供一个Python脚本,该脚本使用了`requests`库和`lxml`库来抓取网站数据并打印代理IP。 首先,请确保您已安装了`requests`和`lxml`库。在命令行中运行以下命令来安装它们: ```bash pip install requests pip install lxml ``` 然后,将以下代码保存为一个名为`proxy_crawler.py`的文件: ```python import requests from lxml import etree import redis # 代理IP池 proxy_pool = [] # 获取代理IP def get_proxy(): url = 'https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=5&wt=json&method=https&city=&province=' response = requests.get(url) response_json = response.json() for ip in response_json['data']: proxy = f'{ip["ip"]}:{ip["port"]}|0' proxy_pool.append(proxy) # 打印代理IP def print_proxy(): print("代理IP:") for ip in proxy_pool: print(ip) # 启动代理IP抓取程序 if __name__ == "__main__": get_proxy() print_proxy() ``` 运行`proxy_crawler.py`文件: ```bash python proxy_crawler.py ``` 这个脚本会自动从飞鱼API获取代理IP,并将它们添加到`proxy_pool`列表中。然后,它会定期从列表中取出代理IP并打印出来。

正文

requests加代理

高匿API代理

此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理

存活期1到2分钟

import time
import requests
from lxml import etree

response = requests.get('https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=&wt=json&method=https&city=&province=').json()
for ip in response['data']:
    proxy = f'http://{ip["ip"]}:{ip["port"]}'
    print(proxy)
proxies = {
    'http': proxy,
    'https': proxy
}


# 加代理
# requests是proxies: {
#     'http': proxy,
#     'https': proxy
# }
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers).content.decode('utf-8')
# source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")

print(f"IP: {IP}")

注意

proxies = {
    'http': proxy,
    'https': proxy
}
这个指的是代理服务商提供的代理服务器支持什么请求,两个都加比较保险。
如果代理服务器支持http,但你发送https请求,代理服务器不会对你的请求进行转发,但是会消耗你的代理IP

隧道代理(短效版)

此处用的小象代理,1元1小时,便宜,可以尝试加下代理

介绍:

隧道代理,一分钟自动更换IP,不需要人为搭建代理IP池去加代理IP。

隧道代理有并发请求限制,默认每秒允许 5 个请求。

也可以手动切换代理IP(但切换间隔最低10秒):可以爬取网站报错时尝试手动切换IP。

但一般一分钟自动切换已经很快了

弊端:

  • 有的网站跳转使它的代理IP加不上,但代理服务商提供的接口文档提供了解决方案
from lxml import etree

import requests

target_url = "https://tool.lu/ip/"
proxy_host = 'http-short.xiaoxiangdaili.com'
proxy_port = 10010
proxy_username = '1128907524343746560'
proxy_pwd = 'wZ3WMRtm'

proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
    "host": proxy_host,
    "port": proxy_port,
    "user": proxy_username,
    "pass": proxy_pwd,
}

proxies = {
    'http': proxyMeta,
    'https': proxyMeta,
}

try:
    # 设置手动切换IP
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
        'Proxy-Switch-Ip': 'true'
    }
    source = requests.get(url=target_url, proxies=proxies, headers=headers).content.decode('utf-8')
    IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")

    print(f"IP: {IP}")
    # IP: ['你的外网IP地址是:110.88.30.181']
    # IP: ['你的外网IP地址是:49.74.88.38']

except Exception as e:
    print(e)

隧道代理(动态转发版)

隧道代理(动态转发)无须自己提取代理IP,在用户隧道内每一个请求通过一个随机 IP 进行转发,也就是ip存活时间不长。

弊端:

  • IP存活时间不长

适用:

  • 如果网站只是单纯的封ip,而不以IP生成cookie,并用cookie进行登录抓取数据,可以用动态转发版。

高匿API代理和隧道代理(短效版)

  • 高匿API代理:可以取出来IP并看到,按量或按时购买

  • 隧道代理:无法取出来IP并看到,隧道帮你切,只能按时购买

部署一个属于自己的可以获取代理IP的服务器

  • 用户
    • 调用普通服务器的IP加端口号,获取代理IP
  • 普通服务器
    • 开设一个端口:用来接受拨号服务器发来的IP
    • 再开设一个端口:用来展示接受到的IP
  • vps动态拨号服务器
    • 拨号上网,关闭网络,之后服务器更换一次IP。
    • 用miniproxy软件占用一个端口进行请求转发。
    • 服务器有一套程序获取自身IP地址,利用socket协议与普通服务器进行通信,向普通服务器发送我们的IP,每更换一次IP就发送一次。

野生代理

市面上有野生代理,安全性低、稳定性差,不能用

来源:

  • 黑客攻击别人电脑,在别人电脑开设端口:设置转发请求服务
    • 如果别人电脑是个小服务器,可能IP可用时间还长点
    • 如果别人电脑是个私人电脑,关机你就没法用了
  • 代理服务器未知,可能会获取你的请求携带的隐私

刷票

刷票程序一般根据IP进行票数计算,可以根据代理IP进行刷票

简易代理IP池

此处用到redis数据库作为IP池

这个只是简易代理IP池,理解其思想即可,后续我会发布一个复杂代理IP池,是一个项目,可以用于实战的。

思想:

add_IP:如果IP池少于5,则补充,补充的IP初始分数为0

get_IP:取出一个代理IP,进行访问,访问失败,则分数加1,若分数小于3则插回IP池,若分数大于等于3则舍弃

  • 代理IP池的补充

    import time
    import requests
    import redis
    
    # 建立redis连接
    r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True)
    # decode_responses=True: redis中存储二进制数据, True表示取出数据自动进行解码
    while True:
        if r.llen("my_proxy") < 5:
            response = requests.get(
                'https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=5&wt=json&method=https&city=&province=').json()
            for ip in response['data']:
                proxy = f'{ip["ip"]}:{ip["port"]}|0'
                r.lpush('my_proxy', proxy)
        else:
            print("代理IP池已经满了")
            time.sleep(5)
    
  • 代理IP池的弹出使用

    import time
    import requests
    from lxml import etree
    import redis
    
    # 建立redis连接
    r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True)
    while True:
        try:
            # 取出代理IP
            rr = r.rpop('my_proxy').split('|')
            ip = rr[0]
            score = int(rr[1])
            # 添加代理IP
            proxy = f'http://{ip}'
            proxies = {
                'http': proxy,
                'https': proxy
            }
            print(f"代理IP: {proxy}")
            # 加代理
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
            }
            source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers)
            # source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
    
        except Exception as e:
            print(e)
            if score < 3:
                score += 1
                print(f'请求{ip}出错,分数为:{score}')
                r.lpush('my_proxy', f'{ip}|{score}')
            else:
                print(f'舍弃{ip}')
            continue
    
        IP = etree.HTML(source.content.decode('utf-8')).xpath("//form[@id='main_form']/p[1]/text()")
        print(f"IP: {IP}")
        print(f"状态码:{source.status_code}")
        if source.status_code in (200, 302):
            r.lpush('my_proxy', f'{ip}|0')
        else:
            if score < 3:
                score += 1
                print(f'请求{ip}出错,分数为:{score}')
                r.lpush('my_proxy', f'{ip}|{score}')
            else:
                print(f'舍弃{ip}')
    

更多精致内容

与《探索Python Requests中的代理应用与实践》相似的内容:

《探索Python Requests中的代理应用与实践》

本文详细介绍了如何在Python的requests库中使用高匿代理和隧道代理,以及如何部署一个简易的代理IP池来提高爬虫的稳定性和匿名性。同时,文章还深入探讨了野生代理的来源及其潜在的安全风险和使用限制。这篇文章适合希望进一步了解代理技术及其在网络爬虫开发中应用的读者。

Python生成器深度解析:构建强大的数据处理管道

# 前言 生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。 ## 生成器的定义

Python多线程编程深度探索:从入门到实战

title: Python多线程编程深度探索:从入门到实战 date: 2024/4/28 18:57:17 updated: 2024/4/28 18:57:17 categories: 后端开发 tags: 多线程 并发编程 线程安全 Python 异步IO 性能优化 实战项目 第1章:Pyth

< Python全景系列-6 > 掌握Python面向对象编程的关键:深度探索类与对象

Python全景系列的第六篇,本文将深入探讨Python语言中的核心概念:类(Class)和对象(Object)。我们将介绍这些基本概念,然后通过示例代码详细展示Python中的类和对象如何工作,包括定义、实例化和修改等操作。本文将帮助您更深入地理解Python中的面向对象编程(OOP),并从中提出一些不常见但很有用的技术观点。

掌握Python文件操作:从基础到高阶的全方位探索

**在本篇博客中,我们将全面、深入地探讨Python中的文件操作。文件操作在Python编程中是不可或缺的一部分,它包含了打开、读取、写入和关闭文件等各种操作。我们将从基础的文件操作讲解到高级的文件处理技巧,以及如何优雅地使用Python进行文件操作。每一部分我们都会分享一些独特的用法,并且附有具体

Anaconda安装Python的seaborn库

本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法。 seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单、更漂亮的界面来创建各种统计图形。seaborn模块主要用于数据探索、数据分析和数据可视化,使得我们在Python中创

Python正则表达式完全指南

**本篇文章将深入探讨python的一项强大工具:正则表达式。正则表达式是一个强大的文本处理工具,可以用来匹配,搜索,替换和解析文本。我们将逐步展示如何在Python中使用正则表达式,包括其基本语法,常见用法和一些高级技巧。而在最后的“one more thing”部分,我们将探索一个不为人知但又非

如何利用 Seaborn 实现高级统计图表

本文分享自华为云社区《使用 Seaborn 实现高级统计图表从箱线图到多变量关系探索》 ,作者:柠檬味拥抱。 在数据科学和数据可视化领域,Seaborn 是一个备受欢迎的 Python 可视化库。它建立在 Matplotlib 的基础之上,提供了更简洁、更美观的图形界面,同时也具备了一些高级统计图表

实践探讨Python如何进行异常处理与日志记录

本文分享自华为云社区《Python异常处理与日志记录构建稳健可靠的应用》,作者:柠檬味拥抱。 异常处理和日志记录是编写可靠且易于维护的软件应用程序中至关重要的组成部分。Python提供了强大的异常处理机制和灵活的日志记录功能,使开发人员能够更轻松地管理代码中的错误和跟踪应用程序的执行过程。在本文中,

Python Flask - 快速构建Web应用详解

本文将详细探讨Python Flask Web服务。我将首先简单介绍Flask,然后将逐步进入Flask中的路由、模板、表单处理以及数据库集成等高级概念,目标是能够让大家了解并掌握使用Flask来创建动态Web应用的技巧。 ## 1. Flask简介 Flask是一个轻量级的Web服务器网关接口(W