Python爬取Glassdoor评论:无法获取Advice to Management字段求助
解决Glassdoor评论中“给管理层的建议”字段爬取失败问题
问题分析
你的代码主要存在以下核心问题,导致无法获取目标字段:
- URL请求错误:
extract函数设计为接收页码参数拼接URL,但调用时传入了完整URL,导致最终请求的URL格式混乱,无法获取正确的评论页面内容。 - 语法错误:
Cons字段的异常处理块中使用了Cons: None(冒号),正确写法应为Cons = None(等号),虽未影响其他字段,但会引发语法逻辑问题。 - 翻页逻辑错误:判断下一页的代码语法错误,
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
相关产品推荐
相关产品推荐

