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中各种方法的运作原理
Jun 15 Python
Python计算两个日期相差天数的方法示例
May 23 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
python statsmodel的使用
Dec 21 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 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 获取select下拉列表框的值
2010/05/08 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
pandas分批读取大数据集教程
2020/06/06 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
介绍一下Java的事务处理
2012/12/07 面试题
电子信息工程专业推荐信
2014/02/14 职场文书
质量整改报告范文
2014/11/08 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
Go获取两个时区的时间差
2022/04/20 Golang