如何在Python代码中绕过Captcha?求自动验证方案及可用库
Kompass爬虫滑块验证码绕过方案及工具推荐
一、绕过滑块验证的最优方案
1. 先优化爬虫行为,降低被检测概率
- 复用浏览器实例:你现在每次循环都新建
uc.Chrome实例然后关闭,频繁创建会话会被网站判定为异常。把driver初始化放在循环外,所有链接爬完再quit,或者用单例模式管理。 - 模拟人类操作节奏:不要固定
time.sleep(5),改用random.uniform(3, 8)生成随机延迟;爬取时模拟页面滚动、随机点击空白区域,不要直接加载完就拿源码。 - 随机化请求标识:用
fake_useragent生成不同的User-Agent,配合undetected-chromedriver的配置,禁用浏览器的自动化特征检测(比如执行driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"))。 - IP轮换:用高匿代理IP池,每次请求切换IP,避免同一IP短时间内频繁访问。
2. 直击问题根源:避开页面验证
- 抓包找API接口:打开浏览器开发者工具的Network面板,刷新目标页面,找返回企业数据的AJAX接口(一般是JSON格式),直接请求这些接口,完全绕开页面的滑块验证。
- 第三方打码服务:如果必须处理滑块,用付费打码平台,这类平台有人工或AI识别验证码,通过API返回验证结果,配合selenium完成滑块拖动。
二、推荐的Python工具库
- undetected-chromedriver:你当前在用的库,针对Chrome反检测做了优化,正确配置后能绕过大部分基础自动化检测,减少滑块触发概率。
- selenium-wire:可以拦截浏览器的所有请求,方便你找到网站的后端API接口,直接请求接口获取数据,不用再处理页面验证码。
- fake_useragent:生成随机的User-Agent字符串,模拟不同浏览器、设备的请求标识,降低被识别为爬虫的风险。
- ddddocr:开源的OCR工具,支持识别滑块验证码的缺口位置,配合selenium的
ActionChains模拟人类拖动轨迹,完成滑块验证。 - captcha-solver:集成多种第三方打码平台的库,适合处理复杂滑块验证码,只需调用API就能获取验证结果,省心但需要付费。
你的爬虫代码
def get_data(): NAME = [] TURNOVER = [] SIZE = [] EMPLOYEES = [] FULL_ADDRESS = [] POST_TOWN = [] POST_CODE = [] SIC_CODE = [] DIRECTORS = [] TELEPHONE = [] EMAIL = [] WEBSITE = [] df = pd.read_csv('./Links.csv') R_LINKS = df['LINKS'].to_list() for links in R_LINKS: print(links) driver = uc.Chrome() try: driver.get(links) time.sleep(5) content = driver.page_source soup = BeautifulSoup(content, 'html.parser') driver.quit() body = soup.body company_name = body.find_all( 'h1', {'itemprop': 'name'})[0].getText() NAME.append(company_name.strip()) kompass_id = body.find_all('tr', {'class': 'trKid'})[ 0].find('td').getText() number = body.find_all('input', { 'id': f'freePhone-contactCompanyForCompany-{kompass_id}'})[0].get('value') TELEPHONE.append(number) website = body.find_all('a', {'id': 'webSite_presentation_0'})[ 0].getText() WEBSITE.append(website) employees = soup.find_all('td', text=re.compile('Employees'))[ 0].getText() EMPLOYEES.append(employees) address = body.find_all('p', {'class': 'blockAddress'})[ 0].getText().split() postcode = address[len(address) - 2] + ' ' + \ address[len(address) - 1] POST_CODE.append(postcode) fulladdress = [] for a in body.find_all('p', {'class': 'blockAddress'}): address = a.getText() fulladdress.append(address.strip()) addressses = ' '.join(fulladdress).split() FULL_ADDRESS.append(' '.join(addressses)) type = soup.find('th', text=re.compile('SIC07')) SIC_CODE.append(type.parent.findNext('td').contents[0].strip()) directors = [] for d in body.find_all('p', {'class': 'executiveName'}): director = d.getText() directors.append(director.strip()) DIRECTORS.append(' '.join(directors)) except: pass print('POST_CODE', POST_CODE) new_df = pd.DataFrame({ 'POST_CODE': POST_CODE, 'FULL_ADDRESS': FULL_ADDRESS, 'SIC_CODE': SIC_CODE, 'DIRECTORS': DIRECTORS, 'NAME': NAME, 'POST_CODE': POST_CODE, 'TELEPHONE': TELEPHONE, 'WEBSITE': WEBSITE }) new_df.to_csv('data.csv', mode='a', index=False, header=False)
目标链接
- https://gb.kompass.com/c/unisto-ltd/gb82592280/
- https://gb.kompass.com/c/spotler/gb25036694/
- https://gb.kompass.com/c/parts-plus/gb55346048/
内容的提问来源于stack exchange,提问作者Code Ninja
相关产品推荐
相关产品推荐

