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 相关文章推荐
bat和python批量重命名文件的实现代码
May 19 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
Python爬虫实现验证码登录代码实例
May 10 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
python opencv进行图像拼接
Mar 27 Python
python 数据库查询返回list或tuple实例
May 15 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
Python基于百度API识别并提取图片中文字
Jun 27 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
如何使用PHP中的字符串函数
2006/10/09 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
期末总结的个人自我评价
2013/11/02 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
新闻人物通讯稿
2014/10/09 职场文书
高三毕业评语
2014/12/31 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers