Guia para a recolha de dados do LinkedIn com Python

Comentários: 0

A raspagem de dados do LinkedIn pode ser incrivelmente valiosa por vários motivos:

  • Análise do mercado de trabalho: analisar tendências nas listagens de empregos, como as habilidades e setores mais procurados;
  • Recrutamento: reunir dados sobre anúncios de emprego para informar estratégias de contratação;
  • Pesquisa da concorrência: monitorizar os padrões de contratação e as estratégias dos concorrentes.

O artigo enfatizará técnicas e estratégias importantes, incluindo a importância de evitar a deteção via proxies e cabeçalhos em primeiro lugar. A biblioteca requests será usada para fazer solicitações HTTP, enquanto a lxml será empregada para analisar o conteúdo HTML.

Configurando o ambiente

Antes de começar, certifique-se de que tem o Python instalado na sua máquina.

Instale as bibliotecas necessárias usando pip:


pip install requests
pip install lxml

Começar a utilizar o raspador

Aqui está um exemplo de código abrangente para raspar as listagens de empregos do LinkedIn usando Python:

Importar bibliotecas

Vamos precisar de várias bibliotecas Python:

  • requests: Para fazer solicitações HTTP para recuperar páginas da web.
  • lxml: Para analisar o conteúdo HTML.
  • csv: Para escrever os dados extraídos em um arquivo CSV.

import requests
from lxml import html
import csv
import random

Definir URL de procura de emprego

Comece por definir o URL de pesquisa de emprego do LinkedIn que pretende extrair.


url = 'https link'

Cadeias de agentes de utilizador e proxies

Para extrair o LinkedIn de forma eficaz, é crucial usar os cabeçalhos corretos, especialmente o cabeçalho User-Agent, para imitar solicitações de um navegador real.


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'
]

Os fornecedores de proxy modernos suportam frequentemente a rotação interna, o que significa que rodam automaticamente os endereços IP por si. Isto elimina a necessidade de selecionar manualmente proxies a partir de uma lista. No entanto, para fins ilustrativos, eis como1 poderia lidar com a rotação de proxy, se necessário:


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

Cabeçalhos para pedidos

O scraping bem-sucedido do LinkedIn depende da configuração correta dos cabeçalhos que emulam o comportamento de um navegador real. Cabeçalhos configurados corretamente não só ajudam a contornar os sistemas de proteção anti-bot, mas também diminuem as chances de suas atividades de raspagem serem bloqueadas.


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',
}

Inicializar o armazenamento de dados

Para recolher e armazenar eficazmente informações de anúncios de emprego, deve começar por inicializar um armazenamento de dados. Em Python, isso normalmente envolve a criação de uma lista vazia. Esta lista servirá como um contentor de armazenamento onde pode adicionar detalhes da oferta de emprego à medida que são extraídos do conteúdo HTML. Esse método garante que as informações sejam coletadas sistematicamente e facilmente acessíveis para processamento ou análise posterior.

job_details = []

Analisando o conteúdo HTML

Depois de enviar uma solicitação HTTP GET, a próxima etapa é analisar o conteúdo HTML usando a biblioteca lxml. Isso nos permitirá navegar pela estrutura HTML e identificar os dados que queremos extrair.


# Definir User-Agent aleatório e proxy com método de autorização IP
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# Enviar um pedido HTTP GET para o URL
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

Extração de dados de trabalho

Depois que o conteúdo HTML é analisado, podemos extrair detalhes específicos do trabalho, como título, nome da empresa, local e URL do trabalho usando consultas XPath. Esses detalhes são armazenados em um dicionário e anexados a uma lista.


# Extrair detalhes da tarefa do conteúdo 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)

Guardar dados em CSV

Depois de recolher os dados do trabalho, guarde-os num ficheiro 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)

Código completo

Aqui está o código completo, combinando todas as secções acima:


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

# Especificar o endereço do servidor proxy com nome de utilizador e palavra-passe
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Configurar as opções do Chrome com o proxy e a autenticação
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Criar uma instância WebDriver com selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# Realize a sua automatização Selenium com as capacidades melhoradas do selenium-wire
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()

A extração de dados do LinkedIn utilizando Python com as bibliotecas requests e lxml oferece uma forma poderosa de analisar o mercado de trabalho e recrutar pessoal. Para garantir um processo de raspagem sem problemas, são utilizados proxies de datacenter com velocidades elevadas, bem como proxies ISP com um fator de confiança mais elevado, o que reduz o risco de bloqueios em acções automatizadas.

Comentários:

0 Comentários