利用python的socket发送http(s)请求方法


本文摘自php中文网,作者不言,侵删。

这篇文章主要给大家介绍了关于利用python的socket发送http(s)请求的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起看看吧

前言

这是个在写计算机网络课设的时候碰到的问题,卡了我一天,所以总结一下。

其实在之前就有用requests写过python爬虫,但是计算机网络要求更底层的实现,刚好我看到了[这篇文章]1结果发现他就是用socket来实现的请求,所以就学习了。

本来也觉得应该不难,毕竟就是建立tcp连接。

原网站的例子如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def fetch(url):

sock = socket.socket() # 建立socket

sock.connect(('xkcd.com', 80)) # 远程连接

request = 'GET {} HTTP/1.0\r\nHost: xkcd.com\r\n\r\n'.format(url) # 构建请求

sock.send(request.encode('ascii')) # 向socket发送数据

response = b''

chunk = sock.recv(4096) # 从socket接收数据

while chunk:

response += chunk

chunk = sock.recv(4096)

 

# Page is now downloaded.

links = parse_links(response)

q.add(links)

我选择爬取的网站是链家,当然也看了很多其他例子,还用fiddler抓包,把headers整个放了上去,首先是参考了这个文章:https://segmentfault.com/a/1190000005126160 ,该文章介绍到:

Python通过socket发送http请求

我们以访问百度主页为案例,使用socket发送http请求。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(('www.baidu.com',80))

s.send('''GET https://www.baidu.com/ HTTP/1.1

Host: www.baidu.com

Connection: keep-alive

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

Accept-Language: zh-CN,zh;q=0.8

 

''')

 

buf=s.recv(1024)

while len(buf):

print buf

buf = s.recv(1024)

基于socket进行http编程在于请求参数的可控性更好,但是难度相应就更大了。以上发送的数据是直接从fiddler抓包器里面复制的。

阅读剩余部分

相关阅读 >>

Python有栈吗

Python列表如何去重?

Python怎么保存文件

一起深入 Python 类的内部

Python可以开发什么

Python编程语言是什么

Python中关于list与numpy.ndarry切片两者的对比详解

Python用什么文本编辑器

Python 通过logging写入日志到文件和控制台的实例

Python中图像融合、加法运算及图像类型转换的实现(附代码)

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...