经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
《探索Python Requests中的代理应用与实践》
来源:cnblogs  作者:存子  时间:2024/7/12 14:25:38  对本文有异议

requests加代理

高匿API代理

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

存活期1到2分钟

  1. import time
  2. import requests
  3. from lxml import etree
  4. response = requests.get('https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=&wt=json&method=https&city=&province=').json()
  5. for ip in response['data']:
  6. proxy = f'http://{ip["ip"]}:{ip["port"]}'
  7. print(proxy)
  8. proxies = {
  9. 'http': proxy,
  10. 'https': proxy
  11. }
  12. # 加代理
  13. # requests是proxies: {
  14. # 'http': proxy,
  15. # 'https': proxy
  16. # }
  17. headers = {
  18. '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'
  19. }
  20. source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers).content.decode('utf-8')
  21. # source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
  22. IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
  23. print(f"IP: {IP}")

注意

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

隧道代理(短效版)

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

介绍:

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

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

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

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

弊端:

  • 有的网站跳转使它的代理IP加不上,但代理服务商提供的接口文档提供了解决方案
  1. from lxml import etree
  2. import requests
  3. target_url = "https://tool.lu/ip/"
  4. proxy_host = 'http-short.xiaoxiangdaili.com'
  5. proxy_port = 10010
  6. proxy_username = '1128907524343746560'
  7. proxy_pwd = 'wZ3WMRtm'
  8. proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
  9. "host": proxy_host,
  10. "port": proxy_port,
  11. "user": proxy_username,
  12. "pass": proxy_pwd,
  13. }
  14. proxies = {
  15. 'http': proxyMeta,
  16. 'https': proxyMeta,
  17. }
  18. try:
  19. # 设置手动切换IP
  20. headers = {
  21. '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',
  22. 'Proxy-Switch-Ip': 'true'
  23. }
  24. source = requests.get(url=target_url, proxies=proxies, headers=headers).content.decode('utf-8')
  25. IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
  26. print(f"IP: {IP}")
  27. # IP: ['你的外网IP地址是:110.88.30.181']
  28. # IP: ['你的外网IP地址是:49.74.88.38']
  29. except Exception as e:
  30. 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池的补充

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

    1. import time
    2. import requests
    3. from lxml import etree
    4. import redis
    5. # 建立redis连接
    6. r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True)
    7. while True:
    8. try:
    9. # 取出代理IP
    10. rr = r.rpop('my_proxy').split('|')
    11. ip = rr[0]
    12. score = int(rr[1])
    13. # 添加代理IP
    14. proxy = f'http://{ip}'
    15. proxies = {
    16. 'http': proxy,
    17. 'https': proxy
    18. }
    19. print(f"代理IP: {proxy}")
    20. # 加代理
    21. headers = {
    22. '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'
    23. }
    24. source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers)
    25. # source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
    26. except Exception as e:
    27. print(e)
    28. if score < 3:
    29. score += 1
    30. print(f'请求{ip}出错,分数为:{score}')
    31. r.lpush('my_proxy', f'{ip}|{score}')
    32. else:
    33. print(f'舍弃{ip}')
    34. continue
    35. IP = etree.HTML(source.content.decode('utf-8')).xpath("//form[@id='main_form']/p[1]/text()")
    36. print(f"IP: {IP}")
    37. print(f"状态码:{source.status_code}")
    38. if source.status_code in (200, 302):
    39. r.lpush('my_proxy', f'{ip}|0')
    40. else:
    41. if score < 3:
    42. score += 1
    43. print(f'请求{ip}出错,分数为:{score}')
    44. r.lpush('my_proxy', f'{ip}|{score}')
    45. else:
    46. print(f'舍弃{ip}')

更多精致内容

原文链接:https://www.cnblogs.com/CodeRealm/p/18298300

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号