使用 Python 搜刮 LinkedIn 数据指南

评论: 0

出于以下几个原因,收集 LinkedIn 数据具有极大的价值:

  • 就业市场分析:分析职位列表的趋势,如最紧缺的技能和行业;
  • 招聘:收集有关招聘信息的数据,为招聘战略提供依据;
  • 竞争对手研究:监测竞争对手的招聘模式和战略。

文章将强调重要的技术和策略,包括首先避免通过代理和标头进行检测的重要性。请求库将用于发出 HTTP 请求,而 lxml 将用于解析 HTML 内容。

设置环境

开始之前,请确保您的计算机上安装了 Python。

使用 pip 安装所需的库:


pip install requests
pip install lxml

开始使用刮板

下面是一个使用 Python 浏览 LinkedIn 招聘信息的综合代码示例:

导入图书馆

我们需要几个 Python 库:

  • requests: 用于发出 HTTP 请求以检索网页。
  • lxml: 用于解析 HTML 内容。
  • csv: 用于将提取的数据写入 CSV 文件。

import requests
from lxml import html
import csv
import random

定义求职 URL

首先定义要搜索的 LinkedIn 职位搜索 URL。


url = 'https link'

用户代理字符串和代理

要有效地抓取 LinkedIn,关键是要使用正确的标头,尤其是 User-Agent 标头,以模仿来自真实浏览器的请求。


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

现代代理服务器通常支持内部轮换,即自动为您轮换 IP 地址。这样就不需要从列表中手动选择代理了。不过,为了便于说明,以下是您在需要时如何处理代理轮换的方法1:


proxies = {
    'http': random.choice(proxies),
    'https': random.choice(proxies)
}

请求标题

成功的 LinkedIn 搜索取决于正确设置头信息,以模拟真实浏览器的行为。正确配置的标头不仅有助于规避反僵尸保护系统,还能降低你的搜索活动被阻止的几率。


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

初始化数据存储

要有效地收集和存储招聘信息,首先应该初始化数据存储。在 Python 中,这通常包括创建一个空列表。这个列表将作为一个存储容器,您可以将从 HTML 内容中提取的职位详细信息添加到其中。这种方法可确保系统地收集信息,并便于进一步处理或分析。

job_details = []

解析 HTML 内容

发送 HTTP GET 请求后,下一步是使用 lxml 库解析 HTML 内容。这样,我们就能浏览 HTML 结构,并确定要提取的数据。


# 使用 IP 授权方法设置随机用户代理和代理
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# 向 URL 发送 HTTP GET 请求
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

提取工作数据

解析 HTML 内容后,我们就可以使用 XPath 查询提取具体的职位详细信息,如职位名称、公司名称、工作地点和职位 URL。这些详细信息存储在字典中,并附加到列表中。


# 从 HTML 内容中提取工作详细信息
for job in parser.xpath('//ul[@class="jobs-search__results-list"]/li'):
    title = ''.join(job.xpath('.//div/a/span/text()')).strip()
    company = ''.join(job.xpath('.//div/div[2]/h4/a/text()')).strip()
    location = ''.join(job.xpath('.//div/div[2]/div/span/text()')).strip()
    job_url = job.xpath('.//div/a/@href')[0]
    
    job_detail = {
        'title': title,
        'company': company,
        'location': location,
        'job_url': job_url
    }
    job_details.append(job_detail)

将数据保存为 CSV

收集工作数据后,将其保存为 CSV 文件。


with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['title', 'company', 'location', 'job_url']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for job_detail in job_details:
        writer.writerow(job_detail)

完整代码

以下是完整的代码,综合了上述所有部分:


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.by import By
import csv

# 指定带有用户名和密码的代理服务器地址
proxy_address = ""
proxy_username = ""
proxy_password = ""

# 使用代理和身份验证设置 Chrome 浏览器选项
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# 使用 selenium-wire 创建 WebDriver 实例
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# 利用 selenium-wire 的增强功能执行 Selenium 自动化
driver.get(url)

job_details = []

all_elements = driver.find_elements(By.XPATH,
                                   '//*[@id="main-content"]/section/ul/li')

for i in all_elements:
   title = i.find_element(By.XPATH,
                          './/div/div/h3').text
   company = i.find_element(By.XPATH, './/div/div[2]/h4/a').text
   location = i.find_element(By.XPATH, './/div/div[2]/div/span').text
   job_url = i.find_element(By.XPATH,
                            './/div/a').get_attribute('href')

   job_detail = {
       'title': title,
       'company': company,
       'location': location,
       'job_url': job_url
   }
   job_details.append(job_detail)

with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
   fieldnames = ['title', 'company', 'location', 'job_url']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for job_detail in job_details:
       writer.writerow(job_detail)

driver.quit()

使用 Python 的 requests 和 lxml 库从 LinkedIn 中提取数据,为分析就业市场和招聘人员提供了一种强大的方法。为确保搜索过程的顺利进行,我们使用了高速的数据中心代理以及信任系数较高的 ISP 代理,从而降低了自动操作受阻的风险。

评论:

0 评论