如何扩展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
相关产品推荐
相关产品推荐

