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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python实现批量修改文件名实例
Jul 08 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
Python之reload流程实例代码解析
Jan 29 Python
python中如何使用分步式进程计算详解
Mar 22 Python
OpenCV 边缘检测
Jul 10 Python
pygame实现非图片按钮效果
Oct 29 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
谈谈python垃圾回收机制
Sep 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
example2.php
2006/10/09 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
Exjs 入门篇
2010/04/07 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python三级目录展示的实现方法
2016/09/28 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
《童年》教学反思
2014/02/18 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
教你用python控制安卓手机
2021/05/13 Python