Python中使用socket发送HTTP请求数据接收不完整问题解决方法


Posted in Python onFebruary 04, 2015

由于工作的需求,需要用python做一个类似网络爬虫的采集器。虽然Python的urllib模块提供更加方便简洁操作,但是涉及到一些底层的需求,如手动设定User-Agent,Referer等,所以选择了直接用socket进行设计。当然,这样的话,需要对HTTP协议比较熟悉,HTTP协议这里就不做讲解了。整个python的代码如下:

#!/usr/bin env python
import socket
host="www.baidu.com"
se=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
se.connect((host,80))
se.send("GET / HTTP/1.1\n")
se.send("Accept:text/html,application/xhtml+xml,*/*;q=0.8\n")
#se.send("Accept-Encoding:gzip,deflate,sdch\n")
se.send("Accept-Language:zh-CN,zh;q=0.8,en;q=0.6\n")
se.send("Cache-Control:max-age=0\n")
se.send("Connection:keep-alive\n")
se.send("Host:"+host+"\r\n")
se.send("Referer:http://www.baidu.com/\n")
se.send("user-agent: Googlebot\n\n")
print se.recv(1024)

代码运行正常,但是发现一个比较重要的问题,运行结果只返回了HTTP的头部信息,网页的内容则没有被返回。网上查找了很多资料,一无所获,经过一夜的思考,突然想到了一个问题,有可能我请求的资源非常大,一个网络的IP包的大小,它是受很多因素制约的,最典型的便是MTU(最大传输单元),那么会不会我请求的数据被分割了,HTTP的头部信息只是一部分,其它数据还在传输或者缓冲区呢?于是做了这样一个遍历:

while True:
  buf = se.recv(1024)
  if not len(buf):
    break
  print buf

这样发现所有请求的数据均被返回了,看来要想做好网络编程,深入理解TCP/IP协议是非常必要的。

Python 相关文章推荐
详解Python中的装饰器、闭包和functools的教程
Apr 02 Python
python魔法方法-属性访问控制详解
Jul 25 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Numpy数组转置的两种实现方法
Apr 17 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
详解python读取和输出到txt
Mar 29 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 Python
Python、Javascript中的闭包比较
Feb 04 #Python
线程和进程的区别及Python代码实例
Feb 04 #Python
Python中使用PIPE操作Linux管道
Feb 04 #Python
Python实现在Linux系统下更改当前进程运行用户
Feb 04 #Python
使用Python编写Linux系统守护进程实例
Feb 03 #Python
Python中使用select模块实现非阻塞的IO
Feb 03 #Python
Python异常学习笔记
Feb 03 #Python
You might like
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php读取excel文件的简单实例
2013/08/26 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
简单了解python PEP的一些知识
2019/07/13 Python
Django框架视图函数设计示例
2019/07/29 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
python实现一个猜拳游戏
2020/04/05 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
应用数学自荐书范文
2013/11/24 职场文书
客服工作职责
2013/12/11 职场文书
中国文明网签名寄语
2014/01/18 职场文书
电工工作职责范本
2014/02/22 职场文书
住宅使用说明书
2014/05/09 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
2014年财务科工作总结
2014/11/11 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
南京导游词
2015/02/03 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android