Cách cạo dữ liệu Glassdoor bằng Python

Bình luận: 0

Glassdoor là một trong những nền tảng tốt nhất cung cấp một loạt thông tin cho những người cả hai tìm kiếm việc làm và muốn thuê chúng, bao gồm thông tin lương, đánh giá sử dụng lao động và đơn xin việc. Trong hướng dẫn này, chúng tôi sẽ đi qua quá trình loại bỏ danh sách công việc từ Glassdoor bằng cách sử dụng Python và nhà viết kịch. Nhà viết kịch là điều cần thiết ở đây vì Glassdoor sử dụng các biện pháp chống bot mạnh mẽ, có thể gắn cờ và chặn các thư viện cạo truyền thống. Với nhà viết kịch, chúng tôi có thể mô phỏng một trình duyệt thực và bao gồm các proxy, giúp chúng tôi bỏ qua các hệ thống phát hiện này.

Do các cơ chế chống xẹp mạnh mẽ của Glassdoor, các yêu cầu trực tiếp với các thư viện như yêu cầu có thể dẫn đến việc chặn IP hoặc các thách thức CAPTCHA. Nhà viết kịch cho phép chúng tôi tự động hóa một trình duyệt, làm cho các tương tác của chúng tôi giống con người hơn. Bằng cách thêm các proxy và tiêu đề trình duyệt, chúng ta có thể tránh phát hiện hơn nữa.

Yêu cầu

Để bắt đầu, bạn sẽ cần cài đặt Nhà viết kịch và thư viện LXML để phân tích cú pháp HTML. Bạn có thể cài đặt chúng như sau:


pip install playwright lxml
playwright install

Danh sách công việc Glassdoor cào

Chúng tôi sẽ đi qua từng bước, từ việc tải trang với nhà viết kịch đến trích xuất chi tiết công việc và lưu dữ liệu vào tệp CSV.

Bước 1. Thiết lập trình duyệt và đưa ra yêu cầu

Đầu tiên, thiết lập nhà viết kịch với một proxy để kết nối với Glassdoor. Điều này giúp ngăn chặn việc bị chặn và cho phép trình duyệt tải trang như thể người dùng thực sự truy cập trang web.


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

# Gọi chức năng để truy xuất nội dung trang
html_content = await scrape_job_listings()

Bước 2. Phân tích HTML và trích xuất dữ liệu

Sau khi tải trang, sử dụng LXML để phân tích nội dung HTML và trích xuất thông tin công việc có liên quan. Tại đây, cách phân tích danh hiệu công việc, vị trí, tiền lương và các chi tiết khác cho từng danh sách công việc:


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)

Bước 3. Lưu dữ liệu vào tệp CSV

Khi chúng tôi đã trích xuất các chi tiết công việc, chúng tôi có thể lưu chúng vào một tệp CSV để phân tích dữ liệu dễ dàng.


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)

Hoàn thành mã


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

async def scrape_job_listings():
    # Thiết lập trình duyệt nhà viết kịch với proxy để tránh phát hiện
    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)
        
        # Truy xuất nội dung trang và đóng trình duyệt
        content = await page.content()
        await browser.close()
        
        # Phân tích nội dung với LXML
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Trích xuất dữ liệu cho mỗi danh sách công việc
        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)
    
        # Lưu dữ liệu vào tệp 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)

# Chạy chức năng cạo
import asyncio
asyncio.run(scrape_job_listings())

Giải thích về mã hoàn chỉnh:

  1. Thiết lập trình duyệt với proxy: Mã bắt đầu một phiên trình duyệt với nhà viết kịch, kết hợp proxy để bắt chước hành vi duyệt của con người. Cài đặt false không đầu = cho phép cửa sổ trình duyệt vẫn mở, điều này có thể giúp tiếp tục bỏ qua phát hiện bot.
  2. Điều hướng đến trang Danh sách công việc: Kịch bản truy cập URL Danh sách công việc Glassdoor cho các công việc kỹ thuật phần mềm ở Hoa Kỳ.
  3. Phân tích nội dung: Dữ liệu công việc được trích xuất bằng LXML để phân tích cú pháp HTML. Chúng tôi nắm bắt tiêu đề công việc, địa điểm, tiền lương, liên kết công việc, tên công ty và nếu đó là một công việc dễ dàng áp dụng.
  4. Lưu vào CSV: Sau khi trích xuất tất cả dữ liệu, tập lệnh lưu nó vào tệp CSV, GlassDoor_Job_Listings.csv, với các cột cho mỗi thuộc tính.

Tôn trọng các điều khoản dịch vụ của Glassdoor

Khi cào Glassdoor hoặc bất kỳ trang web nào khác, nó rất cần thiết để tuân theo các thực hành có trách nhiệm:

  • Giới hạn tỷ lệ tôn trọng: Tránh áp đảo máy chủ bằng cách thực hiện sự chậm trễ giữa các yêu cầu.
  • Sử dụng proxy xoay: giảm thiểu rủi ro bị cấm bởi các proxy và IPS xoay.
  • Tuân thủ Điều khoản dịch vụ: Thường xuyên xem xét các điều khoản dịch vụ của trang web và tránh các hành động vi phạm chúng.

Khi bạn biết cách cạo dữ liệu Glassdoor bằng cách sử dụng Python và nhà viết kịch, bạn sẽ dễ dàng nâng cao khả năng thu thập danh sách công việc của mình. Kỹ thuật này, khi kết hợp với việc sử dụng proxy và các tiêu đề phù hợp, có hiệu quả trong việc loại bỏ nguy cơ bị chặn bởi Glassdoor. Bạn cũng cần lưu ý về các chính sách cạo đạo đức để ngăn chặn sự cố các máy chủ của Glassdoor. Bằng cách tuân thủ các biện pháp này, giờ đây bạn có thể thu hoạch cũng như xử lý thông tin việc làm hữu ích từ Glassdoor để sử dụng hoặc của công ty bạn.

Bình luận:

0 Bình luận