Python 基于 urllib 使用 Handler 处理器(代理)

本文介绍了Python使用urllib库中的Handler处理HTTP请求,包括设置自定义Header以防止被识别为爬虫,以及如何利用ProxyHandler进行IP代理,避免因频繁访问同一IP导致被封。示例代码详细演示了如何配置和使用这些功能来爬取网页内容。
摘要由CSDN通过智能技术生成

一、简介

  • 为啥要使用 Handler?

    1、urllib.request.urlopen(url) 不能定制请求头。

    2、urllib.request.Request(url, data, headers) 可以定制请求头。

    3、Handler 定制更高级的请求头(随着业务逻辑的复杂,请求对象的定制已经满足不了需求,比如:动态 cookie和代理不能使用请求对象的定制)。

  • 要爬取的各种各样的网页,有一部填写需要验证码,有的需要 cookie,还有更多许多高级的功能,会阻碍你爬,而对于 openurl 单纯点理解就是打开网页。openurl 打开一个网址,它可以是一个字符串或者是一个 request 对象。而 build_opener 就是多了 handler,处理问题更专,更个性化。

  • 简单使用,通过 Handler 去完成 urlopen 打开网页的操作。

    # 使用 urllib
    import urllib.request
    
    # 定义 header
    headers = {
      # UA 最基本的防爬识别
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
    }
    
    # 1、定义一个 https 的 url
    url = 'https://www.baidu.com'
    
    # 2、定义一个 Request 对象,urlopen 方法并不能直接带 header。
    # 细节:为什么这里需要写 url=url 而有的地方不需要?因为 Request 构造方法传参顺序问题 Request(url, data=None, headers={} ...)
    request = urllib.request.Request(url=url, headers=headers)
    
    # 3、获取 Handler 对象
    handler = urllib.request.HTTPHandler()
    
    # 4、获取 opener 对象
    opener = urllib.request.build_opener(handler)
    
    # 5、调用 open 方法
    response = opener.open(request)
    
    # 6、获取内容字符串
    content = response.read().decode('utf-8')
    
    # 7 输出
    print(content)
    

二、IP代理

  • 使用同一个 IP 去不断地访问爬取数据,容易被对方服务器封 IP,这个时候就需要使用代理,简单点说,就是使用 N 个别人的 IP 去访问爬取数据。

  • 代理配置步骤:(参考上面 简单使用 案例步骤)

    1、创建 Request 对象

    2、创建 ProxyHandler 对象

    3、用 handler 对象创建 opener 对象

    4、使用 opener.open 函数发送请求

  • 使用案例

    # 使用 urllib
    import urllib.request
    # 使用 random
    import random
    
    # 定义 header
    headers = {
      # UA 最基本的防爬识别
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
    }
    
    # 方式一:字典形式的IP代理(https://www.kuaidaili.com/free/)
    # proxies = { 'http': '112.14.47.6:52024' }
    
    # 方式二:定义一个代理池,然后随机从代理池中获取一个代理
    proxies_pool = [
      { 'http':'112.14.47.6:52024' },
      { 'http':'61.164.39.68:53281' }
    ]
    proxies = random.choice(proxies_pool)
    
    # 输出当前代理
    print(proxies)
    
    # 1、定义一个 https 的 url
    url = 'https://www.baidu.com/s?wd=ip'
    
    # 2、定义一个 Request 对象,urlopen 方法并不能直接带 header。
    # 细节:为什么这里需要写 url=url 而有的地方不需要?因为 Request 构造方法传参顺序问题 Request(url, data=None, headers={} ...)
    request = urllib.request.Request(url=url, headers=headers)
    
    # 3、获取 Handler 对象
    handler = urllib.request.ProxyHandler(proxies=proxies)
    
    # 4、获取 opener 对象
    opener = urllib.request.build_opener(handler)
    
    # 5、调用 open 方法
    response = opener.open(request)
    
    # 6、获取内容字符串
    content = response.read().decode('utf-8')
    
    # 7 保存,可以方便校验IP是否代理成狗
    with open('ip.html', 'w', encoding='utf-8') as f:
      f.write(content)
    
Python中的`urllib`库是一个处理URL请求的模块,它包含多种`Handler`类用于处理不同的网络请求任务。以下是几种常见的`Handler`及其用途: 1. `HTTPHandler`:这是默认的HTTP请求处理器,用于发送GET、POST等标准的HTTP请求。你可以直接使用`urlopen()`函数创建并处理这种类型的请求。 ```python import urllib.request response = urllib.request.urlopen('http://example.com') ``` 2. `HTTPSHandler`:它是`HTTPHandler`的SSL/TLS安全版本,用于处理HTTPS请求。如果需要处理加密连接,可以创建这个类型的Handler。 ```python https_handler = urllib.request.HTTPSHandler() opener = urllib.request.build_opener(https_handler) opener.open('https://www.example.com') ``` 3. `FTPHandler`:专门用于FTP(文件传输协议)的请求。如果你需要下载或上传文件到FTP服务器,应该使用这个类。 ```python ftp_handler = urllib.request.FTPHandler() ftp_opener = urllib.request.build_opener(ftp_handler) ftp_opener.open('ftp://username:password@example.com/') ``` 4. `DataHandler`:用于数据 POST 请求,当你需要提交表单数据或者其他非纯文本数据时,可以用这个类。 ```python data_handler = urllib.request.HTTPPasswordMgrWithDefaultRealm().add_password(None, 'http://example.com', 'username', 'password') auth_handler = urllib.request.HTTPBasicAuthHandler(data_handler) data_opener = urllib.request.build_opener(auth_handler) data_opener.open('http://example.com/form-data', data=b'key=value&another=pair') ``` 5. `ProxyHandler`:用于设置代理服务器,当你需要通过代理上网时,可以创建一个`ProxyHandler`实例。 ```python proxy_handler = urllib.request.ProxyHandler({'http': 'http://proxy.example.com:8080'}) opener = urllib.request.build_opener(proxy_handler) opener.open('http://example.com') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值