Python中使用socket发送HTTP请求数据接收不完整问题解决方法

由于工作的需求,需要用python做一个类似网络爬虫的采集器。虽然python的urllib模块提供更加方便简洁操作,但是涉及到一些底层的需求,如手动设定user-agent,referer等,所以选择了直接用socket进行设计。当然,这样的话,需要对http协议比较熟悉,http协议这里就不做讲解了。整个python的代码如下:

#!/usr/bin env pythonimport sockethost="www.baidu.com"se=socket.socket(socket.AF_INET,socket.SOCK_STREAM)se.connect((host,80))se.send("GET / HTTP/1.1")se.send("Accept:text/html,application/xhtml+xml,*/*;q=0.8")#se.send("Accept-Encoding:gzip,deflate,sdch")se.send("Accept-Language:zh-CN,zh;q=0.8,en;q=0.6")se.send("Cache-Control:max-age=0")se.send("Connection:keep-alive")se.send("Host:"+host+"")se.send("Referer:http://www.baidu.com/")se.send("user-agent: Googlebot")print se.recv(1024)

登录后复制

代码运行正常,但是发现一个比较重要的问题,运行结果只返回了HTTP的头部信息,网页的内容则没有被返回。网上查找了很多资料,一无所获,经过一夜的思考,突然想到了一个问题,有可能我请求的资源非常大,一个网络的IP包的大小,它是受很多因素制约的,最典型的便是MTU(最大传输单元),那么会不会我请求的数据被分割了,HTTP的头部信息只是一部分,其它数据还在传输或者缓冲区呢?于是做了这样一个遍历:

while True:  buf = se.recv(1024)  if not len(buf):    break  print buf

登录后复制

这样发现所有请求的数据均被返回了,看来要想做好网络编程,深入理解TCP/IP协议是非常必要的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2292515.html

(0)
上一篇 2025年2月28日 01:50:59
下一篇 2025年2月24日 20:40:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python、Javascript中的闭包比较

    同为脚本语言,python和javascript具有相似的变量作用域,不像php,函数的内部的所有变量和外部都是隔绝的,也就是说,函数要想处理其外部的数据,必须使用参数把需要处理的数据传递进来(使用global关键词这里不讨论),而pyth…

    编程技术 2025年2月28日
    200
  • 线程和进程的区别及Python代码实例

    在程序猿的世界中,线程和进程是一个很重要的概念,很多人经常弄不清线程和进程到底是什么,有什么区别,本文试图来解释一下线程和进程。首先来看一下概念: 进程(英语:process),是计算机中已运行程序的实体。进程为曾经是分时系统的基本运作单位…

    2025年2月28日
    200
  • Python中用pycurl监控http响应时间脚本分享

    最近需要对节点到源站自己做个监控,简单的ping可以检测到一些东西,但是http请求的检查也要进行,于是就研究了下pycurl。 pycurl是个用c语言实现的python 库,虽然据说不是那么pythonic,但是却很高效,它支持的协议居…

    编程技术 2025年2月28日
    200
  • Python列表(list)常用操作方法小结

    常见列表对象操作方法: list.append(x) 把一个元素添加到链表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = …

    编程技术 2025年2月28日
    200
  • Python实现在Linux系统下更改当前进程运行用户

    在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就会成为一个守护进程。细心观察的可能会发现,这个守护进程的运行身份是执行这个程序的…

    编程技术 2025年2月28日
    200
  • Python Sleep休眠函数使用简单实例

    Python 编程中使用 time 模块可以让程序休眠,具体方法是time.sleep(秒数),其中“秒数”以秒为单位,可以是小数,0.1秒则代表休眠100毫秒。 复制代码 代码如下:# 例1:循环输出休眠1秒import timei = …

    编程技术 2025年2月28日
    200
  • Python中实现从目录中过滤出指定文件类型的文件

    最近学习下python,将从指定目录中过滤出指定文件类型的文件输出的方法总结一下,供日后查阅 复制代码 代码如下:#!/usr/bin/env python import globimport osos.chdir(“./”)for fil…

    编程技术 2025年2月28日
    200
  • Python实现Const详解

    python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能 定义const类如下 复制代码 代码如下:import sysclass Const(ob…

    编程技术 2025年2月28日
    200
  • Python标准异常和异常处理详解

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 1.异常处理: 本站Python教程会具体介绍。2.断言(Assertions):本站Python教程会具体介绍。…

    编程技术 2025年2月28日
    200
  • python映射列表实例分析

    本文实例讲述了python映射列表。分享给大家供大家参考。具体分析如下: 列表映射是个非常有用的方法,通过对列表的每个元素应用一个函数来转换数据,可以使用一种策略或者方法来遍历计算每个元素。 例如: 复制代码 代码如下:params = {…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论