使用Python Requests和BeautifulSoup爬取网页文本失败的求助
解决JavaScript渲染页面的文本提取问题
你的当前代码依赖requests获取静态HTML,但很多招聘网站会用JavaScript动态生成内容,这类内容无法通过直接请求HTML获取,需要模拟浏览器执行JS后再提取文本。以下是两种可行的改进方案:
方案一:使用Selenium模拟浏览器
Selenium可以控制真实浏览器加载页面,等待JS执行完成后再提取内容。
- 先安装依赖:
pip install selenium
同时需要下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),并确保驱动路径能被Python找到。
- 改写后的代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup def getTextFromWeb(url): # 初始化Chrome浏览器 driver = webdriver.Chrome() try: driver.get(url) # 等待页面主体加载完成,可根据目标网站调整等待条件 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "body")) ) # 获取JS渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 过滤脚本、样式等无关标签的文本 for script in soup(["script", "style", "noscript"]): script.extract() # 提取有效文本并过滤空行 text = '\n'.join([line.strip() for line in soup.stripped_strings if line.strip()]) return text finally: # 确保浏览器关闭 driver.quit()
方案二:使用Playwright(更简洁的自动化工具)
Playwright是微软推出的自动化工具,自带浏览器驱动管理,使用更简便。
- 安装依赖:
pip install playwright playwright install # 自动下载适配的浏览器驱动
- 改写后的代码:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup def getTextFromWeb(url): with sync_playwright() as p: # 启动无头模式浏览器(不显示界面),需可视化可去掉headless=True browser = p.chromium.launch(headless=True) page = browser.new_page() # 等待DOM加载完成后再获取内容 page.goto(url, wait_until="domcontentloaded") # 获取渲染后的页面源码 page_source = page.content() soup = BeautifulSoup(page_source, "html.parser") # 过滤无关标签 for tag in soup(["script", "style", "noscript"]): tag.extract() # 提取并整理文本 text = '\n'.join([line.strip() for line in soup.stripped_strings if line.strip()]) browser.close() return text
额外优化建议
- 针对招聘网站,可直接定位到招聘内容所在的特定标签(比如带
job-description类名的div),提取该标签下的文本,减少冗余内容。 - 添加异常处理逻辑,比如页面加载超时、网络错误等情况,提升程序健壮性。
内容的提问来源于stack exchange,提问作者user10176535
相关产品推荐
相关产品推荐

