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下cv.waitKey无响应的原因及解决方法
Jan 10 Python
Python理解递归的方法总结
Jan 28 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
Python绘图之柱形图绘制详解
Jul 28 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
Python简易开发之制作计算器
Apr 28 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
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP单链表的实现代码
2016/07/05 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
PHP时间类完整代码实例
2021/02/26 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
海蓝之谜(LA MER)澳大利亚官方商城:全球高端奢华护肤品牌
2017/10/27 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
学生会招新策划书
2014/02/14 职场文书
餐厅筹备计划书
2014/04/25 职场文书
大型活动组织方案
2014/05/10 职场文书
表彰大会策划方案
2014/05/13 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
共青团员自我评价
2015/03/10 职场文书
紧急迫降观后感
2015/06/15 职场文书
四大名著读书笔记
2015/06/25 职场文书
培训计划通知
2015/07/15 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
python神经网络Xception模型
2022/05/06 Python