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在linux中输出带颜色的文字的方法
Jun 19 Python
Python pickle模块用法实例分析
May 27 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
利用Python如何生成随机密码
Apr 20 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python 实现Harris角点检测算法
Dec 11 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
javascript操作css属性
2013/12/30 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
Cpy和Python的效率对比
2015/03/20 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
python调用百度语音REST API
2018/08/30 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
美工的岗位职责
2013/11/14 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
上班迟到检讨书
2014/01/10 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
大学生评语大全
2014/04/18 职场文书
2014年党支部承诺书
2014/05/30 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python