码迷,mamicode.com
首页 > 其他好文 > 详细

pyhon3给socket模块设置代理

时间:2018-07-24 18:00:03      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:ons   应用   chunk   int   http请求   说明   数据   cti   res   

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

import socket

def blocking(wd):
    sock = socket.socket()
    sock.connect((www.baidu.com,80)) # 连接百度
    request = GET {} HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n.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\r\nHost:www.baidu.com\r\n\r\n.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模块设置代理

标签:ons   应用   chunk   int   http请求   说明   数据   cti   res   

原文地址:https://www.cnblogs.com/woaixuexi9999/p/9360581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!