如何从Google Jobs抓取评分数据?请求无评分区域问题排查
问题描述
我正在为Google Jobs开发网页爬虫,使用Python的requests库和BeautifulSoup4工具。发送GET请求获取URL对应的HTML并解析后,无法找到职位页面中**ratings(评分)**区域的HTML内容——该区域在浏览器开发者工具中可见,但写入本地的index.html文件里完全没有这部分内容。
当前实现代码:
res = requests.get(url, headers={"User-Agent": "..."}) site = res.text content = bs4.BeautifulSoup(site, 'html.parser') # 'pE8vnd avtvi'是包含整个职位详情页的div元素的class vals = content.find_all('div', class_ = 'pE8vnd avtvi') with open('./index.html', 'w') as f: f.write(vals[0])
尝试更换不同职位索引写入文件,输出始终不包含评分区域的div,请问我遗漏了什么?
原因及解决办法
- 动态渲染导致内容缺失:评分区域是通过JavaScript动态加载的,
requests库只能获取页面的初始静态HTML,无法执行JS代码,所以这部分内容不会出现在返回的源码里。而浏览器会在加载初始HTML后,自动发送额外请求获取评分数据并渲染到页面上,因此开发者工具能看到完整内容。 - 可行的解决思路:
- 使用浏览器自动化工具:借助Selenium或Playwright模拟真实浏览器的加载过程,等JS渲染完成后再抓取页面源码。示例代码(Selenium):
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import bs4 # 初始化浏览器驱动(需提前下载对应浏览器的驱动) driver = webdriver.Chrome() driver.get(url) # 等待评分区域元素加载完成,替换成实际的评分区域元素选择器 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "替换为评分区域的class")) ) # 获取渲染后的完整页面源码 site = driver.page_source content = bs4.BeautifulSoup(site, 'html.parser') vals = content.find_all('div', class_='pE8vnd avtvi') with open('./index.html', 'w') as f: f.write(str(vals[0])) driver.quit() - 直接调用后端API接口:打开浏览器开发者工具的「网络」面板,筛选XHR/Fetch请求,找到加载评分数据的API接口,直接用
requests调用该接口获取原始数据,这种方式比模拟浏览器更高效。注意要带上请求头中的必要参数(如Cookie、User-Agent等),避免被反爬机制拦截。
- 使用浏览器自动化工具:借助Selenium或Playwright模拟真实浏览器的加载过程,等JS渲染完成后再抓取页面源码。示例代码(Selenium):
- 反爬注意事项:Google Jobs有严格的反爬策略,频繁请求可能会触发IP封禁。建议添加请求间隔、使用代理IP,并且确保爬虫行为符合Google的服务条款。
内容的提问来源于stack exchange,提问作者Ebube Okoli
相关产品推荐
相关产品推荐

