每一位参与数据抓取的 SEO 专家都知道,CAPTCHA 是一个具有挑战性的障碍,限制了对所需信息的访问。但是否值得完全避免,还是学习如何绕过它更好?让我们通过真实的例子和有效的方法来分析验证码是什么,为什么它被如此广泛地使用,以及 SEO 专家如何绕过它。
每个 SEO 专业人士都遇到过验证码。如果没有,他们要么不是专业人士,要么误解了首字母缩略词 SEO(可能与 SMM 或 CEO 混淆),或者他们才刚刚开始这项具有挑战性的工作。
CAPTCHA(“完全自动化的公共图灵测试来区分计算机和人类”)是一种保护网站免受自动化操作(例如数据抓取或机器人攻击)的方法。验证码被翻译为“Полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей。”
人们可能多年来一直否认验证码被高估,并认为它不值得投入大量资源。但是,当您需要从搜索引擎(例如 Yandex)检索数据,而对 XML 请求一无所知时,这些论点就站不住脚了……或者,例如,如果客户想要抓取整个 Amazon 并且支付了很高的费用……不然后问题出现了:“别再说了……”
情况并不像看起来那么简单。保护网站免遭数据抓取可能很困难,特别是如果它是非商业项目或“仓鼠网站”。通常,既没有时间,也没有意愿(最重要的是)为验证码分配资源。但如果你是一个带来数百万收入的主要门户网站的所有者,情况就不同了。那么考虑全面保护是有意义的,包括防止 DDoS 攻击或不诚实竞争对手的措施。
例如,亚马逊应用了三种类型的验证码,每种类型出现在不同的情况下,并且他们随机更改设计,以便自动化工具和抓取工具不能依赖过时的方法。这使得绕过它们的保护变得复杂且成本高昂。
如果我们谈论的是较小的网站管理员,他们也明白复杂的验证码会阻止真正的用户,特别是在网站的门槛太高的情况下。与此同时,让网站不受保护是不明智的——它甚至会吸引最愚蠢的机器人,它们可能无法绕过验证码,但仍然可以执行大规模操作。
现代网站所有者尝试通过使用通用解决方案(例如 reCAPTCHA 或 hCaptcha)来找到平衡。这可以保护网站免受简单机器人的侵害,而不会给用户造成严重不便。仅当网站面临大规模机器人攻击时才会使用更复杂的验证码。
让我们从 SEO 专家的角度考虑这个问题:他们为什么以及出于什么目的可能需要绕过验证码?
验证码绕过对于最基本的任务可能是必要的——分析搜索引擎中的位置。当然,这可以通过对每日位置监控收费的第三方服务来实现。此外,您还需要支付第三方验证码识别服务的费用。
验证码在研究竞争对手网站时也可能相关。由于保护级别不同,绕过竞争对手网站上的验证码通常比收集搜索排名更容易。
自动化日常任务是一个更小众的话题。并不是每个人都使用它,但对于专门的 SEO 专家来说,它可以是节省时间和精力的宝贵工具。
一般来说,计算成本效益很重要——购买位置监控服务和验证码识别服务更便宜,还是创建自己的解决方案并降低成本更便宜?当然,如果只有一两个项目并且客户付费,则后一种选择听起来过于劳动密集型。但如果你拥有多个项目并自己支付所有费用……那就值得考虑了。
让我们探索比简单地在密钥收集器中插入 API 密钥需要更多努力的方法。您需要更深入的知识,而不仅仅是知道如何在服务主页上查找 API 密钥并将其插入正确的字段。
最流行的方法是将验证码发送到专门的服务(例如 2Captcha 或 RuCaptcha),该服务返回现成的解决方案。这些服务需要根据解决的验证码付费。
以下是用 Python 解决 reCAPTCHA V2 的标准代码示例:
import requests import time API_KEY = 'YOUR_2CAPTCHA_KEY' SITE_KEY = 'YOUR_SITE_KEY' PAGE_URL = 'https://example.com' def get_captcha_solution(): captcha_id_response = requests.post("http://2captcha.com/in.php", data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': SITE_KEY, 'pageurl': PAGE_URL, 'json': 1 }).json() if captcha_id_response['status'] != 1: print(f"Error: {captcha_id_response['request']}") return None captcha_id = captcha_id_response['request'] print(f"CAPTCHA sent. ID: {captcha_id}") for attempt in range(30): time.sleep(5) result = requests.get("http://2captcha.com/res.php", params={ 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 }).json() if result['status'] == 1: print(f"CAPTCHA solved: {result['request']}") return result['request'] elif result['request'] == 'CAPCHA_NOT_READY': print(f"Waiting for solution... attempt {attempt + 1}/30") else: print(f"Error: {result['request']}") return None return None captcha_solution = get_captcha_solution() if captcha_solution: print('CAPTCHA solution:', captcha_solution) else: print('Solution failed.')
此代码可帮助您自动提交验证码进行解决并接收绕过保护所需的令牌。
第二种方法涉及使用住宅代理轮换 IP 地址。这使您可以像不同的人一样从每个新代理访问该网站,从而降低了验证码激活的可能性。
以下是 Python 中使用代理轮换的代码示例:
import requests from itertools import cycle import time import urllib.parse # List of proxies with individual logins and passwords proxies_list = [ {"proxy": "2captcha_proxy_1:port", "username": "user1", "password": "pass1"}, {"proxy": "2captcha_proxy_2:port", "username": "user2", "password": "pass2"}, {"proxy": "2captcha_proxy_3:port", "username": "user3", "password": "pass3"}, # Add more proxies as needed ] # Proxy rotation cycle proxy_pool = cycle(proxies_list) # Target URL to work with url = "https://example.com" # Headers to simulate a real user headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0" } # Sending several requests with proxy rotation for i in range(5): # Specify the number of requests needed proxy_info = next(proxy_pool) proxy = proxy_info["proxy"] username = urllib.parse.quote(proxy_info["username"]) password = urllib.parse.quote(proxy_info["password"]) # Create a proxy with authorization proxy_with_auth = f"http://{username}:{password}@{proxy}" try: response = requests.get( url, headers=headers, proxies={"http": proxy_with_auth, "https": proxy_with_auth}, timeout=10 ) # Check response status if response.status_code == 200: print(f"Request {i + 1} via proxy {proxy} was successful.") else: print(f"Request {i + 1} ended with status code {response.status_code}") except requests.exceptions.RequestException as e: print(f"Error with proxy {proxy}: {e}") # Delay between requests for natural behavior time.sleep(2)
此示例演示如何使用代理轮换向目标站点发出请求,降低被阻止的风险。
第三种方法涉及使用像 Selenium 这样的无头浏览器来模拟真实的用户操作。这种方法可能更耗费人力,但也更有效。
这是使用 Selenium 进行代理轮换的示例代码:
import requests import time API_KEY = 'YOUR_2CAPTCHA_KEY' SITE_KEY = 'YOUR_SITE_KEY' PAGE_URL = 'https://example.com' def get_captcha_solution(): captcha_id_response = requests.post("http://2captcha.com/in.php", data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': SITE_KEY, 'pageurl': PAGE_URL, 'json': 1 }).json() if captcha_id_response['status'] != 1: print(f"Error: {captcha_id_response['request']}") return None captcha_id = captcha_id_response['request'] print(f"CAPTCHA sent. ID: {captcha_id}") for attempt in range(30): time.sleep(5) result = requests.get("http://2captcha.com/res.php", params={ 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 }).json() if result['status'] == 1: print(f"CAPTCHA solved: {result['request']}") return result['request'] elif result['request'] == 'CAPCHA_NOT_READY': print(f"Waiting for solution... attempt {attempt + 1}/30") else: print(f"Error: {result['request']}") return None return None captcha_solution = get_captcha_solution() if captcha_solution: print('CAPTCHA solution:', captcha_solution) else: print('Solution failed.')
此示例展示了如何使用 Selenium 通过滚动并与网站上的元素交互来模拟真实用户。
总之,如果您有时间并且想要完成代码,结合代理轮换和无头浏览器等方法可以产生出色的结果。如果您想简化事情,请使用为任务提供现成工具的服务。然而,针对每项特定任务仔细选择最合适的工具至关重要。
祝您免验证码访问!
以上是为 SEO 专家提供的高级验证码绕过技术以及代码示例的详细内容。更多信息请关注PHP中文网其他相关文章!