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中isalnum()方法的使用
May 18 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
python对DICOM图像的读取方法详解
Jul 17 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Flask之flask-script模块使用
Jul 26 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
如何验证python安装成功
Jul 06 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
python推导式的使用方法实例
Feb 28 Python
python实现进度条的多种实现
Apr 29 Python
python获取对象信息的实例详解
Jul 07 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
通过javascript设置css属性的代码
2009/12/28 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python遍历目录的方法小结
2016/04/28 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
python代码编写计算器小程序
2020/03/30 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python实现拼接图片
2020/03/23 Python
python的数学算法函数及公式用法
2020/11/18 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
民族团结先进个人材料
2014/02/05 职场文书
犯错检讨书
2014/02/21 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS