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 相关文章推荐
在Docker上开始部署Python应用的教程
Apr 17 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
python join方法使用详解
Jul 30 Python
python带参数打包exe及调用方式
Dec 21 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
Python实现打乒乓小游戏
Sep 25 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 在线打包_支持子目录
2008/06/28 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
表单提交验证类
2006/07/14 Javascript
javascript之锁定表格栏位
2007/06/29 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
Python遍历指定文件及文件夹的方法
2015/05/09 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
房屋改造计划书
2014/01/10 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
吨的认识教学反思
2014/04/27 职场文书
企业消防安全责任书
2014/07/23 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
保证书格式
2015/01/16 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
2015年财政局工作总结
2015/05/21 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS
代码复现python目标检测yolo3详解预测
2022/05/06 Python
java开发双人五子棋游戏
2022/05/06 Java/Android