使用爬虫登录Upwork遭Cloudflare拦截,求解决方案或是否改用Selenium
解决Upwork登录爬虫被Cloudflare拦截的问题
核心原因
Cloudflare的反爬机制会检测浏览器指纹(JS执行能力、Cookie状态、请求头完整性等),cloudscraper仅能绕过基础验证,但Upwork的防护更严格,再加上你提交的表单数据不完整(缺少隐藏验证字段),导致验证失败后跳转回登录页。
先尝试优化cloudscraper方案
不用直接换Selenium,先完善请求流程:
- 抓取所有表单字段:登录页面的表单包含隐藏的验证字段(如CSRF令牌、
login[_token]等),必须从初始GET请求的HTML中提取这些字段并加入表单数据,否则服务器会直接拒绝请求。
修改后的示例代码:from bs4 import BeautifulSoup import cloudscraper url = "https://www.upwork.com/ab/account-security/login" username = "你的用户名" password = "你的密码" scraper = cloudscraper.create_scraper() def main(): # 初始请求获取页面及表单字段 response = scraper.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 提取表单内所有输入字段(含隐藏项) form_data = {} form = soup.find('form') for input_tag in form.find_all('input'): name = input_tag.get('name') if name: form_data[name] = input_tag.get('value', '') # 替换用户名和密码字段 form_data['login[username]'] = username form_data['login[password]'] = password # 补充请求头,保持一致性 headers = { 'Referer': url, 'User-Agent': scraper.headers['User-Agent'] } # 确认表单提交的目标URL(可能不是当前页面) form_action = form.get('action') if not form_action.startswith('http'): form_action = "https://www.upwork.com" + form_action response = scraper.post(form_action, data=form_data, headers=headers) # 检查登录状态 if "dashboard" in response.url: print("登录成功") else: print("仍被拦截,需进一步处理") if __name__ == "__main__": main() - 更新cloudscraper版本:执行
pip install --upgrade cloudscraper,新版本会跟进Cloudflare的验证规则更新。
改用Selenium的必要性
如果上述优化后还是被拦截,直接换Selenium是更稳妥的选择:
Selenium模拟真实浏览器行为,能自动处理Cloudflare的JS验证(甚至人机验证),更难被检测。注意以下细节:
- 使用
undetected-chromedriver替代原生Selenium,它能绕过Chrome的自动化标识检测; - 添加等待时间,模拟真实用户操作节奏;
- 避免快速连续操作,降低被识别风险。
示例Selenium代码片段:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import undetected_chromedriver as uc def main(): driver = uc.Chrome() driver.get("https://www.upwork.com/ab/account-security/login") # 等待用户名输入框加载 username_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "login[username]")) ) username_input.send_keys("你的用户名") # 点击继续按钮 continue_btn = driver.find_element(By.ID, "login_password_continue") continue_btn.click() # 等待密码输入框加载 password_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "login[password]")) ) password_input.send_keys("你的密码") # 点击登录按钮 login_btn = driver.find_element(By.ID, "login_control_continue") login_btn.click() # 验证登录成功 WebDriverWait(driver, 10).until( EC.url_contains("dashboard") ) print("登录成功") driver.quit() if __name__ == "__main__": main()
额外提示
Upwork的反爬机制非常严格,即便登录成功,后续操作也可能被检测。如果是技术挑战,先确认是否允许使用爬虫工具,避免违反平台规则导致账号封禁。
内容的提问来源于stack exchange,提问作者Raul Quinzani
相关产品推荐
相关产品推荐

