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实现多行注释的另类方法
Aug 22 Python
Python实现二叉堆
Feb 03 Python
关于Python 3中print函数的换行详解
Aug 08 Python
python的变量与赋值详细分析
Nov 08 Python
python数字图像处理之高级形态学处理
Apr 27 Python
python 自动去除空行的实例
Jul 24 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
python 如何停止一个死循环的线程
Nov 24 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
基于Python实现流星雨效果的绘制
Mar 18 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并发访问实例代码
2012/09/06 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
初识Javascript小结
2015/07/16 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python进阶教程之循环对象
2014/08/30 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python实现二叉树的遍历
2017/12/11 Python
python excel转换csv代码实例
2019/08/26 Python
pycharm显示远程图片的实现
2019/11/04 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
财务管理专业应届毕业生求职信
2013/09/22 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
挂职自我鉴定
2014/02/26 职场文书
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS