Рубрики
Без рубрики

Лучший веб соскабливание в Python с селенью, красивым супом и пандами

Автор оригинала: 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.