如何使用 Python 抓取 Glassdoor 数据

评论: 0

Glassdoor 是最好的平台之一,它为求职者和想要雇用他们的人提供了广泛的信息,包括薪资信息、雇主评论和求职申请。在本指南中,我们将介绍使用 Python 和 Playwright 从 Glassdoor 搜刮职位列表的过程。Playwright 在这里至关重要,因为 Glassdoor 采用了强大的反僵尸措施,可以标记并阻止传统的搜索库。有了 Playwright,我们就可以模拟真实浏览器并加入代理,帮助我们绕过这些检测系统。

由于 Glassdoor 具有强大的反抓取机制,使用请求等库直接请求可能会导致 IP 屏蔽或验证码问题。Playwright 允许我们自动化浏览器,使我们的交互更像人机交互。通过添加代理和浏览器标头,我们可以进一步避免检测。

要求

要开始使用,您需要安装 Playwright 和用于 HTML 解析的 lxml 库。安装方法如下


pip install playwright lxml
playwright install

搜索 Glassdoor 招聘信息

从使用 Playwright 加载页面到提取任务详细信息并将数据保存到 CSV 文件,我们将逐一介绍每一个步骤。

步骤 1.设置浏览器并提出请求

首先,用代理设置 Playwright 以连接 Glassdoor。这有助于防止被拦截,并允许浏览器像真实用户访问网站一样加载页面。


from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https link', timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# 调用函数检索页面内容
html_content = await scrape_job_listings()

步骤 2.解析 HTML 并提取数据

加载页面后,使用 lxml 解析 HTML 内容并提取相关职位信息。以下是如何解析每个职位列表的职位名称、地点、薪资和其他详细信息:


parser = fromstring(html_content)
job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')

jobs_data = []
for element in job_posting_elements:
    job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
    job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
    salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
    job_link = element.xpath('.//a[@data-test="job-title"]/@href')[0]
    easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
    company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
    
    job_data = {
        'company': company,
        'job_title': job_title,
        'job_location': job_location,
        'job_link': job_link,
        'salary': salary,
        'easy_apply': easy_apply
    }
    jobs_data.append(job_data)

步骤 3.将数据保存到 CSV 文件

提取工作详细信息后,我们可以将其保存到 CSV 文件中,以便于进行数据分析。


import csv

with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
    writer.writeheader()
    writer.writerows(jobs_data)

完整代码


import csv
from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    # 使用代理服务器设置 Playwright 浏览器,以避免被检测到
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm', timeout=60000)
        
        # 读取页面内容并关闭浏览器
        content = await page.content()
        await browser.close()
        
        # 使用 lxml 解析内容
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # 提取每个职位列表的数据
        jobs_data = []
        for element in job_posting_elements:
            job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
            job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
            salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
            job_link = "https://www.glassdoor.com" + element.xpath('.//a[@data-test="job-title"]/@href')[0]
            easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
            company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
            
            job_data = {
                'company': company,
                'job_title': job_title,
                'job_location': job_location,
                'job_link': job_link,
                'salary': salary,
                'easy_apply': easy_apply
            }
            jobs_data.append(job_data)
    
        # 将数据保存为 CSV 文件
        with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
            writer.writeheader()
            writer.writerows(jobs_data)

# 运行刮擦功能
import asyncio
asyncio.run(scrape_job_listings())

完整代码的解释:

  1. 使用代理设置浏览器:代码会启动 Playwright 浏览器会话,并使用代理来模拟人类浏览行为。headless=False 设置可使浏览器窗口保持打开,从而进一步帮助绕过僵尸检测。
  2. 导航至职位列表页面:脚本会访问 Glassdoor 的职位列表 URL,查看美国的软件工程职位。
  3. 解析内容:使用 lxml 提取职位数据,进行 HTML 解析。我们会捕捉职位名称、地点、薪资、职位链接、公司名称以及是否是易申请职位。
  4. 保存为 CSV:提取所有数据后,脚本会将其保存为 CSV 文件 glassdoor_job_listings.csv,并为每个属性设置列。

尊重 Glassdoor 的服务条款

在搜索 Glassdoor 或其他网站时,必须遵循负责任的搜索实践:

  • 遵守速率限制:在请求之间实施延迟,避免服务器不堪重负。
  • 使用轮换代理:轮流使用代理和 IP,将被禁言的风险降至最低。
  • 遵守服务条款:定期查看网站的服务条款,避免违反条款的行为。

当你知道如何使用 Python 和 Playwright 搜刮 Glassdoor 的数据时,你就能轻松提高收集职位列表的能力。这种技术与使用代理和适当的标头相结合,可以有效消除被 Glassdoor 屏蔽的风险。您还需要注意道德搜索政策,以防止 Glassdoor 服务器崩溃。只要遵守这些措施,您现在就可以从 Glassdoor 获取并处理有用的就业信息,供自己或公司使用。

评论:

0 评论