Автор оригинала: FreeCodeCapm Team.
Дейв Грей
Веб-соскоб
Используя язык программирования Python, можно быстро и эффективно можно «соскребать» данные из сети.
Веб-соскоб определяется как:
Веб-соскоб является ценным Инструмент в наборе навыков ученых данных Отказ
Теперь, что высказать?
Публично доступные данные
Канвью Сайт поддерживает «прозрачность правительства». Это также лозунг сайта. На сайте предусмотрены данные о заработной плате для штата Канзас. И это здорово!
Тем не менее, как и многие правительственные веб-сайты, он похоронит данные в сверлных ссылках и таблицах. Это часто требует «наилучшего навигации навигации», чтобы найти конкретные данные, которые вы ищете. Я хотел использовать публичные данные, предоставляемые для университетов в Канзасе в исследовательском проекте. Сбор данных с Python и сохранение его как JSON было то, что мне нужно было сделать, чтобы начать.
Ссылки JavaScript увеличивают сложность
Веб-соскоб с Python часто требует не более, чем использование Красивый суп модуль, чтобы достичь цели. Красивый суп Это популярная библиотека Python, которая делает веб-соскабливание, пройдя в DOM (модель объекта документов) проще для реализации.
Тем не менее, Канвью Сайт использует ссылки JavaScript. Следовательно, примеры с использованием Python и красивый суп не будут работать без дополнительных дополнений.
Селен к спасению
Пакет селена используется для автоматизации взаимодействия веб-браузера из Python. С помощью Selenium возможно программирование сценария Python для автоматизации веб-браузера. После этого эти ссылки на PESKY JavaScript больше не являются проблемой.
from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import re import pandas as pd import os
Selenium теперь запустит сеанс браузера. Для селена до работы он должен получить доступ к драйверу браузера. По умолчанию он будет выглядеть в том же каталоге, что и скрипт Python. Ссылки на хромированные, Firefox, Edge и Safari драйверы Доступно здесь Отказ Пример код ниже использует Firefox:
#launch url url = "http://kanview.ks.gov/PayRates/PayRates_Agency.aspx" # create a new Firefox session driver = webdriver.Firefox() driver.implicitly_wait(30) driver.get(url) python_button = driver.find_element_by_id('MainContent_uxLevel1_Agencies_uxAgencyBtn_33') #FHSU python_button.click() #click fhsu link
python_button.click ()
Выше представлен Selenium, чтобы щелкнуть ссылку JavaScript на странице. После прибытия на страницу заголовков рабочих мест, селеновые руки от источника страницы к красивому супу.
Переход к красивому супу
Красивый суп Остается лучший способ пройти домо и царапать данные. После определения пустого списка и переменную счетчика пришло время задать красивый суп, чтобы воспользоваться всеми ссылками на страницу, соответствующую регулярному выражению:
#Selenium hands the page source to Beautiful Soup soup_level1=BeautifulSoup(driver.page_source, 'lxml') datalist = [] #empty list x = 0 #counter for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")): ##code to execute in for loop goes here
Из приведенного выше примера вы можете видеть, что красивый суп извлечет ссылку на JavaScript для каждого названия работы в государственном агентстве. Сейчас в блоке кодового блока FOR/в LOOP SELENIUM нажимает на каждую ссылку JavaScript. Красивый суп будет извлекать столик с каждой страницы.
#Beautiful Soup grabs all Job Title links for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")): #Selenium visits each Job Title page python_button = driver.find_element_by_id('MainContent_uxLevel2_JobTitles_uxJobTitleBtn_' + str(x)) python_button.click() #click link #Selenium hands of the source of the specific job page to Beautiful Soup soup_level2=BeautifulSoup(driver.page_source, 'lxml') #Beautiful Soup grabs the HTML table on the page table = soup_level2.find_all('table')[0] #Giving the HTML table to pandas to put in a dataframe object df = pd.read_html(str(table),header=0) #Store the dataframe in a list datalist.append(df[0]) #Ask Selenium to click the back button driver.execute_script("window.history.go(-1)") #increment the counter variable before starting the loop over x += 1
Pandas: Библиотека анализа данных Python
Красивый суп проходит результаты к пандам. Пандас использует его read_html
Функция для чтения данных таблицы HTML в DataFrame. DataFrame добавляется к ранее определенному пустую списку.
Перед завершенным блоком цикла SELENIUM необходимо нажать кнопку «Назад» в браузере. Это поэтому следующая ссылка в цикле будет доступна для нажатия на страницу списка заданий.
Когда Loop For/In Poot завершится, Selenium посетил каждую ссылку заголовка задания. Красивый суп извлек таблицу с каждой страницы. Pandas сохранил данные из каждой таблицы в DataFrame. Каждый DataFrame – это элемент в DataList. Индивидуальные таблицы DataFrames теперь должны слиться в одно большое значение DataFrame. Затем данные будут преобразованы в формат JSON с Pandas.dataframe.to_json :
#loop has completed #end the Selenium browser session driver.quit() #combine all pandas dataframes in the list into one big dataframe result = pd.concat([pd.DataFrame(datalist[i]) for i in range(len(datalist))],ignore_index=True) #convert the pandas dataframe to JSON json_records = result.to_json(orient='records')
Теперь Python создает файл данных JSON. Это готов к использованию!
#get current working directory path = os.getcwd() #open, write, and close the file f = open(path + "\\fhsu_payroll_data.json","w") #FHSU f.write(json_records) f.close()
Автоматизированный процесс быстро
Автоматизированный веб-процесс Scraping, описанный выше, завершится быстро. Selenium открывает окно браузера, которое вы можете увидеть работать. Это позволяет мне показать вам видео захвата экрана о том, как быстро этот процесс. Вы видите, как быстро сценарий следует за ссылкой, захватывает данные, возвращается назад и нажимает на следующую ссылку. Это делает извлечение данных из сотен связей с однозначными минутами.
Полный код Python
Вот полный код Python. Я включил импорт для Tabulate. Это требует дополнительной линии кода, которая будет использовать Tabulate для симпатичного печати данных в интерфейс вашей командной строки:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import re import pandas as pd from tabulate import tabulate import os #launch url url = "http://kanview.ks.gov/PayRates/PayRates_Agency.aspx" # create a new Firefox session driver = webdriver.Firefox() driver.implicitly_wait(30) driver.get(url) #After opening the url above, Selenium clicks the specific agency link python_button = driver.find_element_by_id('MainContent_uxLevel1_Agencies_uxAgencyBtn_33') #FHSU python_button.click() #click fhsu link #Selenium hands the page source to Beautiful Soup soup_level1=BeautifulSoup(driver.page_source, 'lxml') datalist = [] #empty list x = 0 #counter #Beautiful Soup finds all Job Title links on the agency page and the loop begins for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")): #Selenium visits each Job Title page python_button = driver.find_element_by_id('MainContent_uxLevel2_JobTitles_uxJobTitleBtn_' + str(x)) python_button.click() #click link #Selenium hands of the source of the specific job page to Beautiful Soup soup_level2=BeautifulSoup(driver.page_source, 'lxml') #Beautiful Soup grabs the HTML table on the page table = soup_level2.find_all('table')[0] #Giving the HTML table to pandas to put in a dataframe object df = pd.read_html(str(table),header=0) #Store the dataframe in a list datalist.append(df[0]) #Ask Selenium to click the back button driver.execute_script("window.history.go(-1)") #increment the counter variable before starting the loop over x += 1 #end loop block #loop has completed #end the Selenium browser session driver.quit() #combine all pandas dataframes in the list into one big dataframe result = pd.concat([pd.DataFrame(datalist[i]) for i in range(len(datalist))],ignore_index=True) #convert the pandas dataframe to JSON json_records = result.to_json(orient='records') #pretty print to CLI with tabulate #converts to an ascii table print(tabulate(result, headers=["Employee Name","Job Title","Overtime Pay","Total Gross Pay"],tablefmt='psql')) #get current working directory path = os.getcwd() #open, write, and close the file f = open(path + "\\fhsu_payroll_data.json","w") #FHSU f.write(json_records) f.close()
Заключение
Веб-соскоб с Python и Красивый суп является отличным инструментом, имеющим в своем вашим квалифицировании. Используйте Web Scraping, когда данные вам нужно работать, доступна для общественности, но не обязательно удобно доступно. Когда JavaScript предоставляет или «скрывает» содержимое, автоматизация браузера с Селен Застраховать ваш код «видит», что вы (как пользователь) должны видеть. И, наконец, когда вы соскабливаете таблицы, полные данные, Пандас Является ли библиотека анализа данных Python, которая будет справиться со всеми.
Справка:
Следующая статья была полезной ссылкой на этот проект:
https://pythonprogramminglanguage.com/web-scraping-with-pandas-and-beautifulsoup/
Обратитесь к мне в любое время на LinkedIn или Twitter Отказ И если вам понравилась эта статья, дайте ему несколько хлопьев. Я искренне ценю это.
https://www.linkedin.com/in/davidagray/
Дейв Грей (@yesdavidgray) | Twitter Последние твиты из Дейва Грей (@yesdavidgray). Инструктор @fhsuinformatics * Разработчик * Музыкант * Предприниматель * … twitter.com.