Веб-скрапинг - это процесс сбора данных с веб-сайтов с помощью автоматизированных скриптов.
Он состоит из трех основных шагов: получение страницы, анализ HTML и извлечение необходимой информации и сохранение ее в база данных.
Третий шаг состоит в основном из поиска частей HTML, содержащих нужную вам информацию.
Вы можете найти эту информацию, открыв страницу, которую хотите очистить, щелкнув правой кнопкой мыши и нажав на элемент проверки.
Затем вы можете выбрать элемент страницы для проверки. Вы можете увидеть это на изображении ниже.
Затем все, что вам нужно сделать, это использовать теги и классы в HTML, чтобы сообщить парсеру, где найти информацию.
Хорошо! Итак, давайте посмотрим на код!
Код
Поскольку это простой парсер, мы будем использовать только запросы, BeautifulSoup и Pandas.
Запросы будут использоваться для получения нужных страниц, а BeautifulSoup анализирует HTML. Мы будем использовать Pandas для хранения данных в DataFrame, а затем экспортировать их как файл .csv.
Итак, мы начнем с импорта этих библиотек.
Мы будем использовать эту ссылку и извлекать информацию о ней.
import requests from bs4 import BeautifulSoup as bs #Load webpage content r = requests.get("https://keithgalli.github.io/web-scraping/example.html")
Теперь мы преобразуем HTML-код веб-сайтов в красивый суп-объект и распечатаем его.
#Convert it to a beautiful soup object soup = bs(r.content) #print out html (use prettify to give it a better look) print(soup.prettify())
Использование методов find и find_all
#finds the first element that matches the tag first_header = soup.find("h2") #Wont stop on the first element , will make a list of all the h2's headers = soup.find_all("h2") print(first_header) print(headers)
#the list precedence does not matter , what comes first will be printed out pres_header = soup.find(["h1" , "h2"]) #But with the find_all function , it will print out all the list values all_header = soup.find_all(["h1" , "h2"]) print(pres_header) print(all_header)
Атрибут attrs в find_all
Вы также можете указать конкретный класс и идентификатор, которые вы ищете в тегах
Если указан неправильный идентификатор, будет напечатана пустая строка.
# Let's say you want to find the paragraph element print(soup.find_all("p")) #Let's say , want the paragraph tag with the id , "paragraph-id" paragraph = soup.find_all("p" , attrs={"id" : "paragraph-id"}) print(paragraph)
Использование вложенных результатов поиска
Допустим, вы хотите найти первый тег h1 с помощью вложенных вызовов.
#Call the body body = soup.find("body") #Call the 1st div from the body div = body.find("div") #Call the Header h1 = div.find("h1") h1
Поиск определенных строк
#RegEx Library . The functions in this module let you check if a particular string matches a given regular expression import re #Find all the paragraph tag elements , that have the word "Some" in it some = soup.find_all("p" , string = re.compile("Some")) some #Find all the headers with the word header (capital H and small h) header = soup.find_all("h2" , string = re.compile("(H|h)eader")) header
Получить ссылки
Допустим, мы хотим получить ссылку https://keithgalli.github.io/web-scraping/webpage.html из тега ‹a›
#Find the 1st <a> tag link = soup.find("a") #print the "href" attribute. print(link['href'])
Получить строки
Скажем, в первом div (class = «middle») нам нужен весь текст в нем.
#Find the first div header = soup.find("div") print(header) #To get the text print(header.get_text())
Синтаксис пути
#Within the Beautiful Soup object , we want to obtain the text of the first div's h1 tag. soup.body.div.h1.string
Давайте узнаем, как сохранить информацию во фрейме данных.
Задача: получить ссылки с веб-страницы (https://keithgalli.github.io/web-scraping/webpage.html) и сохранить их во фрейме данных.
#Import necessary libraries import requests from bs4 import BeautifulSoup as bs import pandas as pd #Request the webpage requests.get("https://keithgalli.github.io/web-scraping/webpage.html") #Create a Beautiful Soup Object webpage = bs(r.content)
Если вы видите HTML-код веб-страницы, используя элемент Inspect, ссылки находятся в первом теге ‹ul›, содержащем класс «socials».
#Get the <ul> tag links = webpage.find("ul" , attrs={"class" : "socials"}) print(links)
Теперь, в теге ‹ul›, нам нужно получить тег ‹li›
#Get the <a> tag from the links variable # new_links = links.find_all('a') print(new_links)
У нас есть все ссылки на социальные сети, теперь нам просто нужно получить атрибут «href», используя цикл for, чтобы получить каждую ссылку и добавить ее в список.
Я использовал понимание списка
actual_links = [link['href'] for link in new_links] print(actual_links)
Теперь мы сохраним это во фрейме данных и экспортируем в файл CSV.
#Create the Dataframe Dictionary dataframe = {'Links' : actual_links} #Save it to the Dataframe 'df' df = pd.DataFrame(dataframe) #Save the links to a csv file df.to_csv('csvfile.csv' , index = False) print(df)
Точно так же, если вы просматриваете веб-сайт о продуктах питания, вы можете сохранить имя, рейтинги, местоположение и т. Д. В отдельных списках и сохранить их во фрейме данных!
Да, вы можете многое сделать с данными, но не упустите главное. Эта статья о скребке, а не о скопированных данных. Основная цель здесь - рассказать, насколько мощным инструментом может быть этот инструмент.
Кроме того, та же концепция веб-скрейпинга может использоваться для выполнения множества различных действий. Например, вы можете очистить Amazon, чтобы отслеживать цены, или вы можете создать набор данных о вакансиях, очистив веб-сайт поиска работы, если вы ищете работу.
Кредиты веб-сайта: Кейт Галли
Удачи!
И оставайтесь в безопасности!