Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

23|偷梁换柱:为爬虫安上代理的翅膀

你好,我是郑建勋。
在任何爬虫系统中,使用代理都是不可或缺的功能。代理是指在客户端和服务器之间路由流量的服务,用于实现系统安全、负载均衡等功能。在爬虫项目中,代理服务器常常扮演着重要的角色,它能帮助我们突破服务器带来的限制和封锁,达到正常抓取数据的目的。这节课,我们来看一看各种类型代理的区别和使用方式,并在代码中实现代理。
那么第一个问题来了,代理分为哪些类型呢?
代理作为客户端和服务器的中间层,按照不同的维度可以分为不同的类型。一种常见的划分方式是将代理分为正向代理(forward proxy)与反向代理(reverse proxy)。根据实现代理的方式可以分为 HTTP 隧道代理、MITM 代理、透明代理。而根据代理协议的类型,又可以分为 HTTP 代理、HTTPS 代理、SOCKS 代理、TCP 代理等。

代理的分类和实现机制

正向代理

当我们谈论代理服务器时,通常指的就是正向代理。正向代理会向一个客户端或一组客户端提供代理服务。通常,这些客户端属于同一个内部网络。当客户端尝试访问外部服务器时,请求必须首先通过正向代理。
可是我们为什么需要这多余的中间层呢?因为正向代理能够监控每一个请求与回复,鉴权、控制访问权限并隐藏客户端实际地址。隐藏了客户端的真实地址之后,正向代理可以绕过一些机构的网络限制,这样一些互联网用户就实现了匿名性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了爬虫系统中代理的重要性和不同类型的代理,包括正向代理、HTTP隧道代理、MITM代理和透明代理。文章通过代码示例展示了如何使用Go语言实现简单的HTTP正向代理服务和HTTP隧道代理。此外,文章还讨论了反向代理的作用和好处,以及在Go语言中实现反向代理的简单方法。在实际项目中,文章介绍了如何访问代理服务器以及如何选择代理地址的策略,包括轮询调度等。通过这些技术,读者可以了解代理服务器的分类、实现机制和在实际项目中的应用,对技术人员具有一定的参考价值。文章还提出了课后思考题,鼓励读者尝试新的策略实现对代理地址的选择,并提交代码到Git仓库中。整体而言,本文全面介绍了代理在爬虫系统中的重要性和实现方式,为读者提供了深入了解和应用代理技术的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 。。。不知道起啥名字
    老师,建议老师可以给用问题引出文章这种形式! 个人感觉在实践中,遇到问题再讲解理论会稍稍好些,直接讲理论可能包袱太多了,我想大部分学习的老哥可能更多的是想学习到实践能力,爬虫架构设计搭建,具体实战代码的细节。老师文章可能更系统一些,比较适合纸制化阅读,但是在线上的话,个人认为在实战中,在例子中进行讲解可能效果会更好一些! 老师讲解的内容很充分,但是我想大部分买这个课的老哥希望得到的是一个实战的内容,内容穿插底层与理论,当然这只是个人的一些看法!

    作者回复: 感谢,后面的实战代码我基本都是事无巨细的讲解了,只是前期我搞得慢了一些。

    2022-12-01归属地:北京
    2
    8
  • 那时刻
    请问老师,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归属地:新加坡
    1
    2
  • 那时刻
    请问老师,文中提到优化io.Copy,我们一般会写一个 for 循环,控制每一次转发的数据包大小。看io.Copy源码,有个limitedreader控制了每次转发数据包的最大值,是否也有控制转发包大小的作用呢?
    2022-12-28归属地:北京
    1
    1
  • 大毛
    最初使用 clash 作为自己的代理工具,但是使用过程中遇到了一些问题调试起来很麻烦,在考虑是否自己来实现这部分的内容。 之前在看 clash 的代码的时候看到它单独处理了 conn方法,还不知道为什么,现在算是理解了。 尝试回答一下问题: 随机选择的效果和轮询类似,都是为了均匀地将请求转发到代理服务器中。如果想要设计更好的选择策略,需要结合实际情况来设计,比如,如果你希望减小代理带来的延迟,那需要时刻监控代理的延迟,并选择最小延迟的服务器。如果你是为了尽可能用更多的 ip 来分散你的请求,只使用轮询或随机就好。
    2024-01-29归属地:新疆
  • Geek_c9206f
    proxyconnect 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_79dd5b
    http tunnel调试一直有问题,发现是request会一直解析错误,r.Host为http:,r.Path为请求域名地址,是go语言没有做好connect方法的解析吗?
    2023-06-28归属地:四川
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部