首页 > 其他分享 >urllib自定义opener对象设置代理IP

urllib自定义opener对象设置代理IP

时间:2024-09-16 16:03:33浏览次数:12  
标签:自定义 handler IP urllib opener build context OpenerDirector klass

urllib.request.urlopen()源代码——urlopen()在干什么

返回opener.open(url, data, timeout)方法的结果
  _opener = None  # _opener被赋值为None
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
    global _opener
    if cafile or capath or cadefault:
        import warnings
        warnings.warn("cafile, capath and cadefault are deprecated, use a "
                      "custom context instead.", DeprecationWarning, 2)
        if context is not None:
            raise ValueError(
                "You can't pass both context and any of cafile, capath, and "
                "cadefault"
            )
        if not _have_ssl:
            raise ValueError('SSL support not available')
        context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH,
                                             cafile=cafile,
                                             capath=capath)
        # send ALPN extension to indicate HTTP/1.1 protocol
        context.set_alpn_protocols(['http/1.1'])
        https_handler = HTTPSHandler(context=context)
        opener = build_opener(https_handler)
    elif context:
        https_handler = HTTPSHandler(context=context)
        opener = build_opener(https_handler)
    elif _opener is None:  # 默认情况下会调用build_opener()
        _opener = opener = build_opener()
    else:
        opener = _opener
    return opener.open(url, data, timeout)

urllib.request.build_opener()

build_opener()函数返回的是OpenerDirector类的实例
 def build_opener(*handlers):
    opener = OpenerDirector()  # 创建OpenerDirector类的实例opener
    default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
                       HTTPDefaultErrorHandler, HTTPRedirectHandler,
                       FTPHandler, FileHandler, HTTPErrorProcessor,
                       DataHandler]
    if hasattr(http.client, "HTTPSConnection"):
        default_classes.append(HTTPSHandler)
    skip = set()
    for klass in default_classes:
        for check in handlers:
            if isinstance(check, type):
                if issubclass(check, klass):
                    skip.add(klass)
            elif isinstance(check, klass):
                skip.add(klass)
    for klass in skip:
        default_classes.remove(klass)

    for klass in default_classes:
        opener.add_handler(klass())

    for h in handlers:
        if isinstance(h, type):
            h = h()
        opener.add_handler(h)
    return opener  # 返回实例opener

urllib.request.OpenerDirector().open()

Class OpenerDirectorOpenerDirector为一个类。由上面的代码opener = build_opener()得,opener为OpenerDirector类的一个实例即根据OpenerDirector类创建的对象(build_opener()将创建的实例赋值给opener)。

所以urlopen返回的结果是opener.open()方法的结果——响应(response),而opener.open()是一个更底层的方法,它允许自定义opener对象发送特定的请求,获取响应结果。

自定义opener对象发送请求(添加网络代理Proxy)

在build_opener()函数的参数中添加一个或多个处理程序(handlers)

from urllib.request import Request, ProxyHandler, build_opener
# 设置访问地址
url = 'http://httpbin/get'
# 设置请求对象
req = Request(url)
# 构建可以使用代理的服务器
# ProxyHandler({'type': 'ip: port'})
handler = ProxyHandler()
# 构建一个opener对象
opener = build_opener(handler)
# 发送请求
resp = opener.open(req)
# 打印结果
print(resp.read().decode())

使用OpenerDirector类的add_handler()方法

 

爬虫设置代理就是让别的服务器代替自己的服务器去获取数据。

代理分类

代理网站

小象代理

快代理

云代理

66ip代理

站大爷

开心代理

讯代理

标签:自定义,handler,IP,urllib,opener,build,context,OpenerDirector,klass
From: https://www.cnblogs.com/qyly/p/18416308

相关文章

  • 深入理解 ECMAScript 和 JavaScript
    目录ECMAScript是什么?JavaScript是什么?示例ECMAScript示例JavaScript示例总结ECMAScript是什么?ECMAScript是一个由国际标准化组织ECMA(欧洲计算机制造商协会)维护的脚本语言标准。这个标准定义了一种脚本语言的基本特性,包括语法、类型系统、内置对象、关键字等......
  • 鸿蒙开发入门day18-自定义扩展
    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ)目录自定义扩展能力概述AttributeModifierAttributeUpdaterAttributeModifier概述接口定义行为规格属性设置与修改设置多态样式、事件AttributeUpdater概述接口定......
  • Python编程之旅:定义自定义异常的艺术
    引言在实际开发过程中,我们经常会遇到各种各样的错误情况,如数据类型不符、资源访问失败等。这时候,合理地使用异常处理机制就显得尤为重要了。Python内置了许多异常类,但有时候它们并不能完全满足我们的需求。这时,就需要我们自己动手定义一些特定场景下的异常类型了。定义自定义异常......
  • JavaScript-apply、bind、call
    call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向区别 applyapply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次当第一个参数......
  • JavaScript 手写new操作符
    new关键字的工作步骤创建一个新的对象obj将对象与构建函数通过原型链连接起来将构建函数中的this绑定到新建的对象obj上根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理constrecodeNew=function(Func,...args){//获取函数对象......
  • SciTech-Mathmatics-Probability+Statistics-Descriptive Statistics I + II(using Py
    LearnStatsforPython:DescriptiveStatisticsILearnStatsforPython:DescriptiveStatisticsII+DataVisualizationBYIVÁNPALOMARESCARRASCOSAPOSTEDONAUGUST28,2024Intoday'sworld,pervadedbydataandAI-driventechnologiesandsolutions,......
  • 自定义字体加载
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>CustomFontLoading</ti......
  • 【油猴脚本】00008 案例 Tampermonkey油猴脚本,动态渲染表格-实现页面动态-添加表格列,
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 数据库tips19
    分布式数据库系统中的两阶段提交协议(2PC),其内容为:协调器向所有参与者发送Prepare消息;各参与者若愿意提交属于自己的部分,则向协调器发ready消息,否则发abort消息;协调器收到所有参与者的ready消息后,方能再向所有参与者发commit消息,否则若超时或有一个参与者发来了abort消息,则协调......
  • kettle从入门到精通 第八十五课 ETL之kettle kettle中javascript步骤调用外部javascri
     场景:交流学习群里面有小伙伴咨询kettle中的javascript代码步骤如何调用外部js文件中的函数,觉得有点意思的,于是就抽时间整理了一下。 1、外部js文件为test.js,代码如下:functiontest(param){return"接收到了参数"+param;}2、当时没有过多考虑,在本地简单写了个demo测......