Веб-скрапинг - это процесс сбора данных с веб-сайтов с помощью автоматизированных скриптов.

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

Кредиты веб-сайта: Кейт Галли

Удачи!

И оставайтесь в безопасности!