Існує два способи отримання даних із веб-сайту:
- Використовуйте API веб-сайту (якщо він існує). Наприклад, Facebook має API Facebook Graph, який дозволяє отримувати дані, опубліковані на Facebook.
- Отримайте доступ до HTML веб-сторінки та витягніть з нього корисну інформацію/дані. Ця техніка називається веб-скопіюванням або веб-збиранням або вилученням веб-даних.
У цій статті обговорюються кроки, пов’язані з веб-скрапінгом за допомогою реалізації фреймворку веб-скрапінгу Python під назвою Beautiful Soup. Етапи веб-збирання:
- Надішліть HTTP-запит на URL-адресу веб-сторінки, до якої ви хочете отримати доступ. Сервер відповідає на запит, повертаючи вміст HTML веб-сторінки. Для цього завдання ми будемо використовувати сторонню бібліотеку HTTP для python-запитів.
- Після того, як ми отримали доступ до вмісту HTML, у нас залишилося завдання аналізу даних. Оскільки більшість даних HTML є вкладеними, ми не можемо отримати дані просто за допомогою обробки рядків. Потрібен парсер, який може створити вкладену/деревоподібну структуру даних HTML. Існує багато доступних бібліотек аналізатора HTML, але найдосконалішою є html5lib.
- Тепер все, що нам потрібно зробити, це навігація та пошук у створеному дереві аналізу, тобто обхід дерева. Для цього завдання ми будемо використовувати іншу сторонню бібліотеку 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-адресу. Цей блог створено Ніхіл Кумар .