虽然这个问题已经回答过无数次了,但是总有同学依然不会提问题,于是得不到解答。
这个问题提了一天也没有人给他解答。为什么?因为想回答的人无从下手。既不给具体描述,也不给代码,别人怎么回答?回答你“方法不对”?
在编程领域有一个俗话,叫做:
“垃圾进,垃圾出。 ”
你提的问题太宽泛,那么就不要怪别人回答得太宽泛。
如果你想让自己的问题得到解决,请遵循以下规则:
以上面图中的问题为例。提问者觉得大众点评检测到了自己的 IP。那么问题来了,你怎么知道自己的 IP 被检测到了?是因为爬虫被屏蔽了从而推测出 IP 被检测了?还是通过其他什么原因确定是 IP 被检测了?
如果是因为爬虫被屏蔽了,那么原因有很多,可能是你请求的时候没有带上 Headers,这样即使有代理 IP,也是来一个封一个。也有可能是请求参数里面有签名,签名跟参数、当前时间戳有关,每次请求都会变。签名不对立刻屏蔽。总之,网站有很多办法检测你的请求是不是爬虫发起的,不能因为加了代理还是被屏蔽,就反推出网站检测到了你的真实 IP。
如果确实有某种方法确定了自己的真实 IP 被检测到了,那么,你这个代理 IP 是怎么来的?是透明代理还是高匿代理?如果是透明 IP,确实本机 IP 会公布给网站。如果是高匿IP,那么你要看你的代码是不是正确配置了这个IP。举个例子:
proxy = 'http://123.45.67.89:6677'
resp = requests.get('https://xxx.com/abc/def', headers=headers, proxies={'http': proxy})
这种写法,自以为配置了代理 IP,但实际上并没有使用。因为参数proxies
的值这个字典里面,只有一个 Key: http
,所以代理只会对 HTTP 网址生效。对于HTTPS
的网址,依然使用的是本机 IP,所以就会营造出一种用了代理还是被探测到本机 IP 的错觉。但实际上对 HTTPS 的网址来说,你根本就没有用代理。proxies
的值应该写为:
{'http': proxy, 'https': proxy}
提问者一张嘴,回答者跑断腿,你就一句话提问,回答者打字要给你打10分钟,凭什么?
还有的人,确实给出了代码,但直接把整个代码字符串复制粘贴到了微信群聊天里面。你代码几十行就这么粘贴上来,直接把整个聊天窗口都清屏了。你倒是轻松,鼠标选中,复制,粘贴,一气呵成不到3秒钟。解答你问题的人得滑动好几屏才能看到代码开头的位置。谁还有耐心给你看下去?
遇到一个心情好的人愿意看你的文字代码,并且也找到了代码的问题在哪里。现在他想回答你的问题,那么他怎么告诉你有问题的地方在第几行?
手机上写代码本来就不方便,括号引号打起来很麻烦。
如果你直接对代码进行截图,带上行号,那么回答问题的人直接告诉你第几行就可以了。
还有的人,给报错信息截图,就截一行。你多截几行会被收流量费吗?Python 的报错信息是从上往下写的。一般最上面是你的代码,最下面是真正报错的地方。这个真正报错的地方,可能是你的代码,也可能是 Python 自带的库或者第三方库的报错代码。把报错信息截图截完整有那么难吗?
还有的人,不知道从 CSDN 上哪个装逼货的烂博客里复制了几行代码,运行报错了,然后跑来问。这代码一看就是奇奇怪怪的炫技代码。用些狗屁不通的混账逻辑把原本十几行的代码缩减成一行。这运行一报错,根本没法知道哪里有问题。
后来我们形成了统一的认识:如果出问题的代码来自 CSDN,那么一律不解答。
总结:是你提问请求别人回答。你应该给回答者提供一个能方便指出问题,方便分析问题的环境。
如果你期望提问的时候只言片语,然后让答者主动跟你交互,主动找你确认问题是什么、还要找反复确认细节。那么只有两种情况:回答问题的人是你爹。或者回答你这个问题有钱拿。