之前有同事问到关于 Python 中URL走代理的问题,这里做个简单的记录。
一、部分思路
主要方法有:方法封装、类继承、装饰器、全局代理等。
二、具体实现
这里简述一下装饰器和全局代理的实现
2.1.装饰器
2.1.1.简介
在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能
原则:
- 1.不修改被装饰对象的源代码
- 2.不修改被装饰对象的调用方式
目标:
2.1.2.实现
此处以 requests 为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import os import requests
PROXY_DCT = dict() PROXY_DCT['http'] = 'http://username:password@host:port' PROXY_DCT['https'] = 'https://username:password@host:port'
def add_proxy(fn): proxies = PROXY_DCT def inner(*args, **kwargs): from requests import Session from functools import partial s = Session() s.proxies = proxies return partial(fn, *args, **kwargs)(s) return inner
@add_proxy def test(param, s): url = 'http://www.baidu.com' r = s.get(url) print(r.text) print(param)
if __name__ == '__main__': test('hello')
|
2.2.全局代理
(1)设置Python环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import os import requests
os.environ['http'] = 'http://user:pwd@host:port' os.environ['https'] = 'https://user:pwd@host:port'
def test(): url = 'http://www.163.com/' res = requests.get(url) print(res.text)
if __name__ == '__main__': test()
|
(2)urllib注册
1 2 3 4 5 6 7 8 9 10 11
| import urllib.request
handler = urllib.request.ProxyHandler({'http': 'http://user:pwd@host:port'}) opener = urllib.request.build_opener(handler)
response = opener.open('http://www.163.com/')
urllib.request.install_opener(opener)
|
(3)socks、socket注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import urllib.request import socks, socket
socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, host, port) socket.socket=socks.socksocket
def test(): url = "https://blog.csdn.net/" page = urllib.request.urlopen(url) data = page.read() dataline = page.readline() print(data)
if __name__ == '__main__': test()
|