关于Requests代理,你必须知道的

Posted ljz-2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Requests代理,你必须知道的相关的知识,希望对你有一定的参考价值。

关于Requests代理,你必须知道的

说到代理,写过爬虫的小伙伴一定都不陌生。但是你的代理真的生效了么

代理主要分为以下几类:

技术图片

如果是爬虫的话,最常见的选择是高匿代理。

Requests 设置代理非常方便,只需传递一个 proxies 参数即可。如官方示例:

import requests

proxies = 
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',


requests.get('http://example.org', proxies=proxies)

留意一个地方,proxies 字典中有两个 key :https 和 http,为什么要写两个 key,如果只有一个可以么?

试试就知道了

准备验证函数

这个函数会使用代理去访问两个 IP 验证网站,一个是 https,一个是 http。

import requests
from bs4 import BeautifulSoup


def validate(proxies):
    https_url = 'https://ip.cn'
    http_url = 'http://ip111.cn/'
    headers = 'User-Agent': 'curl/7.29.0'
    https_r = requests.get(https_url, headers=headers, proxies=proxies, timeout=10)
    http_r = requests.get(http_url, headers=headers, proxies=proxies, timeout=10)
    soup = BeautifulSoup(http_r.content, 'html.parser')
    result = soup.find(class_='card-body').get_text().strip().split('''\n''')[0]

    print(f"当前使用代理:proxies.values()")
    print(f"访问https网站使用代理:https_r.json()")
    print(f"访问http网站使用代理:result")

测试

  • Case 1

    proxies = 
        'http': '222.189.244.56:48304',
        'https': '222.189.244.56:48304'
    
    validate(proxies)

    输出

    当前使用代理:dict_values(['222.189.244.56:48304', '222.189.244.56:48304'])
    访问https网站使用代理:'ip': '222.189.244.56', 'country': '江苏省扬州市', 'city': '电信'
    访问http网站使用代理:222.189.244.56 China / Nanjing

    结果: 访问两个网站均使用了代理

  • Case 2

    proxies = 
        'http': '222.189.244.56:48304'
    
    validate(proxies)

    输出

    当前使用代理:dict_values(['222.189.244.56:48304'])
    访问https网站使用代理:'ip': '118.24.234.46', 'country': '重庆市', 'city': '腾讯'
    访问http网站使用代理:222.189.244.56 China / Nanjing

    结果: 只有http请求使用了代理

  • Case 3

    proxies = 
        'https': '222.189.244.56:48304'
    
    validate(proxies)

    输出

    当前使用代理:dict_values(['222.189.244.56:48304'])
    访问https网站使用代理:'ip': '222.189.244.56', 'country': '江苏省扬州市', 'city': '电信'
    访问http网站使用代理:118.24.234.46 China / Nanning

    结果: 只有https请求使用了代理

其他测试

通过 wireshark 抓包发现,当协议不匹配时,根本不会向代理服务器发起请求。

通过 postman 测试,结果与 Requests 一致,协议不同的情况下,不会走代理。

猜测可能是一种约定或者规则,类似 PAC ?(如果你知道答案,请告诉我)

结论

** 在 Requests 中,代理必须和目标网站具有相同的协议(http / https)的时候,才能生效。**

参考链接

以上是关于关于Requests代理,你必须知道的的主要内容,如果未能解决你的问题,请参考以下文章

在requests模块中使用代理发送请求

Python爬虫 - requests(高级)

毕业生必须知道:干部身份三方协议派遣证人事代理户口迁移 编制工龄签约档案

requests模块的高级应用

程序员必须会的小技巧:代理ip

程序员必须会的小技巧:代理ip