Действительно, Скребок для заданий только для сообщений с внешней ссылкой

#python #pandas #web-scraping #beautifulsoup #python-requests

Вопрос:

В настоящее время используется приведенный ниже скребок Python для извлечения названия должности, компании, зарплаты и описания. Ищете способ сделать еще один шаг вперед, отфильтровав только результаты, в которых ссылка на приложение является URL-адресом веб-сайта компании, в отличие от сообщений «Легко применить», которые отправляют приложение через Indeed. Есть ли способ сделать это?

 import requests
from bs4 import BeautifulSoup
import pandas as pd

def extract(page):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
    url = f'https://www.indeed.com/jobs?q=Software Engineeramp;l=Austin, TXamp;ts=1630951951455amp;rq=1amp;rsIdx=1amp;fromage=lastamp;newcount=6amp;vjk=c8f4815c6ecfa793'
    r = requests.get(url, headers) # 200 is OK, 404 is page not found
    soup = BeautifulSoup(r.content, 'html.parser')
    return soup

# <span title="API Developer"> API Developer </span>
def transform(soup):
    divs = soup.find_all('div', class_ = 'slider_container')
    for item in divs:
        if item.find(class_ = 'label'):
            continue # need to fix, if finds a job that has a 'new' span before the title span, skips job completely
        title = item.find('span').text.strip()
        company = item.find('span', class_ = "companyName").text.strip()
        description = item.find('div', class_ = "job-snippet").text.strip().replace('n', '')
        try:
            salary = item.find('span', class_ = "salary-snippet").text.strip()
        except:
            salary = ""
        
        job = {
                'title': title,
                'company': company,
                'salary': salary,
                'description': description
        }
        jobList.append(job)
#        print("Seeking a: " title " to join: " company " paying: " salary ". Job description: " description) 
    return

jobList = []

# go through multiple pages
for i in range(0,100, 10): #0-40 stepping in 10's
    print(f'Getting page, {i}')
    c = extract(0)
    transform(c)

print(len(jobList))

df = pd.DataFrame(jobList)
print(df.head())
df.to_csv('jobs.csv')
 

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать пример ссылки на вакансию, которую вы хотите отфильтровать?

2. Конечно, по следующей ссылке; это вакансия на должность специалиста по обработке данных, на которую пользователи могут подать заявку непосредственно в Indeed (информация заполняется в Indeed, отправляется из Indeed и т. Д.). В идеале следовало бы искать скребок, чтобы отфильтровать все эти результаты, и удалять только публикации, в которых пользователь должен перейти на веб-сайт компании, чтобы подать заявку: indeed.com/…

Ответ №1:

Мой подход заключается в следующем-

Найдите href по <a> тегу для каждой карточки вакансии на начальной странице, а затем отправьте запрос по каждой из этих ссылок и перейдите по ссылке на внешнюю вакансию (если доступна кнопка «Подать заявку на сайте компании») оттуда.

Фрагмент кода-

 #function which gets external job links
def get_external_link(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
    r = requests.get(url, headers) 
    soup = BeautifulSoup(r.content, 'html.parser')
    
    #if Apply On Company Site button is available, fetch the link
    if(soup.find('a',attrs={"referrerpolicy" : "origin"})) is not None:
        external_job_link=soup.find('a',attrs={"referrerpolicy" : "origin"})
        print(external_job_link['href'])

#add this piece of code to transform function
def transform(soup):
    cards=soup.find('div',class_='mosaic-provider-jobcards')
    links=cards.find_all("a", class_=lambda value: value and value.startswith("tapItem"))

    #for each job link in the page call get_external_links
    for link in links:
        get_external_link('https://www.indeed.com' (link['href']))
 

Примечание — Вы также можете использовать источник страницы новых запросов, которые вызываются, чтобы получить такие данные, как название, компания, зарплата, описание, которые вы ранее использовали для удаления с главной страницы.