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. UE4 C++调用手柄震动

    近期封装输入相关逻辑,简单归纳下. 蓝图实现 内容界面右键Miscellaneous->Force Feedback Effect,创建力反馈对象并填写相关参数: 然后在蓝图中用Spawn Fo ...

  2. 微信H5分享不能展示卡片问题

    来源与微信开放社区 微信H5已成功接入,微信api以及配置项验证正常,通过手机微信里面链接打开页面进行分享,分享出去的还是链接, 需要从以下场景进入才可以正常分享卡片 从二维码进入 分享卡片进入 公众 ...

  3. YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

    前言 今天大姚给大家分享一款基于.NET Core Web + Bootstrap的企业级快速后台开发框架.权限管理系统,代码简单易懂.界面简洁美观(基于MIT License开源,免费可商用):Yi ...

  4. flutter开发环境的搭建

    下载flutter开发包,有670M左右. github的下载地址:https://github.com/flutter/flutter 或者官方下载地址:https://flutter.dev/do ...

  5. c#事件的实际应用场景

    最简单的定义事件的语法 public event Action<bool> Refreash; 先介绍这个Action 这个Action是委托的快速实现方式,我用.net framewor ...

  6. 工作面试老大难-MySQL中的锁类型

    MySQL 是支持ACID特性的数据库.我们都知道"C"代表Consistent,当不同事务操作同一行记录时,为了保证一致性,需要对记录加锁.在MySQL 中,不同的引擎下的锁行为 ...

  7. Json.NET Converting between JSON and XML

    Json.NET supports converting JSON to XML and vice versa using the XmlNodeConverter. Elements, attrib ...

  8. JVM面试篇(下)

    垃圾收集器 简述 Java 垃圾回收机制 在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行 ...

  9. C#窗体内控件大小随窗体等比例变化

    一.首先定义全局变量 1 private float X;//当前窗体的宽度 2 private float Y;//当前窗体的高度 3 private bool IsFirst = true; 二. ...

  10. 以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的

    本文基于 OpenJDK17 进行讨论 1. Reference 相关概念及其应用场景总览 Reference(引用)是 JVM 中非常核心且重要的一个概念,垃圾回收器判断一个对象存活与否都是围绕着这 ...