logo

Реалізація веб-скрапінгу на Python за допомогою BeautifulSoup

Існує два способи отримання даних із веб-сайту:

  • Використовуйте API веб-сайту (якщо він існує). Наприклад, Facebook має API Facebook Graph, який дозволяє отримувати дані, опубліковані на Facebook.
  • Отримайте доступ до HTML веб-сторінки та витягніть з нього корисну інформацію/дані. Ця техніка називається веб-скопіюванням або веб-збиранням або вилученням веб-даних.

У цій статті обговорюються кроки, пов’язані з веб-скрапінгом за допомогою реалізації фреймворку веб-скрапінгу Python під назвою Beautiful Soup. Етапи веб-збирання:



  1. Надішліть HTTP-запит на URL-адресу веб-сторінки, до якої ви хочете отримати доступ. Сервер відповідає на запит, повертаючи вміст HTML веб-сторінки. Для цього завдання ми будемо використовувати сторонню бібліотеку HTTP для python-запитів.
  2. Після того, як ми отримали доступ до вмісту HTML, у нас залишилося завдання аналізу даних. Оскільки більшість даних HTML є вкладеними, ми не можемо отримати дані просто за допомогою обробки рядків. Потрібен парсер, який може створити вкладену/деревоподібну структуру даних HTML. Існує багато доступних бібліотек аналізатора HTML, але найдосконалішою є html5lib.
  3. Тепер все, що нам потрібно зробити, це навігація та пошук у створеному дереві аналізу, тобто обхід дерева. Для цього завдання ми будемо використовувати іншу сторонню бібліотеку python, Гарний суп . Це бібліотека Python для вилучення даних із файлів HTML та XML.

Крок 1: встановлення необхідних сторонніх бібліотек

  • Найпростіший спосіб інсталювати зовнішні бібліотеки в Python — використовувати pip. піп це система керування пакетами, яка використовується для встановлення та керування програмними пакетами, написаними на Python. Все, що вам потрібно зробити, це:
pip install requests pip install html5lib pip install bs4>

Крок 2. Доступ до вмісту HTML із веб-сторінки

Python








import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)>

>

>

Давайте спробуємо розібратися в цьому фрагменті коду.

  • Перш за все імпортуйте бібліотеку запитів.
  • Потім укажіть URL-адресу веб-сторінки, яку потрібно скопіювати.
  • Надішліть запит HTTP на вказану URL-адресу та збережіть відповідь із сервера в об’єкті відповіді під назвою r.
  • Тепер, як надрукувати r.content, щоб отримати необроблений вміст HTML веб-сторінки. Він має тип «рядок».

Примітка: іноді ви можете отримати повідомлення про помилку Не прийнято, тому спробуйте додати агент користувача браузера, як показано нижче. Тут знайдіть свій агент користувача на основі пристрою та браузера https://deviceatlas.com/blog/list-of-user-agent-strings

Python3




