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中的代理应用与实践》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 【问题解决】java.lang.NoSuchMethodError错误

    问题现象 近期本人负责的一个SpringBoot模块出现了java.lang.NoSuchMethodError报错,问题情况如下: A类提供了setJumpType(String type),B类调 ...

  2. AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖

      随着我国石油工业的飞速发展,油库规模迅速扩大,油库系统逐渐完善起来.石油行业属于高风险行业,所以石油化工产品在储存.运输和生产各个环节,均有极高的安监.环保.应急的管理要求.通常情况下,油库容量. ...

  3. 容器的监控:使用cAdvisor,weavescope监控容器

    目录 一.系统环境 二.前言 三.容器监控的原理 四.使用docker stats监控容器 五.部署cadvisor监控容器 六.部署weavescope监控容器 一.系统环境 服务器版本 docke ...

  4. ThreadLocal原理详解——终于弄明白了ThreadLocal

    目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal ...

  5. 内存取证——volatility学习

    前言 在做计算机最后两道题目碰到了MP3格式的镜像,分析发现是计算机内存,要进行内存取证.现在内存取证在ctf比赛中也是常见的题目,内存取证是指在计算机系统的内存中进行取证分析,以获取有关计算机系统当 ...

  6. foxy rviz2 "rviz_common/Time"报错问题

    报错内容 The class required for this panel, 'rviz_common/Time', could not be loaded. Error: According to ...

  7. C#笔记(1)窗体

    1. 隐藏TabPage 在使用TabControl控件时,希望隐藏其中某个选项卡(即TabPage).设置该TabPage的父容器为null 即可,如TabPage.Parent = null .如 ...

  8. 算法金 | 一文读懂K均值(K-Means)聚类算法

    ​大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 1. 引言 数据分析中聚类算法的作用 在数据分析中,聚类算法用于发现数据集中的固有分 ...

  9. Vue前端的搭建(与后端JavaEE的连接)

    目录 前端平台搭建(Vue2.6,App:HBulderX) 创建Vue2.6项目 下载相应插件方便开发 路由配置 对连接后端进行一些配置(main.js文件) 导入ElementUI组件 组件 | ...

  10. mvn 打包报错:no compiler is provided in this environment

    最近公司换了电脑,系统也从 win7 升级到 win11,开发环境都重新安装了一遍,然后在 idea 用mvn 执行打包命令 mvn clean package 报错: no compiler is ...