最近需要在公司学习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

python3给socket模块设置代理的更多相关文章

  1. urllib,request 设置代理

     通常防止爬虫被反主要有以下几个策略: 1.动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 2.使用IP地址池:VPN和代理IP,现在大部分网站都是根据IP来b ...

  2. python3 selenium模块Chrome设置代理ip的实现

    python3 selenium模块Chrome设置代理ip的实现 selenium模块Chrome设置代理ip的实现代码: from selenium import webdriver chrome ...

  3. python2.7用socks和socket设置代理

    接下来是最近遇到的一个代理问题. 背景:一个基于python2.7的自动化测试项目 目的:因调试需求,需要通过代理连接其他公司的前端网站,来检验项目运行所在的问题. 问题:RUN>等了1分钟没有 ...

  4. 01: socket模块

    网络编程其他篇 目录: 1.1 socket理论部分 1.2 socket处理单个连接 和 同时接受多个连接 1.3 socket实现远程执行命令,下载文件 1.4 通过socket实现简单的ssh ...

  5. python基础===socket模块的讲解(转)

    一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...

  6. Python网络编程(socket模块、缓冲区、http协议)

      网络的概念:主机   端口  IP  协议 服务器: localhost/127.0.0.1 客户端: 只是在本机启动客户端,用127.0.0.1访问     服务器: 0.0.0.0 客户端: ...

  7. Python3:urllib模块的使用

    Python3:urllib模块的使用1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=N ...

  8. socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例

    socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...

  9. java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...

随机推荐

  1. jq 之Autocomplete 引发联想及思考

    前情纪要:JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件,这些控件主要包括:Accordion,Au ...

  2. Web移动端使用localStorage缓存Js和css文件 | 强制不要缓存

    1.尽量不把js放在onload事件中,而是放在由用户主动触发的事件 2.加时间戳,时间不同则会加载js而非使用缓存 强制不要缓存: <meta http-equiv=Cache-Control ...

  3. 穿透Session 0 隔离(二)

    上一篇我们已经对Session 0 隔离有了进一步认识,如果在开发过程中确实需要服务与桌面用户进行交互,可以通过远程桌面服务的API 绕过Session 0 的隔离完成交互操作. 对于简单的交互,服务 ...

  4. nodemailer发送邮件各个服务器接口

    来自:https://github.com/nodemailer/nodemailer-wellknown/blob/master/services.json#L125 {   "1und1 ...

  5. 创建view,保存GROUP_CONCAT数据

    create view user_account_view asSELECT u.userId UserId ,u.userCode UserCode,GROUP_CONCAT(ac.id) Acco ...

  6. Linux上添加服务(htttpd,samba等等)

    service httpd restart   出现 httpd:unrecognized service 错误 vi /etc/rc.d/rc.local #在/etc/rc.d/rc.local中 ...

  7. MIS货物拆包销售的问题

    就是不能拆包装销售.比如一箱香烟要一包包的卖,一箱里面有50条,一条里面有10包,而是,要一包一包的卖. 解决方案:入库的时候,记录下包装总量(自动改成数量×50),再附加2条说明字段,第一条说明是一 ...

  8. 转!java自定义注解

    转自:http://blog.csdn.net/yixiaogang109/article/details/7328466  Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析 ...

  9. selenium入门基础知识

    内容转载自:http://blog.csdn.net/huangbowen521/article/details/7816538 1.selenium介绍: Selenium是一个浏览器自动化操作框架 ...

  10. 2.Access the mongo Shell Help-官方文档摘录

    总结: 1.使用help可以查看帮助信息db.help()  help等 2.查看对应的实现方法.比如 test@gzxkvm52$ db.updateUser function (name, upd ...