Web Scraping cho bài đăng việc làm – Hướng dẫn tối ưu năm 2025

Python , Thu thập dữ liệu ,05-01-20235 phút đọc

Web Scraping cho các bài đăng việc làm là một lối tắt thay thế cho người tìm việc để tạo cơ sở dữ liệu về các việc làm hiện tại. Randstad cho biết rằng tìm kiếm việc làm trung bình có thể kéo dài năm đến sáu tháng, từ khi nộp đơn cho đến khi tuyển được người. Sẽ thế nào nếu bạn có một giải pháp có thể giảm bớt gánh nặng của bạn

Web Scraping cho các bài đăng việc làm là một lối tắt thay thế cho người tìm việc để tạo cơ sở dữ liệu về các việc làm hiện tại. Randstad cho biết rằng tìm kiếm việc làm trung bình có thể kéo dài năm đến sáu tháng , từ khi nộp đơn xin việc cho đến khi tuyển được người. Sẽ thế nào nếu bạn có một giải pháp có thể giảm bớt gánh nặng khi lướt qua tất cả các cổng thông tin việc làm và chọn đúng việc phù hợp với mình? 

Bài viết này sẽ đưa bạn vào một chuyến đi giải thích cách thực hiện thu thập dữ liệu web cho các bài đăng việc làm. Vì vậy, bạn đang ở trong thị trường việc làm và cố gắng tìm ra công việc tốt nhất. Nhưng bạn muốn chơi thông minh hơn chứ không phải khó khăn hơn. Tại sao không xây dựng một trình thu thập dữ liệu web để thu thập và phân tích các bài đăng việc làm cho bạn. Sau khi bạn thiết lập, nó sẽ cung cấp cho bạn dữ liệu phong phú ở định dạng gọn gàng đẹp mắt, vì vậy bạn không phải kiểm tra thủ công nhiều lần. Hãy bắt đầu nào.

Web Scraping dùng để đăng tin tuyển dụng là gì?

Web scraping for job postings là giải pháp tự động thu thập dữ liệu từ nhiều cổng thông tin việc làm và giảm thời gian bạn phải lấy dữ liệu từ mỗi trang web. Có một công cụ như vậy có thể cung cấp cho bạn cơ sở dữ liệu đầy đủ về các việc làm sẽ đơn giản hóa nhiệm vụ của bạn theo nhiều cách. Tất cả những gì bạn phải làm là lọc những việc phù hợp với mình và tiến hành quy trình ứng tuyển. 

Vậy là bạn đang ở trong thị trường việc làm và đang cố gắng tìm ra công việc tốt nhất. Nhưng bạn muốn chơi thông minh hơn chứ không phải khó khăn hơn. Tại sao không xây dựng một trình thu thập dữ liệu web để thu thập và phân tích các bài đăng việc làm cho bạn? Sau khi bạn thiết lập, nó sẽ cung cấp cho bạn dữ liệu phong phú ở định dạng gọn gàng đẹp mắt, vì vậy bạn không phải kiểm tra thủ công nhiều lần. Hãy bắt đầu thôi.

[Tuyên bố miễn trừ trách nhiệm! Nhiều trang web có thể hạn chế việc xóa dữ liệu khỏi các trang của họ. Người dùng có thể phải chịu các vấn đề pháp lý tùy thuộc vào nơi và cách họ cố gắng trích xuất thông tin. Vì vậy, người ta cần phải cực kỳ cẩn thận nếu xem các trang web lưu trữ dữ liệu của họ. Ví dụ, Facebook, Linked In và Craiglist đôi khi quan tâm đến việc dữ liệu bị xóa khỏi các trang của họ. Vì vậy, nếu bạn muốn xóa, hãy tự chịu rủi ro].