headers>=> {>'User-Agent'>:>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'>}> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r>=> requests.get(url>=>URL, headers>=>headers)> print>(r.content)>

>

>

Крок 3: аналіз вмісту HTML

Python




#This will not run on online IDE> import> requests> from> bs4>import> BeautifulSoup> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)># If this line causes an error, run 'pip install html5lib' or install html5lib> print>(soup.prettify())>

>

>

Дуже приємно в бібліотеці BeautifulSoup те, що вона побудована на основі бібліотек синтаксичного аналізу HTML, таких як html5lib, lxml, html.parser тощо. Тож об’єкт BeautifulSoup і бібліотеку аналізатора можна створювати одночасно. У наведеному вище прикладі

soup = BeautifulSoup(r.content, 'html5lib')>

Ми створюємо об’єкт BeautifulSoup, передаючи два аргументи:

    r.content : це необроблений вміст HTML. html5lib : вказуємо аналізатор HTML, який ми хочемо використовувати.

Зараз soup.prettify() друкується, він дає візуальне представлення дерева аналізу, створеного з необробленого вмісту HTML. Крок 4. Пошук і навігація по дереву аналізу Тепер ми хотіли б отримати деякі корисні дані з вмісту HTML. Об’єкт soup містить усі дані у вкладеній структурі, які можна отримати програмним шляхом. У нашому прикладі ми збираємо веб-сторінку, що складається з кількох цитат. Отже, ми хотіли б створити програму для збереження цих цитат (і всієї відповідної інформації про них).

Python

перетворити рядок на дату




#Python program to scrape website> #and save quotes from website> import> requests> from> bs4>import> BeautifulSoup> import> csv> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)> > quotes>=>[]># a list to store quotes> > table>=> soup.find(>'div'>, attrs>=> {>'id'>:>'all_quotes'>})> > for> row>in> table.findAll(>'div'>,> >attrs>=> {>'class'>:>'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'>}):> >quote>=> {}> >quote[>'theme'>]>=> row.h5.text> >quote[>'url'>]>=> row.a[>'href'>]> >quote[>'img'>]>=> row.img[>'src'>]> >quote[>'lines'>]>=> row.img[>'alt'>].split('>#')[0]> >quote[>'author'>]>=> row.img[>'alt'>].split('>#')[1]> >quotes.append(quote)> > filename>=> 'inspirational_quotes.csv'> with>open>(filename,>'w'>, newline>=>'') as f:> >w>=> csv.DictWriter(f,[>'theme'>,>'url'>,>'img'>,>'lines'>,>'author'>])> >w.writeheader()> >for> quote>in> quotes:> >w.writerow(quote)>

>

>

Перш ніж рухатися далі, ми рекомендуємо вам переглянути HTML-вміст веб-сторінки, який ми надрукували за допомогою методу soup.prettify(), і спробувати знайти шаблон або спосіб переходу до лапок.

  • Помічено, що всі лапки знаходяться всередині контейнера div, ідентифікатор якого — «all_quotes». Отже, ми знаходимо цей елемент div (названий таблицею у коді вище), використовуючи знайти() метод:
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • Перший аргумент – це тег HTML, який потрібно шукати, а другий аргумент – це елемент словникового типу для визначення додаткових атрибутів, пов’язаних із цим тегом. знайти() метод повертає перший відповідний елемент. Можна спробувати роздрукувати table.prettify() щоб зрозуміти, що робить цей фрагмент коду.
  • Тепер в елементі таблиці можна помітити, що кожна цитата знаходиться всередині контейнера div, класом якого є цитата. Отже, ми повторюємо кожен контейнер div, клас якого є quote. Тут ми використовуємо метод findAll(), який схожий на метод find з точки зору аргументів, але він повертає список усіх відповідних елементів. Тепер кожна цитата повторюється за допомогою змінної, яка називається рядок. Ось один зразок вмісту рядка HTML для кращого розуміння: Тепер розглянемо цей фрагмент коду:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)>
  • Ми створюємо словник, щоб зберегти всю інформацію про цитату. Доступ до вкладеної структури можна отримати за допомогою крапкової нотації. Щоб отримати доступ до тексту всередині елемента HTML, ми використовуємо .текст:
quote['theme'] = row.h5.text>
  • Ми можемо додавати, видаляти, змінювати та мати доступ до атрибутів тегу. Це робиться шляхом обробки тегу як словника:
quote['url'] = row.a['href']>
  • Нарешті, усі цитати додаються до викликаного списку котирування.
  • Нарешті, ми хотіли б зберегти всі наші дані в якомусь файлі CSV.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
  • Тут ми створюємо файл CSV під назвою inspirational_quotes.csv і зберігаємо всі цитати в ньому для подальшого використання.

Отже, це був простий приклад того, як створити веб-скребок на Python. Звідси ви можете спробувати видалити будь-який інший веб-сайт на свій вибір. У разі будь-яких питань, опублікуйте їх нижче в розділі коментарів.

Примітка : У багатьох випадках веб-скрапінг вважається незаконним. Це також може призвести до того, що веб-сайт назавжди заблокує вашу IP-адресу. Цей блог створено Ніхіл Кумар .