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 07 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
整理Python最基本的操作字典的方法
Apr 24 Python
Python文件去除注释的方法
May 25 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
python 检查文件mime类型的方法
Dec 08 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
python 爬取学信网登录页面的例子
Aug 13 Python
python中封包建立过程实例
Feb 18 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
分享python函数常见关键字
Apr 26 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
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
python获取网页状态码示例
2014/03/30 Python
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python 递归函数详解及实例
2016/12/27 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python编程求质数实例代码
2018/01/31 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
浅谈django的render函数的参数问题
2018/10/16 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
python中pyplot基础图标函数整理
2020/11/10 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
先进工作者事迹材料
2014/12/23 职场文书