Đây sẽ là một bài viết rất cơ bản trong đó chúng ta sẽ thấy những điều cơ bản của web scraping bằng cách trích xuất một số thông tin hữu ích liên quan đến các công việc liên quan đến "Khoa học dữ liệu" từ indeed.com. Chúng ta sẽ viết một chương trình tuyệt vời để cập nhật các công việc nhiều lần theo cách thủ công. Một số thư viện hữu ích sẽ rất tiện dụng khi xây dựng trình scraper này là "requests" và "BeautifulSoup".

Hiểu về URL và Cấu trúc Trang

Đầu tiên, chúng ta hãy xem trang mẫu mà chúng ta sẽ trích xuất từ indeed

Cách cấu trúc URL rất quan trọng:

  • lưu ý “q=" bắt đầu chuỗi cho trường “what” trên trang, phân tách các thuật ngữ tìm kiếm bằng “+” (tức là tìm kiếm công việc “data+scientist”)
  • khi chỉ định mức lương, nó sẽ phân tích cú pháp bằng dấu phẩy trong số liệu mức lương, do đó, phần đầu của mức lương sẽ được bắt đầu bằng %24 và sau đó là số trước dấu phẩy đầu tiên, sau đó sẽ bị ngắt bởi %2C và tiếp tục với phần còn lại của số (ví dụ: %2420%2C000 = $20.000)
  • lưu ý “&l=" bắt đầu chuỗi thành phố quan tâm, phân tách các thuật ngữ tìm kiếm bằng dấu "+" nếu thành phố có nhiều hơn một từ (ví dụ: "New+York.")
  • lưu ý “&start=" lưu ý kết quả tìm kiếm nơi bạn muốn bắt đầu (tức là bắt đầu bằng cách xem kết quả thứ 10)

Cấu trúc URL này sẽ giúp ích rất nhiều khi chúng ta tiếp tục xây dựng trình thu thập dữ liệu và dữ liệu từ nhiều trang. 

Chrome có thể kiểm tra cấu trúc HTML của trang bằng cách nhấp chuột phải vào trang và sử dụng tùy chọn kiểm tra phần tử. Một menu sẽ xuất hiện ở bên phải và nó cũng sẽ hiển thị các thẻ phần tử lồng nhau và khi bạn đặt con trỏ vào các phần tử đó, nó sẽ làm nổi bật phần đó của màn hình.  

Đối với bài viết này, tôi cho rằng bạn biết những điều cơ bản về HTML như thẻ, div, v.v., nhưng may mắn là bạn không cần phải biết mọi thứ. Bạn chỉ cần hiểu cấu trúc trang và phân cấp các thành phần khác nhau.

Bắt đầu với Scraper

Bây giờ chúng ta đã phân tích cấu trúc trang. Điều này sẽ giúp chúng ta xây dựng mã theo thông tin đó để trích xuất dữ liệu theo lựa chọn của chúng ta. Trước tiên, hãy bắt đầu bằng cách nhập thư viện của chúng ta. Lưu ý rằng ở đây chúng ta cũng đang nhập "thời gian", điều này sẽ hữu ích để không làm quá tải máy chủ của trang web khi thu thập thông tin.

yêu cầu nhập khẩu nhập khẩu bs4 từ bs4 nhập khẩu BeautifulSoup nhập khẩu pandas như pd nhập khẩu thời gian

Đầu tiên chúng ta sẽ nhắm vào một trang duy nhất để rút ra từng thông tin mà chúng ta muốn,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10" #thực hiện yêu cầu của URL đã nêu ở trên: page = requests. get (URL) #chỉ định định dạng mong muốn của "page" bằng trình phân tích cú pháp html - điều này cho phép python đọc các thành phần khác nhau của trang, thay vì coi nó như một chuỗi dài. soup = BeautifulSoup(page.text, "html.parser" ) #in soup theo định dạng cây có cấu trúc hơn giúp dễ đọc hơn print (soup.prettify())

Sử dụng prettify giúp bạn dễ dàng có được cái nhìn tổng quan về mã hóa HTML của trang và cung cấp đầu ra như thế này,

 Bây giờ, tất cả thông tin trên trang chúng ta quan tâm đều nằm trong biến “soup”. Chúng ta phải đào sâu hơn vào mã để lặp qua nhiều thẻ và thẻ phụ khác nhau để nắm bắt thông tin cần thiết.

