Этот единственный навык откроет для вас мир новых возможностей

У вас когда-нибудь была идея об этом удивительном проекте по науке о данных: вы ищете данные, которые вам понадобятся, в Интернете, но, к сожалению, их нигде нет? К сожалению, не все наборы данных, которые вам когда-либо понадобятся, доступны в Интернете. Итак, что нужно делать? Отказаться от идеи и вернуться к kaggle? Нет! Настоящий специалист по данным должен уметь собирать свои ДАННЫЕ!

Что такое веб-парсинг и зачем его изучать?

Интернет - это самый крупный ресурс данных, это буквальный архив человеческих знаний, по крайней мере, за последние 20 лет. Веб-парсинг - это искусство извлечения этих данных из Интернета, как специалист по данным. Это такой удобный инструмент, который открывает множество дверей для интересных проектов.

Обратите внимание, что некоторые веб-сайты запрещают очистку и могут заблокировать ваш IP-адрес, если вы выполняете очистку слишком часто или злонамеренно.

Как мы очищаем?

Когда дело доходит до парсинга веб-страниц, существует два подхода.

Парсинг на основе запроса: при таком подходе мы будем отправлять запрос на сервер веб-сайта, который вернет HTML-код страницы с тем же содержанием, которое вы находите, когда нажимаете «Просмотр источника страницы» в Google. chrome, вы можете попробовать это прямо сейчас, нажав ctrl + u. Затем мы обычно будем использовать библиотеку для анализа HTML и извлечения нужных данных. Этот подход прост, легковесен и очень быстр, однако он не идеален, и есть один недостаток, который может отпугнуть вас от его использования, на самом деле большинство современных веб-сайтов в настоящее время используют JavaScript для рендеринга своего контента, IE: вы не видите содержимое страницу до тех пор, пока не будет выполнен JavaScript, который метод запроса не может обработать.

Парсинг на основе браузера: для выполнения JavaScript нам нужен полноценный браузер, для этого и предназначен этот метод, мы имитируем браузер, перейдем на нужную страницу, дождемся выполнения JavaScript и может даже взаимодействовать со страницей, нажимая кнопки, заполняя формы ... Затем просто посмотрите на состояние HTML и извлеките данные. Этот подход очень гибкий, вы можете в значительной степени очистить любой веб-сайт, который захотите, однако он намного медленнее и требует больших ресурсов, чем просто отправка запроса.

Очистите что-нибудь селеном:

Selenium - широко используемая библиотека для веб-автоматизации, но вы можете использовать ее и для парсинга! В принципе, любую задачу, которую человек может выполнить вручную, вы сможете смоделировать с помощью селена, вы можете создать бота, который будет выполнять определенные действия, когда что-то произойдет, или вы можете заставить селен просматривать веб-страницы и очищать данные для вас, которые что мы будем делать в этой статье.

Для парсинга HTML мы будем использовать красивый суп.

Для дальнейшего чтения ссылки на документацию по селену и красивому супу.

Демонстрация: парсинг действительно вакансий

Давайте попрактикуемся, цель этой демонстрации - очистить задания от действительно заданного поискового запроса и сохранить их в файле csv.

Точнее нас интересуют:

  • должность
  • Место работы
  • Компания, разместившая предложение
  • Описание работы
  • Когда вакансия была опубликована

Вот ссылка на образец страницы вакансии, а вот код проекта

Сначала импортируем необходимые библиотеки:

from bs4 import BeautifulSoup
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
  • Beautiful Soup предназначен для взаимодействия с HTML
  • Панды для экспорта в csv
  • Веб-драйвер - это фактический браузер, мы будем использовать Chrome и настраивать его для работы в режиме без головы, что означает, что он будет работать в фоновом режиме, и мы не сможем увидеть, как браузер проходит через страницы вакансий, это необязательно, если вы хотите увидеть браузер, вы можете удалить его!

Первое, что нужно сделать, это получить фактические страницы вакансий, у Lucky действительно есть функция поиска, все, что вам нужно сделать, это перейти к:

«Https://ma.indeed.com/jobs?q=data+scientist&start=10»

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

Мы будем реализовывать две функции: одна - вспомогательная функция для перехода по URL-адресу, извлекающая HTML-код и превращающая его в объект Beautiful Soup, с которым мы можем взаимодействовать, а другая - для извлечения ссылок на страницы вакансий:

def toSoup(url):
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    return soup
def getPageUrls(query,number):
    url="https://ma.indeed.com/emplois?q="+str(query)+"&start="+str(((number-1)*10))
    soup=toSoup(url)
    maxPages=soup.find("div",{"id":"searchCountPages"}).text.strip().split(" ")[3]
    return maxPages,[appendIndeedUrl(a["href"]) for a in soup.findAll("a",{"class":"jobtitle turnstileLink"})]

Теперь, когда у нас есть URL-адреса, давайте реализуем некоторые функции для извлечения того, что мы хотим, со страницы вакансий:

def paragraphArrayToSingleString(paragraphs):
    string=""
    for paragraph in paragraphs:
        string=string+"\n"+paragraph.text.strip()
    return string
def appendIndeedUrl(url):
    return "https://ma.indeed.com"+str(url)
def processPage(url):
    soup=toSoup(url)
    title=soup.find("h1",{"class":"icl-u-xs-mb--xs icl-u-xs-mt--none jobsearch-JobInfoHeader-title"}).text.strip()
    CompanyAndLocation=soup.find("div",{"class":"jobsearch-InlineCompanyRating icl-u-xs-mt--xs jobsearch-DesktopStickyContainer-companyrating"})
    length=len(CompanyAndLocation)
    if length==3:
        company=CompanyAndLocation.findAll("div")[0].text.strip()
        location=CompanyAndLocation.findAll("div")[2].text.strip()
    else:
        company="NAN"
        location=CompanyAndLocation.findAll("div")[0].text.strip()
    date=soup.find("div",{"class":"jobsearch-JobMetadataFooter"}).text.split("-")[1].strip()
    description=paragraphArrayToSingleString(soup.find("div",{"id":"jobDescriptionText"}).findAll())
    return {"title":title,"company":company,"location":location,"date":date,"description":description}
def getMaxPages(query):
    url="https://ma.indeed.com/emplois?q="+str(query)

Здесь мы используем атрибуты HTML, такие как «class» или «id», чтобы найти нужную нам информацию. Вы можете понять, как выбрать нужные данные, проверив страницу.

Вот пример свойства title:

Мы видим, что заголовок - это «h1», который мы можем выбрать, используя его класс.

Наконец, давайте реализуем функцию для запуска, получения всех заданий и сохранения их в файле csv.

Обратите внимание, что мы получаем максимальное количество страниц, поэтому поисковый робот останавливается, когда мы достигаем последней страницы.

def getJobsForQuery(query):
    data=[]
    maxPages=999
    for number in range(maxPages):
        maxPages,urls=getPageUrls(query,number+1)
        for url in urls:
            try:
                page=processPage(url)
                data.append(page)
            except:
                pass
        print("finished Page number: "+str(number+1))
    #Save the data to a csv file
    pd.DataFrame(data).to_csv("jobs_"+query+".csv")

Теперь давайте проанализируем вакансии в области науки о данных:

driver = webdriver.Chrome(ChromeDriverManager().install(),options=chrome_options)
getJobsForQuery("data scientist")

Вот результат:

Заключение

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

если вам удалось попасть сюда Поздравляем. Спасибо за чтение, надеюсь, вам понравилась статья. Для личного контакта или обсуждения, не стесняйтесь обращаться ко мне в LinkedIn.