Этот единственный навык откроет для вас мир новых возможностей
У вас когда-нибудь была идея об этом удивительном проекте по науке о данных: вы ищете данные, которые вам понадобятся, в Интернете, но, к сожалению, их нигде нет? К сожалению, не все наборы данных, которые вам когда-либо понадобятся, доступны в Интернете. Итак, что нужно делать? Отказаться от идеи и вернуться к 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.