Nhận các yếu tố cơ bản của dữ liệu

Năm điểm chính cho mỗi bài đăng tuyển dụng là,

Chức danh công việc. Tên công ty. Địa điểm. Mức lương. Tóm tắt công việc.

Nếu chúng ta xem trang, có 15 bài đăng việc làm. Do đó, mã của chúng ta cũng phải tạo ra 15 mục khác nhau. Tuy nhiên, nếu mã cung cấp ít hơn số này, chúng ta có thể tham khảo lại trang và xem những gì không được ghi lại.

Nhận chức danh công việc

As can be seen, the entirety of each job posting is under <div> tags, with an attribute “class” = “row result.”

Further, we could also see that job titles are under <a> tags, with the attribute “title = (title)”. One can see the value of the tag’s attribute with tag[“attribute”], so I can use it to find each posting’s job title.

Nếu chúng ta tóm tắt lại, chức năng mà chúng ta sẽ thấy bao gồm ba bước sau:

Pulling out all the <div> tags with class including “row”.Identifying <a> tags with attribute “data-tn-element”:”jobTitle”For each of these <a> tags, find attribute values “title”

def extract_job_title_from_result(soup): 
  jobs = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
      jobs.append(a["title"])
  return(jobs)
extract_job_title_from_result(soup)

Mã này sẽ tạo ra kết quả như thế này,

Lấy tên công ty

Getting company names can be a bit tricky because most of them are appearing in <span> tags, with “class”:” company”.  They are also housed in <span> tags with “class”:” result-link-source”.

Chúng ta sẽ sử dụng câu lệnh if/else để trích xuất thông tin công ty từ mỗi nơi này. Để xóa khoảng trắng xung quanh tên công ty khi chúng được xuất ra, chúng ta sẽ sử dụng inputting.strip() ở cuối.

def extract_company_from_result(soup): 
 companies = []
 for div in soup.find_all(name="div", attrs={"class":"row"}):
   company = div.find_all(name="span", attrs={"class":"company"})
   if len(company) &gt; 0:
    for b in company:
     companies.append(b.text.strip())
   else:
    sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
    for span in sec_try:
      companies.append(span.text.strip())
 return(companies)
 
extract_company_from_result(soup)

Nhận Vị trí

Locations are located under the <span> tags. Span tags are sometimes nested within each other, such that the location text may sometimes be within “class”:”location” attributes, or nested in “itemprop”:”addressLocality”. However a simple for loop can examine all span tags for text and retrieve the necessary information.

def extract_location_from_result(soup): 
  locations = []
  spans = soup.findAll('span', attrs={'class': 'location'})
  for span in spans:
    locations.append(span.text)
  return(locations)
extract_location_from_result(soup)

Nhận lương

Lương là phần khó nhất để trích xuất từ các bài đăng việc làm. Hầu hết các bài đăng không công bố thông tin lương, trong khi một số khác có công bố, có thể có nhiều nơi để chọn thông tin đó. Vì vậy, chúng ta phải viết một mã có thể lấy nhiều mức lương từ nhiều nơi và nếu không tìm thấy mức lương nào, chúng ta cần tạo giá trị "Không tìm thấy" cho bất kỳ công việc nào không chứa mức lương. 

Some salaries are under <nobr> tags, while others are under <div> tags, “class”:”sjcl” and are under separate div tags with no attributes. Try/except statement can be helpful while extracting this information. 

def extract_salary_from_result(soup): 
  salaries = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    try:
      salaries.append(div.find('nobr').text)
    except:
      try:
        div_two = div.find(name="div", attrs={"class":"sjcl"})
        div_three = div_two.find("div")
        salaries.append(div_three.text.strip())
      except:
        salaries.append("Nothing_found")
  return(salaries)
extract_salary_from_result(soup)

