使用Selenium Python爬取builtin.com遇JavaScript未启用报错如何解决
问题原因
- 该站点部署了反爬虫机制,会识别请求的客户端特征,一旦判定为自动化爬虫访问,就会直接返回带有noscript提示的静态页面,和客户端是否开启JS能力没有直接关系。
- PhantomJS早已停止维护,本身的浏览器特征标记非常明显,基本是所有反爬系统的重点拦截对象,被拦截属于正常情况。
- 默认启动的ChromeDriver带有
navigator.webdriver=true等独有自动化标记,很容易被站点识别拦截,和你本地手动打开的Chrome浏览器特征完全不同。 - 直接用BeautifulSoup发起HTTP请求没有JS渲染能力,只能拿到首屏未渲染的静态源代码,自然只有noscript提示。
修复方案
方案1:给ChromeDriver添加反识别参数(推荐)
调整启动参数消去自动化特征,代码示例如下,自行替换ChromeDriver路径即可:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() # 移除自动化控制标记 chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) # 伪装正常浏览器的UA标识 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) # 执行脚本覆盖webdriver属性,进一步消除特征 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) driver.get("https://builtin.com/jobs") # 等待页面渲染完成,也可替换为显式等待定位目标元素 time.sleep(3) html = driver.page_source print(html)
如果运行后仍被拦截,可以尝试添加--headless=new参数开启无头模式,或是手动在启动的浏览器中完成一次人机验证,后续请求即可正常获取内容。
方案2:使用自带反识别能力的渲染工具
如果需要批量爬取页面,可以直接使用Playwright,默认自带特征隐藏能力,不需要手动配置过多参数:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") page.goto("https://builtin.com/jobs") # 等待页面加载 page.wait_for_load_state("networkidle") html = page.content() print(html) browser.close()
内容的提问来源于stack exchange,提问作者rndm
相关产品推荐
相关产品推荐

