当前位置: 首页 > 科技观察

为什么网站知道我的爬虫使用了代理?

时间:2023-03-13 19:16:47 科技观察

在公众号的粉丝群里,经常有同学问:为什么我的爬虫明明设置了代理,但是一访问网站就发现了。我总结了几种常见的情况。事实上,网站识别是否使用代理并不一定需要复杂的反爬虫机制,也不一定需要使用AI来识别用户行为。在以下情况下,很容易识别代理。你根本不用代理有些初学者在使用Requests请求网站时会写这样的代码:importrequestsresp=requests.get('https://httpbin.org/ip').textprint('Doproxy:',resp)resp=requests.get('https://httpbin.org/ip',proxies={'http':'http://IP:port'}).textprint('使用代理:',resp)运行效果如下图:为什么使用代理后IP不变?这是很多刚用Requests的同学常犯的错误。因为你根本没有对https网站使用代理,所以你的代理只会对http网站生效。要在https网站上生效,需要为其指定代理:resp=requests.get('https://httpbin.org/ip',proxies={'http':'http://IP:port','https':'http://IP:port'}).textP.S.:注意上面的代码,在为httpsURL设置代理的时候,key是https,但是value还是以http://.对于某些代理提供商,如果您将其设置为以https://开头,则会报错。不过这个原理与本文无关,暂且不谈。如果你有兴趣,我会写另一篇关于它的文章。您的代理IP是服务器IP。有许多代理供应商批量购买云服务器来构建代理服务。比如国内供应商会从阿里云、腾讯云、华为云采购服务器来搭建代理。海外供应商将购买AWS或谷歌云服务器。如果你在云服务器上运行过不带代理的爬虫,你会发现有时候不带代理的爬虫在自己电脑上运行没有问题,但是在云服务器上运行就会被识别。这是因为云服务器的IP地址范围和家庭宽带不一样。与AWS和GoogleCloud一样,它们的云服务器IP范围是公开的。只要网站提前禁止所有来自这个范围的请求,从AWS和谷歌云服务器发起的请求就会直接被视为爬虫请求。因此,建立在其上的代理服务自然不会生效。不知道国内云服务商的服务器IP地址有没有公布过,但是他们的IP范围肯定和国内的IP不一样。当网站遇到来自这些可疑IP范围的请求时,虽然不一定能完全屏蔽,但通过弹验证码测试,还是可以屏蔽很多爬虫的。在这种情况下,爬虫只能通过采购一些使用家庭宽带的供应商搭建代理服务来解决问题。但是这种代理的价格肯定会翻几倍。你的代理IP不是高匿名代理IP常见的代理IP有透明代理、匿名代理和高匿名代理三种:使用透明代理时,网站既可以看到代理IP,也可以看到你的真实IP。用了就等于白用了。使用匿名代理时,网站看不到你的真实IP,但是请求中有一个特性可以告诉网站你是使用代理访问的。只有真正的高匿名代理才能隐藏您的爬虫请求。有的同学可能会去网上搜索免费的代理IP来使用。但是这些特工中有很多都不是高级特工。一定会被发现的。服务器提供商的IP池被污染。有些人的爬虫写的很垃圾。他们认为他们无所畏惧,因为他们有代理人。爬虫请求经常被遗漏。即使网站不检查IP频率,从其他特征也可以知道这是一个爬虫请求。所以网站会连同代理IP一起被封。但是这种垃圾爬虫的请求速度是极快的。即使代理提供商的IP池中有数百万个IP,也很快就会被这些垃圾爬虫全部干掉。国内顶级网站每天有数千万的爬虫访问,主流的代理提供商屈指可数。如果多个垃圾邮件爬虫都选择了同一个供应商,并且他们的代理池没有及时更新。那么如果你用这个提供商的代理IP,你一来就会被发现。Proxy不支持HTTP/2有些网站需要HTTP/2请求。在Python中,已经有很多支持HTTP/2请求的HTTP客户端库,比如httpx。但是,很少有代理提供商可以提供支持HTTP/2的代理,因为设置起来很麻烦。因此,当您使用支持HTTP/2的客户端通过HTTP/1.1代理IP访问HTTP/2网站时,网站无法正常返回内容。小结检测网站爬虫的方法有很多种,检测请求是否由代理发起的方法也有很多种。而且,这些方法不需要什么高深的技术,一个初级工程师就能写出来。那些以为给爬虫加代理就可以随便爬网站的人,你不仅害了自己,也害了其他爬虫。