哆啦A梦 50周年应援

Handler处理器&&使用代理服务器urllib.request.ProxyHandler

urllib.request.urlopen(url)   不能定制请求头
urllib.request.Request(url,headers,data)  可以定制请求头
Handler
定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理
不能使用请求对象的定制)
# 需求 使用handler来访问百度  获取网页源码

import urllib.request
# 请求路径
url = 'http://www.baidu.com'
# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

# 请求对象的定制 request
= urllib.request.Request(url = url,headers = headers) # handler build_opener open # (1)获取hanlder对象 handler = urllib.request.HTTPHandler() # (2)获取opener对象(通过上面hanlder获取opener对象) opener = urllib.request.build_opener(handler) # (3) 调用open方法(参数传入request请求对象) response = opener.open(request)
# 获取响应数据(read读方法返回字节形式二进制数据.decode解密)
content = response.read().decode('utf-8')
print(content)
代理服务器
1.代理的常用功能?
  • 突破自身IP访问限制,访问国外站点。
  • 访问一些单位或团体内部资源

    扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

  • 提高访问速度

    扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

  • 隐藏真实IP
    扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击。
2.代码配置代理
  创建Reuqest对象
  创建ProxyHandler对象
  用handler对象创建opener对象
  使用opener.open函数发送请求
 

访问api返回,ip地址

import urllib.request

# 随机函数
import random

# 西刺免费代理IP(http://www.xicidaili.com/)
# ip代理池,列表
proxies_pool = [
    {'http':'118.24.219.151:16817'},
    {'http':'118.24.218.158:16817'}
    # ...
]

# random.choice方法返回一个列表,元组或字符串的随机项
proxies = random.choice(proxies_pool)
# 请求路径
url = 'http://www.baidu.com/s?wd=ip'

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

# 请求对象的定制
request = urllib.request.Request(url = url, headers = headers)

# 设置使用代理服务器,传入ip
handler = urllib.request.ProxyHandler(proxies=proxies)

#通过 urllib.request.build_opener(代理服务器)方法创建支持处理HTTP请求的opener对象
opener = urllib.request.build_opener(handler)

# 通过opener对象.调用open()方法发送请求
response = opener.open(request)

# 获取响应信息
content = response.read().decode('utf-8')

# 保存到本地
with open('daili.html','w',encoding='utf-8')as fp:
    fp.write(content)

posted @ 2021-11-02 16:38  秋泊ソース  阅读(342)  评论(0编辑  收藏  举报