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进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
用python + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python global和nonlocal用法解析
Feb 03 Python
python如何变换环境
Jul 21 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 _autoload自动加载类与机制分析
2012/02/10 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python将ip地址转换成整数的方法
2015/03/17 Python
使用Python对Access读写操作
2017/03/30 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python3 max()函数基础用法
2019/02/19 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python中的类与类型示例详解
2019/07/10 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
python中的逆序遍历实例
2019/12/25 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
Django实现随机图形验证码的示例
2020/10/15 Python
python-地图可视化组件folium的操作
2020/12/14 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
怎样自定义一个异常类
2016/09/27 面试题
文员求职信
2014/07/15 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python