当前位置: 首页 > 编程笔记 >

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

晏沈义
2023-03-14
本文向大家介绍Python中使用socket发送HTTP请求数据接收不完整问题解决方法,包括了Python中使用socket发送HTTP请求数据接收不完整问题解决方法的使用技巧和注意事项,需要的朋友参考一下

由于工作的需求,需要用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的socket发送http(s)请求方法示例,包括了利用python的socket发送http(s)请求方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 这是个在写计算机网络课设的时候碰到的问题,卡了我一天,所以总结一下。 其实在之前就有用requests写过python爬虫,但是计算机网络要求更底层的实现,刚好我看到了[这篇文章]1结果发现他就是用socket

  • 我感觉不对啊,不 listen,也可以收和发数据呀,比如客户端的 socket,不用调用 listen,也是可读可写呀

  • 本文向大家介绍vue-socket.io接收不到数据问题的解决方法,包括了vue-socket.io接收不到数据问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 最近公司的一个vue项目用到了vue-socket.io来处理socket数据传输,之前用过socket.io-client,现在知道vue-socket.io是基于socket.io-client的一层封装,将socket挂于全局

  • 本文向大家介绍php 利用socket发送HTTP请求(GET,POST),包括了php 利用socket发送HTTP请求(GET,POST)的使用技巧和注意事项,需要的朋友参考一下   今天给大家带来的是如何利用socket发送GET,POST请求。我借用燕十八老师封装好的一个Http类给进行说明。   在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可

  • 本文向大家介绍详解解决使用axios发送json后台接收不到的问题,包括了详解解决使用axios发送json后台接收不到的问题的使用技巧和注意事项,需要的朋友参考一下 问题描述 按照axios官网例子发起请求传递json,后台接受到的数据为空,一直卡在options阶段。 尝试的方法 开始以为是接口有问题,使用postman测试下,一切正常,百思不得其解,看了好多issue也解决不了,加了head

  • 问题内容: 谁能给我展示一个Java实例来从DatagramSocket接收数据并通过Multicast Socket发送相同的数据 问题答案: 发送多播数据报 为了用Java发送任何类型的数据报,无论是单播,广播还是多播,都需要一个: 可以选择将本地端口提供给套接字必须绑定到的DatagramSocket构造函数。仅当一个人需要其他方能够在特定港口与我们联系时才需要这样做。第三个构造函数获取要绑