我正在尝试从 xyz 中抓取一些文章,但是,在抓取一定次数后,会出现一个验证码。
但是,我遇到了重大问题。
我正在使用
from fake_useragent import UserAgent
来随机化我的 header 。我在请求之间使用随机休眠时间
一旦出现验证码,我将使用 VPN 更改 IP 地址。然而,不知何故,一旦我的 IP 地址出现,验证码仍然会出现。
同样奇怪的是,虽然验证码出现在请求响应中,但浏览器中却没有出现验证码。
所以,我认为 by header 是错误的。
我在获取这个请求的时候关闭了js和cookies,因为有了cookie和js,网站跟踪我的信息就很清楚了。
headers = {
"authority": "seekingalpha.com",
"method": "GET",
"path": "/article/4230872-dillards-still-room-downside",
"scheme": "https",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"accept-encoding": "gzip, deflate, br",
"accept-language": 'en-US,en;q=0.9',
"upgrade-insecure-requests": "1",
"user-agent": RANDOM
}
这与网站使用的很接近:他们添加
"cache-control": "max-age=0",
"if-none-match": 'W/"6f11a6f9219176fda72f3cf44b0a2059"',
根据我的研究,这是用于搜索的 etags,可用于跟踪人员。 'W/...'
更改每个请求。
此外,当我使用 wkhtmltopdf 时将屏幕打印为 pdf,我从未出现过验证码。我也尝试过使用更糟糕的 Selenium 。此外,我尝试使用代理,如 here 所示。 .
所以肯定有办法做到这一点。但是,我做的不正确。有谁知道我做错了什么?
编辑:
session 似乎没有工作
随机 header 似乎不起作用
随机 sleep 似乎不起作用
我可以使用我的 VPN 访问该网页。即使使用请求出现验证码,浏览器中的网站上也没有验证码。
Selenium 不起作用。
我真的不想为解决验证码的服务付费。
我认为问题在于我没有很好地模仿浏览器。
最佳答案
查明被阻止和面临验证码的确切原因并不容易。以下是一些想法:
VPN 和代理
有时,Captcha 服务(在本例中为 Google)可能会将常见的 VPN IP 地址列入黑名单并将其视为潜在威胁,因为很多人都在使用它们并且他们产生大量流量。
有时,代理服务器(尤其是免费的)不是匿名的,可以在请求 header (特别是 X-Forwarded-For header )中发送您的实际 IP 地址
请求 header
您的请求中有某些重要的 header 。使您的请求看起来合法的最简单方法是使用浏览器“开发人员工具”中的“网络”选项卡,并复制浏览器发送的所有 header 。
重要的 header 是 referer
强>。虽然它可能会或可能不会被网站检查,但将它与网站页面(或主页)之一的 URL 放在一起会更安全:
referer: https://seekingalpha.com/
超时和 session
尝试增加请求之间的超时时间。几秒钟应该是合理的。
最后,尝试使用 session
requests
中的对象 .他们自动维护 cookie 并更新 referer
跨多个请求,模拟真实用户浏览网站。我发现它们在克服数据抓取保护方面最有帮助。
验证码
最后的手段是使用服务来破解验证码。有许多在线服务(大部分是付费的)可以做到这一点。一个流行的是 DeathByCaptcha。请记住,您可能会违反网站的使用条款,我不建议这样做:)
关于python - 即使在更改 header 和 IP 后,验证码也会使用请求。我是如何被跟踪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54011831/