Python 如何实现 connect 隧道请求?

2020-08-13 10:02:20 +08:00
 changwenrui2310

在爬取一个网站的时候,fiddler 抓到的包是这样的;

首先发送一个 connect 隧道请求,然后是 OPTIONS 请求和 get 请求,

但超过一定时间段,隧道将会关闭

我的理解是网站是在隧道传输数据的,且超时会关闭

那我如何用 python 去实现这种方式的请求呢?

1875 次点击
所在节点    问与答
12 条回复
Delon
2020-08-13 10:19:37 +08:00
https
changwenrui2310
2020-08-13 10:23:05 +08:00
@Delon 怎么请求呢,直接 get 报 502
locoz
2020-08-13 10:48:58 +08:00
先 CONNECT 再操作那是 HTTPS 吧…先 OPTIONS 再 GET 是部分前端框架的默认操作,一些可以忽略,一些需要同样做一遍 OPTIONS,看情况弄就好了。
你如果直接 GET 报错就和它一样先 OPTIONS 一下,如果还不行,多半是你请求体里的其他参数有问题。
xingyue
2020-08-13 11:08:38 +08:00
@locoz options 一般是因为跨域浏览器自动发送的吧,请求库一般没有默认发送 options 请求的吧
locoz
2020-08-13 12:50:04 +08:00
@xingyue #4 没细究过具体原理,但是我印象中是有些跨域有、有些跨域没有,而且应该跟浏览器没有关系。
刚刚查了一下,这种情况叫预检请求,用来检测服务端是否支持跨域,所以有可能是部分前端框架会自动发送、部分不会?或者我见到的那些没有发的可能是被人为关闭了?
xingyue
2020-08-13 12:55:02 +08:00
binux
2020-08-13 13:01:52 +08:00
我没见过除了代理能用 connect 请求的
imn1
2020-08-13 13:06:59 +08:00
你又不是写 socket,干嘛要考虑 connect ?
一般的请求模块已经处理了 connect 了,你需要做的是尽量模拟出浏览器环境,让服务器那边“觉得”你是浏览器访问
locoz
2020-08-13 13:48:57 +08:00
@xingyue #6 学到了,谢谢~原来是属于“简单请求”的就不会触发自动 OPTIONS
renmu123
2020-08-13 13:53:50 +08:00
options 没必要管,requests 可不用遵从浏览器规范
locoz
2020-08-13 13:55:36 +08:00
@locoz #3 补充一下,既然这个 OPTIONS 属于浏览器自动发送的请求,那么它就完全可以被用于反爬。比如用是否先发送 OPTIONS 再发送其他请求;比如通过 Access-Control-Max-Age 来判断是否没有按照要求来,在时间范围内多次发送了 OPTIONS 。能想到的骚操作还是挺多的。

所以最好还是按照同样的方式先发送 OPTIONS 再发送其他请求,并且按服务器要求的来处理,最大程度避免被识别。
locoz
2020-08-13 13:56:21 +08:00
@renmu123 #10 还是要管一下的,既然是浏览器自动发送的东西,那么就完全可以被用于反爬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/697868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX