Bỏ để qua phần nội dung

Glassdoor là một nguồn tài nguyên tuyệt vời cho người tìm việc, nhân viên và nhà tuyển dụng. Nó chứa rất nhiều thông tin về các công ty và công việc, bao gồm tiền lương, đánh giá, câu hỏi phỏng vấn, ảnh văn phòng, v.v. Tất cả dữ liệu này làm cho Glassdoor trở thành mục tiêu hấp dẫn cho việc quét web.

Trong hướng dẫn toàn diện này, chúng ta sẽ tìm hiểu các kỹ thuật và chiến lược khác nhau để thu thập các loại dữ liệu khác nhau từ Glassdoor.

Tổng quan về kiến ​​trúc của Glassdoor

Trước khi đi sâu vào chi tiết cụ thể, hãy hiểu cấu trúc trang web của Glassdoor:

  • Kết xuất phía máy khách – Glassdoor sử dụng React để hiển thị hầu hết giao diện người dùng của nó ở phía máy khách thay vì phía máy chủ. Điều này có nghĩa là HTML ban đầu được cung cấp cho trình duyệt là tối thiểu và hầu hết nội dung được tải và hiển thị bằng Javascript.

  • API GraphQL – Dữ liệu hiển thị trên các trang Glassdoor được tìm nạp thông qua API GraphQL. Trang web thực hiện các yêu cầu AJAX tới API này để lấy dữ liệu có cấu trúc, sau đó hiển thị trên trang.

  • Chống trầy xước nặng – Glassdoor sử dụng nhiều biện pháp chống cào khác nhau như phát hiện bot, giới hạn tốc độ và chặn những kẻ phá hoại.

Vì vậy, tóm lại, Glassdoor là một ứng dụng React một trang sử dụng GraphQL để truy xuất dữ liệu và có khả năng phòng thủ chống cào mạnh mẽ. Kiến trúc này đặt ra một số thách thức đặc biệt cho người dọn dẹp mà chúng tôi sẽ phải vượt qua.

Trang tổng quan về công ty Scraping

Mỗi công ty trên Glassdoor đều có một trang tổng quan chuyên dụng với các thông tin cơ bản như trụ sở chính, ngành, doanh thu, v.v. Hãy xem cách loại bỏ các chi tiết này.

Để có được trang tổng quan của công ty, chúng tôi cần ID Glassdoor của công ty đó được bao gồm trong URL trang:

https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.16,22.htm 

Đây EI_IE9079 biểu thị ID công ty của Google. Chúng tôi có thể trích xuất ID này từ bất kỳ URL công ty nào để tạo URL trang tổng quan.

Việc quét HTML thô của trang này sẽ không cung cấp cho chúng tôi dữ liệu có cấu trúc. Điều quan trọng là trích xuất dữ liệu GraphQL từ trang chứa tất cả thông tin ở định dạng JSON có cấu trúc.

Dưới đây là cách trích xuất dữ liệu GraphQL:

import json
import re 

html = # page HTML
match = re.search(r‘window.__ENV__ = (\{.*?\})‘, html)
if match:
    data = json.loads(match.group(1))  

Điều này cung cấp cho chúng tôi dữ liệu GraphQL hoàn chỉnh cho trang. Bây giờ chúng ta có thể phân tích các trường như description, headquarters, revenueVv:

overview = data[‘EmployerPage‘][‘Employer‘]

print(overview[‘description‘]) 
print(overview[‘headquarters‘])
print(overview[‘revenue‘])

Và thế là xong! Chỉ với một vài dòng mã Python, chúng ta có thể trích xuất dữ liệu có cấu trúc để cung cấp thông tin tổng quan về Glassdoor của bất kỳ công ty nào.

Quét danh sách công việc

Glassdoor cho phép duyệt danh sách việc làm đang mở được đăng bởi các công ty. Những danh sách này chứa tiêu đề, vị trí, mô tả và nhiều hơn nữa.

Để có được việc làm của một công ty, chúng tôi điều hướng đến:

https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm

Danh sách công việc được tải động thông qua lệnh gọi AJAX khi cuộn xuống hoặc thay đổi trang. Dữ liệu lại đến từ GraphQL và chúng ta cần phân tích nó ra.

Đầu tiên chúng tôi yêu cầu trang 1 để lấy tổng số công việc mà chúng tôi sử dụng để tính số trang. Sau đó, chúng tôi loại bỏ từng trang để trích xuất dữ liệu công việc:

import math
import json 

def get_jobs(companyId):
    url = f‘https://www.glassdoor.com/Jobs/-Jobs-E{companyId}.htm‘

    # request page 1 to get total job count
    page = requests.get(url) 
    total = extract_job_count(page.text) 
    pages = math.ceil(total / 20)

    jobs = []

    # scrape data from each page
    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))  
        jobs.extend(data[‘jobs‘])

    return jobs

Điều này cho phép chúng tôi thu thập một cách có hệ thống tất cả công việc cho bất kỳ công ty nào. Điều quan trọng là tính toán các trang dựa trên tổng số công việc và phân trang thông qua các cuộc gọi AJAX.

Cạo Đánh giá Công ty

Các bài đánh giá được cho là dữ liệu có giá trị nhất trên Glassdoor. Hãy thảo luận về cách loại bỏ tất cả các đánh giá cho một công ty.

Tương tự như việc làm, chúng ta điều hướng tới trang đánh giá công ty:

https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm

Chúng ta cần hiểu các bài đánh giá được phân trang như thế nào. Glassdoor hiển thị số lượng đánh giá cố định trên mỗi trang và chúng tôi cần loại bỏ tất cả các trang để có được dữ liệu đầy đủ.

Số lượng trang đánh giá có thể được tính toán trước bằng cách trích xuất một numberOfPages trường từ dữ liệu GraphQL. Sau đó, chúng tôi phân trang qua từng trang và thu thập đánh giá:

import math
import json

def get_reviews(companyId):
    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘ 

    # extract number of pages from initial request
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    pages = data[‘numberOfPages‘]

    reviews = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘) 
        data = json.loads(extract_graphql(page.text))

        # extract reviews
        reviews.extend(data[‘reviews‘]) 

    return reviews

Ở đây, chúng tôi đang trích xuất trước số lượng trang đánh giá và sau đó lặp lại từng trang để tạo bộ đánh giá đầy đủ.

Kỹ thuật này có thể loại bỏ tất cả các đánh giá về bất kỳ công ty nào trên Glassdoor!

Cạo lương

Ngoài việc đánh giá, dữ liệu về lương cũng rất hữu ích. Glassdoor có phần lương riêng cho từng công ty. Chúng ta hãy nhìn vào hồ sơ tiền lương.

Chúng tôi bắt đầu với URL trang lương:

https://www.glassdoor.com/Salary/Google-Salaries-E9079.htm 

Cách tiếp cận chung của chúng tôi một lần nữa sẽ liên quan đến:

  1. Tính số trang từ tổng số lương
  2. Lật trang qua từng trang cào hồ sơ lương

Đây là một triển khai:

import math
import json

def get_salaries(companyId):
    url = f‘https://www.glassdoor.com/Salary/-Salaries-E{companyId}.htm‘

    # extract page count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text)) 
    pages = data[‘numPages‘]

    salaries = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract salary records 
        salaries.extend(data[‘salaries‘])

    return salaries

Điều này cho phép chúng tôi thu thập một cách có hệ thống tất cả tiền lương của một công ty trên nhiều trang.

Cạo các câu hỏi phỏng vấn

Thông tin chi tiết về cuộc phỏng vấn là một nguồn dữ liệu tuyệt vời khác trên Glassdoor. Hãy xem cách loại bỏ tất cả các câu hỏi phỏng vấn được đăng cho một công ty.

Trang phỏng vấn của công ty có tại:

https://www.glassdoor.com/Interview/Google-Interview-Questions-E9079.htm

Các câu hỏi phỏng vấn được tải động thông qua các yêu cầu AJAX khi cuộn xuống hoặc thay đổi trang.

Kế hoạch trò chơi của chúng tôi rất quen thuộc:

  1. Tính số trang từ tổng số câu hỏi
  2. Trích xuất câu hỏi từ mỗi trang

Đây là một triển khai:

import math
import json

def get_questions(companyId):
    url = f‘https://www.glassdoor.com/Interview/-Interview-Questions-E{companyId}.htm‘

    # get total question count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘interviewQuestionCount‘]
    pages = math.ceil(total / 20)

    questions = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract questions
        questions.extend(data[‘interviewQuestions‘])

    return questions

Vì vậy, tóm lại, chúng tôi tính toán tổng số trang dựa trên số lượng câu hỏi, phân trang thông qua các cuộc gọi AJAX và trích xuất câu hỏi – cho phép chúng tôi có được tất cả thông tin chi tiết về cuộc phỏng vấn cho một công ty.

Cạo ảnh văn phòng

Để hoàn tất quá trình trích xuất dữ liệu Glassdoor của chúng ta, chúng ta cũng hãy cạo các bức ảnh văn phòng công ty để cung cấp thông tin chi tiết trực quan rõ ràng.

Trang ảnh của một công ty có thể được truy cập tại:

https://www.glassdoor.com/Photos/Google-Office-Photos-E9079.htm

Chiến lược phân trang tiêu chuẩn của chúng tôi được áp dụng – tính toán các trang từ tổng số ảnh, phân trang thông qua lệnh gọi AJAX, trích xuất ảnh:

import math 
import json

def get_photos(companyId):
    url = f‘https://www.glassdoor.com/Photos/-Office-Photos-E{companyId}.htm‘

    # get total photo count 
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘officePhotoCount‘]
    pages = math.ceil(total / 20)

    photos = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract photos
        photos.extend(data[‘officePhotos‘])

    return photos

Và với điều này, chúng ta có thể cạo tất cả các bức ảnh văn phòng có sẵn của một công ty!

Xử lý chống trầy xước

Mặc dù các kỹ thuật được thảo luận cho phép trích xuất nhiều điểm dữ liệu khác nhau từ Glassdoor, nhưng các trình thu thập dữ liệu ở quy mô lớn thường bị chặn.

Glassdoor có một loạt cơ chế chống cào để ngăn chặn việc trích xuất dữ liệu toàn diện, bao gồm:

  • Chặn IP
  • Vân tay trình duyệt
  • Hệ thống phát hiện bot
  • Rate Limiting

Dưới đây là một số mẹo để tránh bị chặn khi cạo Glassdoor:

  • Sử dụng proxy: Xoay các proxy dân cư khác nhau cho mỗi yêu cầu để công cụ quét của bạn xuất hiện với tư cách là những người dùng khác nhau.

  • Tỷ lệ giới hạn: Đảm bảo bạn có độ trễ giữa các yêu cầu và thu thập dữ liệu ở mức vừa phải.

  • Trình duyệt bắt chước: Đặt Tác nhân người dùng hợp lệ, tiêu đề Chấp nhận và bật Javascript để xuất hiện giống như một trình duyệt thực.

  • Khối giám sát: Kiểm tra xem IP hoặc proxy của bạn có bị chặn hay không và chuyển đổi trung tâm dữ liệu hoặc nhà cung cấp tương ứng.

  • Sử dụng dịch vụ Scraping: Tận dụng các API thu thập dữ liệu như ScraperAPI và Octoparse có hỗ trợ sẵn có để vượt qua các cơ chế chống thu thập dữ liệu.

Với các biện pháp phòng ngừa phù hợp, bạn có thể trích xuất dữ liệu từ Glassdoor trên quy mô lớn mà không bị chặn.

Cạo Glassdoor bằng ScraperAPI

ScraperAPI là API thu thập dữ liệu trả phí xử lý tất cả các thách thức chống thu thập dữ liệu và cho phép trích xuất dữ liệu trên quy mô lớn.

Nó hỗ trợ thu thập thông tin ajax, proxy và tích hợp trực tiếp với các thư viện phổ biến như Yêu cầu Python.

Đây là cách chúng tôi thu thập các đánh giá của công ty bằng ScraperAPI:

import requests
import math
import json

API_KEY = ‘XXX‘ # assign key

def get_reviews(companyId):

    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘

    # initial request to get page count
    response = requests.get(url, 
        headers={‘apikey‘: API_KEY})

    pages = extract_page_count(response.text)

    reviews = []

    for page in range(1, pages+1):
        response = requests.get(f‘{url}?p={page}‘,
            headers={‘apikey‘: API_KEY})

        data = json.loads(response.text)    
        reviews.extend(data[‘reviews‘])

    return reviews 

Ở đây ScraperAPI xử lý proxy, trình duyệt và các khía cạnh khác cho phép chúng tôi tập trung vào việc trích xuất dữ liệu.

Đây là một cách dễ dàng để xây dựng các dụng cụ cạo Glassdoor có thể mở rộng mà không cần phải lo lắng về hệ thống chống trầy xước.

Khi chế tạo dụng cụ nạo Glassdoor, điều quan trọng là phải đảm bảo công việc của bạn tuân thủ pháp luật. Dưới đây là một số khía cạnh chính cần xem xét:

  • Các Điều Khoản của Dịch Vụ – Nghiên cứu Điều khoản dịch vụ của Glassdoor để hiểu các khoản cho phép và hạn chế trong việc sử dụng dữ liệu của nó. Nói chung, việc thu thập khối lượng hợp lý theo định kỳ cho mục đích phi thương mại là được phép.

  • Dữ liệu cá nhân – Tránh lấy bất kỳ dữ liệu người dùng cá nhân nào từ Glassdoor như tên, ID email, v.v. điều này sẽ gây ra các vấn đề về quyền riêng tư.

  • Bản quyền – Đánh giá của Glassdoor và dữ liệu khác do người dùng gửi được bảo vệ bản quyền. Không sao chép hàng loạt nội dung nguyên văn từ trang web.

  • Giới hạn tỷ lệ – Tôn trọng mọi giới hạn tốc độ do Glassdoor thực thi và không làm quá tải máy chủ của họ với số lượng yêu cầu quá mức.

  • Trường hợp sử dụng – Không sử dụng dữ liệu của Glassdoor cho các mục đích phi đạo đức như quấy rối, phân biệt đối xử với nhân viên, v.v.

Việc tuân thủ các nguyên tắc này sẽ giúp đảm bảo dụng cụ cạo của bạn luôn tuân thủ luật pháp.

Kết luận

Trong hướng dẫn này, chúng tôi đã khám phá các chiến lược và kỹ thuật khác nhau để lấy dữ liệu của công ty từ Glassdoor bằng Python, bao gồm:

  • Trích xuất thông tin tổng quan, danh sách công việc, mức lương, bài đánh giá, câu hỏi phỏng vấn và ảnh bằng cách phân tích dữ liệu API GraphQL
  • Tính toán các trang phân trang từ tổng số trang và quét tất cả các trang một cách có hệ thống
  • Xử lý các hệ thống chống cào của Glassdoor bằng proxy và dịch vụ như ScraperAPI
  • Đảm bảo tuân thủ pháp luật bằng cách tôn trọng ToS, quyền riêng tư, bản quyền và giới hạn tỷ lệ

Các phương pháp được thảo luận có thể được điều chỉnh để xây dựng các công cụ thu thập dữ liệu Glassdoor mạnh mẽ nhằm thu thập dữ liệu hữu ích trên quy mô lớn một cách mạnh mẽ và có đạo đức.

Chúc mừng cạo!

tags:

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *