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

coderealm 2024-07-12 14:39:00 阅读 58

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

requests加代理

高匿API代理

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

存活期1到2分钟

<code>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']:code>

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()")code>

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()")code>

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']:code>

    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()")code>

    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}')

更多精致内容



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。