如何使用HTTPX携带Anti-Captcha获取的gRecaptchaResponse绕过Google reCAPTCHA V2并完成后续数据搜索?
如何使用HTTPX携带Anti-Captcha获取的gRecaptchaResponse绕过Google reCAPTCHA V2并完成后续数据搜索?
看起来你已经通过Anti-Captcha拿到了有效的reCAPTCHA响应值,但在把这个值提交给目标网站、完成验证并执行后续搜索时遇到了卡点。我来帮你梳理正确的流程,同时修正你代码里的问题:
一、先正确从Anti-Captcha获取gRecaptchaResponse
你代码里初始化了recaptchaV2Proxyless但没实际调用它来获取响应,这是第一步要补全的:
def solve_captcha(self): """调用Anti-Captcha API获取reCAPTCHA响应""" self.solver.set_verbose(1) self.solver.set_key(self.api_key) self.solver.set_website_url(self.url) # 目标网站的URL self.solver.set_website_key(self.website_key) # 目标网站的reCAPTCHA Sitekey # 执行破解,获取结果 captcha_result = self.solver.solve_and_return_solution() if captcha_result["errorId"] == 0: # 返回有效的gRecaptchaResponse return captcha_result["solution"]["gRecaptchaResponse"] else: raise Exception(f"Anti-Captcha破解失败: {captcha_result['errorDescription']}")
这里要确保你传入的api_key和website_key是正确的——website_key就是目标网站reCAPTCHA控件里的data-sitekey值。
二、将gRecaptchaResponse提交到目标网站的验证表单
你在parse方法里找到了表单的action地址,接下来需要把拿到的gRecaptchaResponse作为表单参数提交,完成reCAPTCHA验证(这一步要保持同一个HTTPX Client会话,因为验证后网站会设置会话cookie):
def parse(self): """获取目标网站的表单提交地址,并完成reCAPTCHA验证""" # 先访问目标页面,获取表单信息和必要的cookie soup = self.client.get(url=self.url, headers=self.headers) # 找到表单的action地址 form_action = soup.css_first("form#SLSearchForm[action]").attrs["action"] base_url = f"https://mybaragar.com/{form_action}" # 先获取gRecaptchaResponse g_recaptcha_response = self.solve_captcha() # 准备表单提交的参数(除了reCAPTCHA,还要带上表单里的其他必填参数) form_data = { "g-recaptcha-response": g_recaptcha_response, # 这里需要补充表单里的其他必填字段,比如搜索关键词、地区等,你可以从页面源码里找到 # 比如"searchTerm": "your_search_query", # "location": "west_vancouver" } # 提交表单,完成reCAPTCHA验证 validation_response = self.client.post(base_url, data=form_data, headers=self.headers) # 验证是否提交成功,可以检查响应状态码或者页面内容 if validation_response.status_code == 200: print("reCAPTCHA验证成功,已进入搜索页面") # 返回验证后的会话,方便后续搜索 return validation_response else: raise Exception("reCAPTCHA验证失败,请求返回异常")
注意:表单里除了g-recaptcha-response,肯定还有其他必填参数,你需要从目标网站的表单源码里把这些参数找出来,一起放到form_data里。
三、执行后续的数据搜索请求
验证完成后,同一个HTTPX Client已经持有了有效的会话cookie,直接用它来执行搜索请求即可:
def search(self, update: bool = False): """完成数据搜索并处理结果""" # 先完成reCAPTCHA验证,获取验证后的页面响应 validated_response = self.parse() # 这里可以从validated_response里提取搜索结果,或者构造新的搜索请求 # 比如如果搜索是通过另一个接口,可以构造请求参数 search_params = { # 补充搜索需要的参数,比如从页面里拿到的csrf token、搜索关键词等 } search_response = self.client.get("https://mybaragar.com/your_search_endpoint", params=search_params, headers=self.headers) # 处理搜索结果,比如解析HTML或者JSON # 示例:用BeautifulSoup解析页面 search_soup = BeautifulSoup(search_response.text, "html.parser") # 提取你需要的数据... # 你之前代码里的geographic.org部分和目标网站无关,建议替换成目标网站的搜索逻辑 # 如果确实需要从外部CSV获取搜索关键词,那可以保留这部分,但要把关键词传入目标网站的搜索请求 if update: searcher = SearchGenerator( search_url="https://geographic.org/streetview/canada/bc/west_vancouver.html", update_data=update, ) reports = searcher.report() df = pd.read_csv(reports) # 遍历CSV里的关键词,逐个发起搜索请求 for index, row in df.iterrows(): search_term = row["your_keyword_column"] # 构造包含关键词的表单参数,重新提交搜索 form_data = { "g-recaptcha-response": self.solve_captcha(), # 如果每次搜索都需要验证,这里要重新获取 "searchTerm": search_term } self.client.post(base_url, data=form_data, headers=self.headers) # 处理当前搜索结果...
几个关键注意点
- 保持会话一致性:全程使用同一个
self.client(HTTPX Client),这样才能保留网站设置的会话cookie,避免重复验证。 - 表单参数完整性:一定要把目标网站表单里的所有必填参数都带上,只传
g-recaptcha-response是不够的。 - Anti-Captcha调用时机:如果目标网站每次搜索都需要验证reCAPTCHA,那每次搜索前都要调用
solve_captcha获取新的响应值;如果验证一次就可以多次搜索,那就只需要调用一次。
备注:内容来源于stack exchange,提问作者perymerdeka
相关产品推荐
相关产品推荐

