python3:代理设置

在爬虫过程有时候需要更换ip以防被封,主要有HTTP代理和socks5代理。

使用requests设置HTTP代理

1
2
3
4
5
6
7
8
import requests

proxies = {
"http": "http://127.0.0.1:8118",
"https": "http://127.0.0.1:8118",
}

requests.get("http://httpbin.org/get", proxies=proxies)

如果代理需要HTTP Basic Auth,可以使用http://user:password@host:port/

使用requests设置socks5代理

1、全局设置

使用socks模块,需要先安装依赖库

1
pip install PySocks
1
2
3
4
5
6
7
8
import socks
import socket
import requests

socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
response = requests.get('http://httpbin.org/get')
print(response.text)

2、局部设置

requests也支持socks5代理,跟设置HTTP代理一样,可以只作用在部分请求上。不过需要先安装第三方库

1
pip install requests[socks]

使用方法是之前类似,如果需要验证,格式类似:socks5://user:pass@host:port

1
2
3
4
5
6
7
8
9
10
11
12
import requests

proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}

try:
response = requests.get('http://httpbin.org/get', proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print(e.args)

使用urllib设置HTTP代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener

proxy = '127.0.0.1:8118'
proxy_handler = ProxyHandler({
'http': 'http://' + proxy,
'https': 'https://' + proxy
})
opener = build_opener(proxy_handler)

try:
response = opener.open('http://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)

使用urllib设置socks5代理

1
2
3
4
5
6
7
8
9
10
from urllib.request import ProxyHandler, build_opener, urlopen
from urllib.error import URLError

proxy_handler = ProxyHandler({'sock5': 'localhost:1080'})
opener = build_opener(proxy_handler)
try:
response = urlopen('http://httpbin.org/get')
print(response.read())
except URLError as e:
print(e.reason)

urllib也可以像requests库设置全局代理那样设置socks5代理,具体代码跟之前类似:

1
2
3
4
5
6
7
8
9
10
11
12
import socks
import socket
from urllib.request import urlopen
from urllib.error import URLError

socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
try:
response = urlopen('http://httpbin.org/get')
print(response.read())
except URLError as e:
print(e.reason)

最后一点说明,我在本地1080端口搭了socks5代理,并用privoxy将socks5代理转为HTTP代理,端口为8118。所以测试的时候使用不同端口代表不同的代理类型。具体设置过程可以查看之前的文章《Mac终端使用代理》。