Nhận tóm tắt công việc

Công việc cuối cùng là lấy tóm tắt công việc. Tuy nhiên, không thể lấy tóm tắt công việc cho từng vị trí cụ thể vì chúng không được bao gồm trong HTML từ một trang Indeed nhất định. Chúng ta có thể lấy một số thông tin về từng công việc từ những gì được cung cấp. Chúng ta có thể sử dụng Selenium cho mục đích này.

But let’s first try this using python. Summaries are located under <span> tags. Span tags are nested within each other such that the location text is within “class”:” location” tags or nested in “itemprop”:” adressLocality”. However, using a simple for loop can examine all span tags for text to retrieve the necessary information.

Những câu hỏi thường gặp

Câu hỏi thường gặp:

1. Tại sao cần phải thu thập thông tin chi tiết về công việc?
Có đủ các cổng thông tin việc làm có thể thông báo cho bạn về các công việc phù hợp với hồ sơ của bạn. Tuy nhiên, việc có một giải pháp thu thập việc làm sẽ giúp bạn có được danh sách đầy đủ các công việc và mô tả như một cơ sở dữ liệu tiện dụng. Điều này sẽ cho phép bạn có cái nhìn tốt hơn về tất cả các cơ hội việc làm ở một nơi.
2. Proxy có thể giúp thu thập thông tin chi tiết về công việc như thế nào?
Web scraping thường sẽ có một số thách thức nhất định như chặn IP, chặn theo địa lý và tốc độ hạn chế. Scraping jobs from job portals cũng sẽ có những thách thức như vậy. Để vượt qua tất cả những vấn đề này, địa chỉ proxy có thể giúp bạn với địa chỉ IP của vị trí cần thiết và đảm bảo tính ẩn danh
3. Thư viện Python nào là cần thiết để thu thập thông tin chi tiết về công việc?
Requests, BeautifulSoup và Pandas là những thư viện python khá phổ biến để thu thập dữ liệu liên quan đến công việc từ các trang web. Thư viện Request là thư viện python phổ biến nhất được sử dụng để gửi yêu cầu web, trong khi BeautifulSoup chịu trách nhiệm phân tích dữ liệu và thư viện Pandas sẽ hỗ trợ các hoạt động cấu trúc dữ liệu.

Bài viết liên quan

Cách thu thập dữ liệu Twitter bằng Python

Cách thu thập dữ liệu Instagram bằng Python

Cách cạo Reddit bằng Python

Kết thúc

Trong bài viết này, chúng ta đã thấy web scraping là gì và nó có thể hữu ích như thế nào trong cuộc sống hàng ngày của chúng ta bằng cách lấy một ví dụ thực tế về việc thu thập dữ liệu công việc từ các trang web của Indeed. Xin lưu ý rằng kết quả bạn nhận được có thể khác với những kết quả này vì các trang là động, do đó thông tin liên tục thay đổi theo thời gian. 

Web Scraping là một kỹ thuật đáng kinh ngạc nếu được thực hiện đúng cách và theo yêu cầu của bạn. Chúng ta đã thấy thêm năm khía cạnh quan trọng của mỗi bài đăng việc làm và cách trích xuất chúng. Khi bạn tự mình thử mã này, bạn sẽ có dữ liệu đã được trích xuất của các bài đăng việc làm và bạn không cần phải tìm kiếm việc làm theo cách thủ công, điều này thật tuyệt vời. Kỹ thuật tương tự cũng có thể được áp dụng cho các trang web khác, nhưng cấu trúc của chúng có thể khác nhau. Do đó, người ta cần tối ưu hóa mã của mình theo đó. Nhưng tất cả những điều cơ bản đều được đề cập trong bài viết này, vì vậy sẽ không có bất kỳ khó khăn nào khi trích xuất các trang khác.

Nếu bạn đang tìm kiếm dịch vụ proxy, đừng quên xem qua ProxyScrape cho dịch vụ proxy dân dụngcao cấp .