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简单猜数游戏实例
Jul 09 Python
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python socket模块方法实现详解
Nov 05 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Python3爬虫中Ajax的用法
Jul 10 Python
Python如何定义接口和抽象类
Jul 28 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
python库sklearn常用操作
Aug 23 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
js获取select选中的option的text示例代码
2013/12/19 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python 读取、写入txt文件的示例
2020/09/27 Python
作弊检讨书1000字
2014/02/01 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
太太口服液广告词
2014/03/20 职场文书
学校就业推荐信范文
2014/05/19 职场文书
大专学生求职信
2014/07/04 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android