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命名空间详解
Aug 18 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python对数据库操作
Mar 28 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
python打开音乐文件的实例方法
Jul 21 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
Django框架中视图的用法
Jun 10 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多线程下载远程多个文件
2013/06/25 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
js 操作符实例代码
2009/10/24 Javascript
js中this的用法实例分析
2015/01/10 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
koa2的中间件功能及应用示例
2020/03/05 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python PyTorch预训练示例
2018/02/11 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python绘制立方体的方法
2018/07/02 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python小进度条显示代码
2019/03/05 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
python实现计算图形面积
2021/02/22 Python
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
2014年小学植树节活动方案
2014/03/02 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
民政局个人整改措施
2014/09/24 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2014年财政所工作总结
2014/11/22 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
python实现双向链表原理
2022/05/25 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript