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

如何扩展Python lxml脚本实现Glassdoor多页职位列表爬取?

嘿,这个问题我刚好折腾过,给你梳理几个实用步骤来扩展你的脚本,实现从第1页到最后一页的全量爬取:

扩展Glassdoor爬虫实现多页全量爬取

首先得摸清楚Glassdoor的分页逻辑——这类网站的分页通常分两种情况:URL带页码参数,或者通过动态加载(比如点击下一页按钮触发AJAX请求)。下面分场景给你具体方案:

1. 优先处理URL带页码参数的情况

先手动访问目标职位列表,翻几页看看URL的变化。比如常见的格式是:

  • 第1页:https://www.glassdoor.com/Job/xxx-jobs.htm?page=1
  • 第2页:https://www.glassdoor.com/Job/xxx-jobs.htm?page=2

如果是这种规则,那实现起来非常直接:

  • 写一个循环,从页码1开始递增,直到请求返回的页面没有职位数据为止
  • 每次循环把当前页码拼接到基础URL里,发送请求、解析数据

示例代码片段

import requests
from lxml import html
import time
import csv

# 初始化CSV存储文件
with open('glassdoor_jobs.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['职位名称', '公司名称', '工作地点'])

# 基础URL,{}用来填充页码
base_url = "https://www.glassdoor.com/Job/python-jobs.htm?page={}"
page_num = 1

while True:
    # 构造当前页的完整URL
    current_url = base_url.format(page_num)
    
    # 模拟浏览器请求,必须加User-Agent避免被拦截
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    
    try:
        response = requests.get(current_url, headers=headers)
        response.raise_for_status()  # 捕获请求错误
    except Exception as e:
        print(f"第{page_num}页请求失败:{str(e)}")
        page_num += 1
        time.sleep(3)
        continue
    
    # 解析页面
    tree = html.fromstring(response.content)
    
    # 检查当前页是否还有职位卡片(根据你原来的XPATH调整)
    job_cards = tree.xpath('//div[contains(@class, "JobCard")]')
    if not job_cards:
        print("已爬取到最后一页,结束任务")
        break
    
    # 遍历解析每个职位信息(替换成你原来的解析逻辑)
    for card in job_cards:
        try:
            job_title = card.xpath('.//h3[contains(@class, "JobCardTitle")]/text()')[0].strip()
            company_name = card.xpath('.//div[@class="EmployerProfile"]/text()')[0].strip()
            location = card.xpath('.//div[@class="location"]/text()')[0].strip()
            
            # 写入CSV
            with open('glassdoor_jobs.csv', 'a', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow([job_title, company_name, location])
                
            print(f"已爬取:{job_title} - {company_name}")
        except IndexError:
            print(f"第{page_num}页某职位信息解析失败,跳过")
            continue
    
    # 页码递增,加延迟避免请求过于频繁被封禁
    page_num += 1
    time.sleep(2)

2. 处理动态加载的分页(URL无页码参数)

如果Glassdoor是通过点击「下一页」按钮触发AJAX加载数据(URL不会变),那需要:

  • 先用浏览器开发者工具(F12)抓包,找到下一页请求的API接口(通常是带page参数的JSON接口)
  • 直接循环请求这个API接口,直到返回的数据为空
  • 如果接口有签名验证,可能需要改用selenium模拟浏览器点击下一页的操作,但这种方式效率较低,且更容易被反爬检测

关键注意事项

  • 反爬防护:Glassdoor反爬很严格,一定要加User-Agent,必要时可以用代理IP池,避免IP被封禁
  • 异常处理:必须捕获请求失败、解析失败的情况,避免脚本中途崩溃
  • 数据存储:优先用CSV或数据库存储爬取结果,不要只打印输出,防止数据丢失

这样修改后,你的脚本就能自动从第1页爬到最后一页了,亲测有效哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:12