23|偷梁换柱:为爬虫安上代理的翅膀
郑建勋
你好,我是郑建勋。
在任何爬虫系统中,使用代理都是不可或缺的功能。代理是指在客户端和服务器之间路由流量的服务,用于实现系统安全、负载均衡等功能。在爬虫项目中,代理服务器常常扮演着重要的角色,它能帮助我们突破服务器带来的限制和封锁,达到正常抓取数据的目的。这节课,我们来看一看各种类型代理的区别和使用方式,并在代码中实现代理。
那么第一个问题来了,代理分为哪些类型呢?
代理作为客户端和服务器的中间层,按照不同的维度可以分为不同的类型。一种常见的划分方式是将代理分为正向代理(forward proxy)与反向代理(reverse proxy)。根据实现代理的方式可以分为 HTTP 隧道代理、MITM 代理、透明代理。而根据代理协议的类型,又可以分为 HTTP 代理、HTTPS 代理、SOCKS 代理、TCP 代理等。
代理的分类和实现机制
正向代理
当我们谈论代理服务器时,通常指的就是正向代理。正向代理会向一个客户端或一组客户端提供代理服务。通常,这些客户端属于同一个内部网络。当客户端尝试访问外部服务器时,请求必须首先通过正向代理。
可是我们为什么需要这多余的中间层呢?因为正向代理能够监控每一个请求与回复,鉴权、控制访问权限并隐藏客户端实际地址。隐藏了客户端的真实地址之后,正向代理可以绕过一些机构的网络限制,这样一些互联网用户就实现了匿名性。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了爬虫系统中代理的重要性和不同类型的代理,包括正向代理、HTTP隧道代理、MITM代理和透明代理。文章通过代码示例展示了如何使用Go语言实现简单的HTTP正向代理服务和HTTP隧道代理。此外,文章还讨论了反向代理的作用和好处,以及在Go语言中实现反向代理的简单方法。在实际项目中,文章介绍了如何访问代理服务器以及如何选择代理地址的策略,包括轮询调度等。通过这些技术,读者可以了解代理服务器的分类、实现机制和在实际项目中的应用,对技术人员具有一定的参考价值。文章还提出了课后思考题,鼓励读者尝试新的策略实现对代理地址的选择,并提交代码到Git仓库中。整体而言,本文全面介绍了代理在爬虫系统中的重要性和实现方式,为读者提供了深入了解和应用代理技术的指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(9)
- 最新
- 精选
- 。。。不知道起啥名字老师,建议老师可以给用问题引出文章这种形式! 个人感觉在实践中,遇到问题再讲解理论会稍稍好些,直接讲理论可能包袱太多了,我想大部分学习的老哥可能更多的是想学习到实践能力,爬虫架构设计搭建,具体实战代码的细节。老师文章可能更系统一些,比较适合纸制化阅读,但是在线上的话,个人认为在实战中,在例子中进行讲解可能效果会更好一些! 老师讲解的内容很充分,但是我想大部分买这个课的老哥希望得到的是一个实战的内容,内容穿插底层与理论,当然这只是个人的一些看法!
作者回复: 感谢,后面的实战代码我基本都是事无巨细的讲解了,只是前期我搞得慢了一些。
2022-12-01归属地:北京28 - 那时刻请问老师,HTTP 隧道技术第一次请求使用connect方法,后续请求不使用connect方法了吗?另外,HTTP 隧道,在服务器端怎么处理呢?
作者回复: 1、后续请求不再需要使用connect方法了,因为现在借助中间人,已经建立了一条客户端到服务器端的TCP通信。 相当于客户端直接将请求发送给了服务器。所以2、服务器并不需要做额外的处理
2022-12-27归属地:北京 - Geek_66b125运行后会报错:proxyconnect tcp: dial tcp 127.0.0.1:8888: connectex: No connection could be made because the target machine actively refused it. 在终端看这个端口也没被占用,请问老师这是什么情况2023-02-15归属地:新加坡12
- 那时刻请问老师,文中提到优化io.Copy,我们一般会写一个 for 循环,控制每一次转发的数据包大小。看io.Copy源码,有个limitedreader控制了每次转发数据包的最大值,是否也有控制转发包大小的作用呢?2022-12-28归属地:北京11
- 大毛最初使用 clash 作为自己的代理工具,但是使用过程中遇到了一些问题调试起来很麻烦,在考虑是否自己来实现这部分的内容。 之前在看 clash 的代码的时候看到它单独处理了 conn方法,还不知道为什么,现在算是理解了。 尝试回答一下问题: 随机选择的效果和轮询类似,都是为了均匀地将请求转发到代理服务器中。如果想要设计更好的选择策略,需要结合实际情况来设计,比如,如果你希望减小代理带来的延迟,那需要时刻监控代理的延迟,并选择最小延迟的服务器。如果你是为了尽可能用更多的 ip 来分散你的请求,只使用轮询或随机就好。2024-01-29归属地:新疆
- Geek_c9206fproxyconnect tcp: dial tcp 127.0.0.1:9999: connect: connection refused 这是咋回事勒2023-12-29归属地:上海1
- 牙小木用了代理之后,出现 “”unexpected EOF“ 有遇到的吗,貌似是这段代码有问题 if b.Proxy!=nil{ selfTransport:=http.DefaultTransport.(*http.Transport) selfTransport.Proxy=b.Proxy client.Transport=selfTransport } 不知道是代理问题还是代码问题。2023-08-17归属地:北京
- 牙小木https://github.com/dreamerjackson/crawler/releases/tag/v0.1.0 这是本节的代码2023-08-17归属地:北京
- Geek_79dd5bhttp tunnel调试一直有问题,发现是request会一直解析错误,r.Host为http:,r.Path为请求域名地址,是go语言没有做好connect方法的解析吗?2023-06-28归属地:四川
收起评论