Đối với các thợ săn việc làm, người sử dụng lao động hoặc bất kỳ cá nhân nào theo dõi xu hướng trong thị trường việc làm, việc thực hiện danh sách các công việc có sẵn của thực sự có thể cung cấp thông tin hữu ích. Trong hướng dẫn cụ thể này, chúng tôi sẽ kết hợp nhà viết kịch cho việc cạo web và LXML cho phân tích cú pháp nội dung HTML để thu thập các chi tiết của công việc bao gồm tiêu đề, tên của công ty tuyển dụng, địa điểm, mô tả công việc, liên kết đăng công việc và cuối cùng trình bày Các phát hiện bằng cách lưu thông tin trong tệp CSV.
Để thực hiện thành công việc cạo, các thư viện Python sau đây cần được cài đặt.
Nhà viết kịch cho tự động hóa trình duyệt:
pip install playwright
LXML cho phân tích cú pháp HTML:
pip install lxml
Gấu trúc để lưu dữ liệu vào tệp CSV:
pip install pandas
Cài đặt trình duyệt nhà viết kịch:
Sau khi cài đặt nhà viết kịch, hãy chạy lệnh này để cài đặt các nhị phân trình duyệt cần thiết:
playwright install
Nhà viết kịch cho phép bạn tự động hóa và tương tác với các trình duyệt web. Chúng tôi bắt đầu bằng cách thiết lập nhà viết kịch để khởi chạy trình duyệt Chromium, truy cập một trang web và trích xuất nội dung của nó. Ở đây chúng tôi cũng có thể vượt qua các proxy thông qua nhà viết kịch.
Tại sao sử dụng proxy?
Các trang web thường có các biện pháp giới hạn tỷ lệ hoặc chống xẹp tại chỗ để chặn các yêu cầu lặp lại từ cùng một địa chỉ IP. Proxy cho phép bạn:
import asyncio
from playwright.async_api import async_playwright
async def get_page_content(url):
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
proxy = {
'server': '',
'username': '',
'password': ''
}
) # Trình duyệt đứng đầu
page = await browser.new_page()
await page.goto(url)
# Trích xuất nội dung của trang
content = await page.content()
await browser.close() # Đóng trình duyệt một khi đã hoàn thành
return content
Trong mã này, Async_playwright khởi chạy trình duyệt Headed, điều hướng đến URL được chỉ định và tìm nạp nội dung của trang.
Tiếp theo, chúng tôi sẽ phân tích nội dung trang để trích xuất dữ liệu có ý nghĩa. LXML được sử dụng cho mục đích này vì nó cung cấp hỗ trợ mạnh mẽ cho phân tích cú pháp và truy vấn nội dung HTML bằng XPath.
from lxml import html
def parse_job_listings(content):
# Nội dung Parse HTML
parser = html.fromstring(content)
# Trích xuất từng bài đăng công việc bằng cách sử dụng XPath
job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
jobs_data = []
for element in job_posting[:-1]: # Bỏ qua yếu tố cuối cùng nếu đó là một quảng cáo hoặc không liên quan
title = ''.join(element.xpath('.//h2/a/span/@title'))
if title:
link = ''.join(element.xpath('.//h2/a/@href'))
location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))
# Nối dữ liệu được trích xuất vào danh sách Jobs_Data
jobs_data.append({
'Title': title,
'Link': f"https://www.indeed.com{link}",
'Location': location,
'Description': description,
'Company': company_name
})
return jobs_data
Bây giờ chúng tôi đã thiết lập cả hai bước tự động hóa và phân tích trình duyệt, hãy để kết hợp chúng để loại bỏ danh sách công việc từ trang thực sự.
Giải thích :
import pandas as pd
async def scrape_indeed_jobs(url):
# Bước 1: Nhận nội dung trang bằng nhà viết kịch
content = await get_page_content(url)
# Bước 2: Phân tích HTML và trích xuất chi tiết công việc
jobs_data = parse_job_listings(content)
return jobs_data
# URL để cạo
url = 'https://www.indeed.com/q-usa-jobs.html'
# Cạo và lưu dữ liệu
async def main():
# Cạo dữ liệu công việc từ URL được chỉ định
jobs = await scrape_indeed_jobs(url)
# Bước 3: Lưu dữ liệu vào CSV bằng Pandas
df = pd.DataFrame(jobs)
df.to_csv('indeed_jobs.csv', index=False)
print("Data saved to indeed_jobs.csv")
# Chạy chức năng chính
asyncio.run(main())
Thật vậy, phân chia danh sách công việc của nó và bạn có thể dễ dàng mở rộng cào để xử lý nhiều trang. URL trang được điều chỉnh bằng cách sử dụng tham số truy vấn bắt đầu, tăng 10 cho mỗi trang mới.
Để nâng cao chức năng của máy cạo để thu thập dữ liệu từ nhiều trang, bạn có thể thực hiện một chức năng gọi là Scrape_Multiple_Pages. Hàm này sẽ sửa đổi URL cơ sở bằng cách điều chỉnh tăng dần tham số Start, cho phép truy cập vào các trang tiếp theo. Bằng cách tiến triển một cách có hệ thống qua từng trang, bạn có thể mở rộng phạm vi và số lượng dữ liệu được thu thập, chẳng hạn như chỗ trống, đảm bảo một bộ dữ liệu toàn diện hơn.
async def scrape_multiple_pages(base_url, pages=3):
all_jobs = []
for page_num in range(pages):
# Cập nhật URL để phân trang
url = f"{base_url}&start={page_num * 10}"
print(f"Scraping page: {url}")
# Cạo dữ liệu công việc từ mỗi trang
jobs = await scrape_indeed_jobs(url)
all_jobs.extend(jobs)
# Lưu tất cả các công việc vào CSV
df = pd.DataFrame(all_jobs)
df.to_csv('indeed_jobs_all_pages.csv', index=False)
print("Data saved to indeed_jobs_all_pages.csv")
# Cạo nhiều trang danh sách công việc
asyncio.run(scrape_multiple_pages('https://www.indeed.com/jobs?q=usa', pages=3))
Để nhắm mục tiêu các tiêu đề công việc cụ thể hoặc từ khóa trong các nỗ lực cạo của bạn, bạn sẽ cần cấu hình tham số tìm kiếm truy vấn trong URL được sử dụng bởi thực sự. Tùy chỉnh này cho phép người cạo thu thập dữ liệu cụ thể cho các công việc hoặc lĩnh vực cụ thể. Chẳng hạn, nếu bạn đang tìm kiếm các vị trí của nhà phát triển Python trên http://www.indeed.com, bạn sẽ điều chỉnh tham số truy vấn để bao gồm các nhà phát triển của Py Python+hoặc các từ khóa có liên quan.
query = "python+developer"
base_url = f"https://www.indeed.com/jobs?q={query}"
asyncio.run(scrape_multiple_pages(base_url, pages=3))
Bằng cách sửa đổi tham số này theo nhu cầu thu thập dữ liệu của bạn, bạn có thể tập trung vào việc cạo vào các công việc cụ thể, nâng cao tính linh hoạt và hiệu quả của quy trình thu thập dữ liệu của bạn. Cách tiếp cận này đặc biệt hữu ích để thích ứng với nhu cầu năng động của thị trường việc làm.
import asyncio
from playwright.async_api import async_playwright
from lxml import html
import pandas as pd
# Bước 1: Nội dung trang tìm nạp bằng nhà viết kịch
async def get_page_content(url):
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False
proxy = {
'server': '',
'username': '',
'password': ''
}
) # Chạy trình duyệt ở chế độ Headed
page = await browser.new_page()
await page.goto(url, wait_until='networkidle')
# Trích xuất nội dung trang
content = await page.content()
await browser.close() # Đóng trình duyệt sau khi sử dụng
return content
# Bước 2: Phân tích nội dung HTML bằng LXML
def parse_job_listings(content):
# Phân tích HTML bằng LXML
parser = html.fromstring(content)
# Chọn các bài đăng công việc cá nhân bằng cách sử dụng XPath
job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
# Trích xuất dữ liệu công việc
jobs_data = []
for element in job_posting[:-1]:
title = ''.join(element.xpath('.//h2/a/span/@title'))
if title:
link = ''.join(element.xpath('.//h2/a/@href'))
location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))
# Nối dữ liệu được trích xuất vào danh sách Jobs_Data
jobs_data.append({
'Title': title,
'Link': f"https://www.indeed.com{link}",
'Location': location,
'Description': description,
'Company': company_name
})
return jobs_data
# Bước 3: Cạo thực sự công việc cho một trang
async def scrape_indeed_jobs(url):
# Nhận nội dung trang bằng nhà viết kịch
content = await get_page_content(url)
# Parse HTML và trích xuất dữ liệu công việc
jobs_data = parse_job_listings(content)
return jobs_data
# Bước 4: Xử lý phân trang và cạo nhiều trang
async def scrape_multiple_pages(base_url, query, pages=3):
all_jobs = []
for page_num in range(pages):
# Cập nhật URL để xử lý phân trang và thêm truy vấn tìm kiếm
url = f"{base_url}?q={query}&start={page_num * 10}"
print(f"Scraping page: {url}")
# Công việc cạo cho trang hiện tại
jobs = await scrape_indeed_jobs(url)
all_jobs.extend(jobs)
# Lưu tất cả các công việc vào tệp CSV
df = pd.DataFrame(all_jobs)
df.to_csv(f'indeed_jobs_{query}.csv', index=False)
print(f"Data saved to indeed_jobs_{query}.csv")
# Chức năng chạy cạp với đầu vào truy vấn động
async def run_scraper():
# Bước 5: Yêu cầu người dùng truy vấn đầu vào và số lượng trang để cạo
query = input("Enter the job title or keywords to search (e.g., python+developer): ")
pages = int(input("Enter the number of pages to scrape: "))
# Các công việc cào trên nhiều trang dựa trên truy vấn
base_url = 'https://www.indeed.com/jobs'
await scrape_multiple_pages(base_url, query, pages)
# Chạy cái cạp
asyncio.run(run_scraper())
Để đảm bảo một quy trình cạo trơn tru và giảm nguy cơ xuất hiện các khối và captcha, điều quan trọng là phải chọn máy chủ proxy phù hợp. Tùy chọn tối ưu nhất để cạo là các proxy ISP, cung cấp sự ổn định tốc độ và kết nối cao, cũng như một yếu tố tin cậy cao, khiến chúng hiếm khi bị chặn bởi các nền tảng. Loại proxy này là tĩnh, vì vậy đối với việc cạo quy mô lớn, cần phải tạo ra một nhóm proxy ISP và cấu hình xoay IP để thay đổi thường xuyên. Một lựa chọn thay thế sẽ là các proxy dân cư, năng động và có phạm vi địa lý rộng nhất so với các loại máy chủ proxy khác.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0