You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Glassdoor评论:无法获取Advice to Management字段求助

解决Glassdoor评论中“给管理层的建议”字段爬取失败问题

问题分析

你的代码主要存在以下核心问题,导致无法获取目标字段:

  1. URL请求错误:extract函数设计为接收页码参数拼接URL,但调用时传入了完整URL,导致最终请求的URL格式混乱,无法获取正确的评论页面内容。
  2. 语法错误:Cons字段的异常处理块中使用了Cons: None(冒号),正确写法应为Cons = None(等号),虽未影响其他字段,但会引发语法逻辑问题。
  3. 翻页逻辑错误:判断下一页的代码语法错误,soup.find的参数格式不正确,无法正确识别下一页按钮。

修正后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd 

def extract(pg): 
    headers = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.80 Safari/537.36'}
    # 仅传入页码,由函数拼接正确URL
    url = f'https://www.glassdoor.com/Reviews/Google-Engineering-Reviews-EI_IE9079.0,6_DEPT1007_IP{pg}.htm?sort.sortType=RD&sort.ascending=false&filter.iso3Language=eng'
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'html.parser')
    return soup

def transform(soup): 
    divs = soup.find_all('div', class_='gdReview')
    for item in divs:
        # 标题
        try:
            Title = item.find('h2', class_='mb-xxsm mt-0 css-93svrw el6ke055').text.strip()
        except:
            Title = None

        # 评分
        try:
            Rating = item.find('span', class_='ratingNumber mr-xsm').text.strip()
        except:
            Rating = None    

        # 员工状态
        try:
            Employee_Situation = item.find('span', class_='pt-xsm pt-md-0 css-1qxtz39 eg4psks0').text.strip()
        except:
            Employee_Situation = None  

        # 优点
        try:   
            Pros = item.find('span', {'data-test':'pros'}).text.strip()
        except:
            Pros = None

        # 缺点(修正语法错误)
        try:  
            Cons = item.find('span', {'data-test':'cons'}).text.strip()
        except:
            Cons = None

        # 给管理层的建议
        try:    
            Advice_To_Management = item.find('span', {'data-test':'advice-management'}).text.strip()
        except: 
            Advice_To_Management = None

        # 作者信息
        try:
            Auhtor_Info = item.find('span', class_='common__EiReviewDetailsStyle__newUiJobLine').text.strip()
        except:  
            Auhtor_Info = None

        Reviews = {
            'Title' : Title,
            'Rating': Rating,
            'Employee_Situation' : Employee_Situation,
            'Pros' : Pros,
            'Cons' : Cons,
            'Advice_To_Management' : Advice_To_Management,
            'Auhtor_Info' : Auhtor_Info,
        } 
        ReviewsList.append(Reviews)
    return
   

ReviewsList = []

# 循环爬取页面,示例爬1-2页,可按需修改范围
for i in range(1, 3):
    soup = extract(i)  # 仅传入页码
    print(f'处理第{i}页')
    transform(soup)
    print(f'当前累计评论数:{len(ReviewsList)}')
    
    # 检查是否有下一页,修正查找逻辑
    next_btn = soup.find('button', {'data-test': 'nextButton', 'class': 'css-1hq9k8 e13qs2071'})
    if not next_btn:
        break


df = pd.DataFrame(ReviewsList)
# 去重,修正引号格式
df2 = df.drop_duplicates(subset=["Title", "Rating", "Employee_Situation", "Pros", "Cons", "Auhtor_Info"], keep='first')
df2.to_csv('Google Reviews.csv', index=False)
print(f'最终保存评论数:{len(df2)}')

关键修正点说明

  • URL拼接修正:调用extract函数时仅传入页码数字,由函数内部拼接正确的Glassdoor评论页面URL,确保请求的页面内容正确。
  • 语法错误修复:将Cons: None改为Cons = None,符合Python语法规范。
  • 元素查找优化:移除不必要的HTML标签文本替换,直接使用.text.strip()获取干净的文本内容。
  • 翻页逻辑修正:正确使用soup.find查找下一页按钮,判断是否继续爬取。

额外注意事项

  • Glassdoor有反爬机制,频繁请求可能被限制IP,建议添加请求间隔(如time.sleep(2)),必要时可使用代理IP。
  • 部分评论可能确实没有“给管理层的建议”内容,此时字段值为None,属于正常情况。

内容的提问来源于stack exchange,提问作者user19810494

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:26:06