pyhon3给socket模块设置代理

Posted woaixuexi9999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyhon3给socket模块设置代理相关的知识,希望对你有一定的参考价值。

最近需要在公司学习socket编程,但是不能直接连接外网,需要设置一个代理才能正常访问。报错示例:

import socket

def blocking(wd):
    sock = socket.socket()
    sock.connect((www.baidu.com,80)) # 连接百度
    request = GET {} HTTP/1.0
Host:www.baidu.com

.format(/s?wd={}.format(wd)) # 构造http请求头
    response = b‘‘  # 用于接收数据
    sock.send(request.encode())  # 发送http请求
    chunk = sock.recv(1024)  # 一次接收1024字节数据
    while chunk:  # 循环接收数据,若没有数据了说明已接收完
        response += chunk  # 字符串拼接
        chunk = sock.recv(1024)
    print(response.decode())

if __name__ == __main__:
    blocking(python)

技术分享图片

解决办法:要使用代理,需要用到socks这两个包。socks在python3中不是自带的,所以需要通过pip install PySocks这个模块。 
增加如下带代码即可:

import socks
import socket
socks.set_default_proxy(socks.HTTP, 地址, 端口, True, 用户名, 密码)
socket.socket = socks.socksocket

修改后示例:

import socket
import socks  # pip install PySocks
socks.set_default_proxy(socks.HTTP,addr=192.168.105.71,port=80) #设置socks代理
socket.socket = socks.socksocket  # 把代理应用到socket
def blocking(wd):
    sock = socket.socket()
    sock.connect((www.baidu.com,80)) # 连接百度
    request = GET {} HTTP/1.0
Host:www.baidu.com

.format(/s?wd={}.format(wd)) # 构造http请求头
    response = b‘‘  # 用于接收数据
    sock.send(request.encode())  # 发送http请求
    chunk = sock.recv(1024)  # 一次接收1024字节数据
    while chunk:  # 循环接收数据,若没有数据了说明已接收完
        response += chunk  # 字符串拼接
        chunk = sock.recv(1024)
    print(response.decode())

if __name__ == __main__:
    blocking(python)

技术分享图片

可以看到已经正常请求到百度。

注意:socks的类型,即set_default_proxy的第一个参数,网上很多资料写的都是socks.SOCKS5。如果出现下面这个错误,请检查代理服务的类型,我这里改成socks.HTTP即可正常发送请求:

socks.GeneralProxyError: Socket error: Connection closed unexpectedly

 


以上是关于pyhon3给socket模块设置代理的主要内容,如果未能解决你的问题,请参考以下文章

python 如何编写代理服务器

Pyhon3实现机器学习经典算法ID3决策树

如何给 NPM 设置代理

内网基础-隧道技术内网穿透(SSH隧道Socket隧道跨路由扫描)

使用代理模式来给交易模块添加缓存功能

git设置代理