Привет всем! Сегодняшняя запись посвящена интересной теме, которая звучит как «Парсинг данных с помощью BeautifulSoup». Зачем все это? Решать вам, в любом случае — я не агитирую нарушать закон (например, собирая личные данные), а лишь показываю, что получать данные можно более удобным методом, чем просто просматривая те или иные сайты. Поехали!
Легкое отступление: в Python имеются три основные библиотеки, которые служат для получения данных с сайтов: BeautifulSoup, Scrapy и Selenium.
BeautifulSoup работает с помощью дополнения requests — которые организовывают html-запросы к нужным сайтам, а уж полученный ответ мы обрабатываем с помощью BeautifulSoup.
Учитывая, что мы сегодня будем рассматривать BeautifulSoup (некоторые примеры практического использования библиотеки я описывал ранее) — к двум другим библиотекам вернемся позднее 🙂
Итак, вначале нам нужно установить библиотеку. Для этого устанавливаем requests:
pip3 install beautifulsoup4 requests
Учитывая, что на многих сайтах сейчас устанавливаются модули защиты от парсинга — давайте начнем с того, что обманем требуемый ресурс, и представимся как легальный пользователь:
import requests
headers = requests.utils.default_headers()
headers.update({ 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/69.0'})
Итак, заголовок (поддельный) браузера мы установили, и для проверки — поверит ли сайт тому, что мы действительно те, за кого себя выдаем — зайдем на какой-то сайт:
from bs4 import BeautifulSoup
url = "https://google.com"
req = requests.get(url, headers)
soup = BeautifulSoup(req.content, 'html.parser')
print(soup.prettify())
Теперь создаем объект BeautifulSoup, который нужен для приема необработанных данных, полученных через req.content. Второй параметр — html.parser — это способ сообщить нашей библиотеке BeautifulSoup о том, что это — html — документ. После того, как объект создан — мы можем для начала посмотреть, как выглядит наша переменная soup с помощью print (soup.prettify ()):
Выглядит, конечно, круто и внушительно, но как получить из всего этого внятные данные? Для начала давайте определимся с тем, что получение данных с сайтов так или иначе связано с тегами - т.е. нам нужно разобраться, как их (теги) распознавать, и как получать информацию, находящуюся внутри тегов.
Начнем с простого - использование soup.find(...) или soup.find_all(...). Разница между командами заключается в том, что первый вариант найдет только один нужный нам тег (самый первый), в то время, как второй вариант покажет все варианты расположения нужного тега.
Давайте попробуем найти в каше, полученной выше - все ссылки с тегом a href.
variable = soup.find_all('a') #получаем вообще все, что связано с тегом a href
for tag in variable: #и теперь по этому списку идем, выгребая конкретно ссылки
print(tag.get('href'))
Полный код, созданным нами за сегодня, благодаря чему мы подделываем заголовок, получаем содержимое целевой страницы, и выгребаем все ссылки выглядит так:
import requests
from bs4 import BeautifulSoup
headers = requests.utils.default_headers()
headers.update({ 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/69.0'})
url = "https://www.google.com/"
req = requests.get(url, headers)
soup = BeautifulSoup(req.content, 'html.parser')
variable = soup.find_all('a')
for tag in variable:
print(tag.get('href'))
Для начала хватит 🙂 Сегодня мы научились подключать библиотеку BeautifulSoup, подделывать заголовок браузера для запроса, и с помощью библиотеки BeautifulSoup получать список нужных нам тегов. Да, всего 11 строчек 🙂
Скоро продолжение 🙂 Спасибо за внимание!
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️