Найти в Дзене
JuкeNet

Парсер на Python. Собираем информацию с сайтов.

Для начала, что такое парсинг, и нужен ли он нам? Парсинг - это процесс сбора информации с сайтов для последующей обработки. Например, вы хотите создать программу "Погода" , не будете же вы следить за термометром и вписывать данные каждый час. Гораздо удобнее, чтобы программа сама брала информацию из интернета. Или вам нужно следить за изменениями данных на каком-либо сайте и, чтобы не делать всё это вручную, мы будем учиться создавать парсер. К тому же парсеры много кому нужны и на фрилансе есть куча заказов от 2000 и до бесконечности рублей ( не шучу порой цена до безобразия большая) Кхм, я буду стараться максимально подробно рассказать о всех тонкостях кода , так что, не судите строго, если что Ну что, интересно? Тогда начнём! Делать всё, как вы поняли будем через питон, если у вас его всё ещё, то вся информация о том как скачать есть тут: нажми на меня! Конечно же начнём с библиотек, и сегодня нам понадобятся requests и BeautifulSoup Вводим в терминале: pip install beautifulsoup4
Оглавление

Для начала, что такое парсинг, и нужен ли он нам?

Парсинг - это процесс сбора информации с сайтов для последующей обработки. Например, вы хотите создать программу "Погода" , не будете же вы следить за термометром и вписывать данные каждый час. Гораздо удобнее, чтобы программа сама брала информацию из интернета. Или вам нужно следить за изменениями данных на каком-либо сайте и, чтобы не делать всё это вручную, мы будем учиться создавать парсер. К тому же парсеры много кому нужны и на фрилансе есть куча заказов от 2000 и до бесконечности рублей ( не шучу порой цена до безобразия большая)

Кхм, я буду стараться максимально подробно рассказать о всех тонкостях кода , так что, не судите строго, если что

Ну что, интересно? Тогда начнём!

Делать всё, как вы поняли будем через питон, если у вас его всё ещё, то вся информация о том как скачать есть тут: нажми на меня!

Конечно же начнём с библиотек, и сегодня нам понадобятся requests и BeautifulSoup

Вводим в терминале:

pip install beautifulsoup4

pip install requests

и начинаем наш код с импорта библиотек, пишем:

import requests

from bs4 import BeautifulSoup as bs

(as bs используется для сокращения названия BeautifulSoup, чтобы не приходилось писать длинное название библиотеки в коде, а вместо этого использовать короткое bs)

Теперь определяемся с тем, что будем парсить. В моём примере я буду парсить данные о таваре "Часы" в ЯндексМаркет.

Теперь создаём переменную URL_TEMPLATE , в которую поместим ссылку на сайт, с которого будем парсить, и переменную r, в которой с помощью requests и метода get запрашиваем у сайта разрешение на доступ, и выводим результат запроса:

URL_TEMPLATE = "https://market.yandex.ru/catalog--chasy/51960072/list?srnum=3339&was_redir=1&rt=9&rs=eJwzmswcwFjFwvH7BOssRo6L7Rc2XGy82H2UkYFh2k4g-WCyLZBc8MkKSCqs3Qsi5UCkA5cdkGzIA8kqJIPFJ-8BkgmqIPEFPCDxhFSQOMMesBpuEMlwczeInApiP0gBkQ2_wew7IPMP5IPUJ7wFqVHoBNviAxaZCDK54RXYJTZg8gZYTT1I_MFMG5CZiftB6hnAuhzALpEHiSfIgdgOL8Hu2Q6SPdAHEnfYBzbnvDXIhDcgkQM5YJfcAMu6g9ktYF3SYPf3g8w58Bds19LdYLvAthy3BpsJMrmhBGxmP9gW7n0gNUwg9QrHwGpMQOyG6WA3M4FDRhVEPpAD28UG1rUXbOOSvQBYfJQC&text=часы&hid=15064473&allowCollapsing=1&local-offers-first=0"

r = requests.get(URL_TEMPLATE)

print(r.status_code)

-2

Запускаем код. Если в выводе получилось 200, то всё отлично, доступ получен, если нет, то нужно его настроить, о чём я расскажу в следующей части о парсинге. Подробно об ошибках доступа рассказано тут: тык!

Теперь нам надо взять данные с сайта, поэтому переходим на сайт и начинаем ВЕЛИКИЙ ПОИСК ИНФОРМАЦИИ. Для этого, находясь уже на странице откуда вы хотите взять данные, нажимаем кнопку F12 или Fn+F12. Откроется код странице, где есть вся информация в коде о странице. А чтобы найти нужный нам кусочек кода, придётся немного посидеть: поэтапно наводим курсор на куски кода, в этот момент на сайте периодически будут подсвечиваться различные элементы , как только видите, что подсвечивается область страницы, где нужная вам информация, то раскрываем этот кусочек кода и делаем так до тех пор, пока не будет подсвечиваться только нужная вам информация. Чтобы было чуть понятнее как это работает: представьте, что код - матрёшка, раскрывая которую слой за слоем мы приходим к нужной куколке.

Таким образом из этого:

-3

Я добрался до этого:

-4

Найдя нужный абзац, небходимо вычленить из него класс и тип нашего объекта, грубо говоря задать координаты поиска для нашего кода.( тип будет написан в самом начале строки, в моём случае h3, а класс после 'class =', в моём случае _2UHry _1Oi8a. Теперь развернём эту строку и посмотрим найдём в ней нужную информацию. Вот что добавится в наш код:

soup = bs(r.text, 'html.parser') - этой строкой мы считываем текст с html кода

v = soup.find_all('h3', class_='_2UHry _1Oi8a')

-5

Увидев родную кириллицу радуемся, что наконец нашли, что искали. Теперь нам снова нужно найти тип и класс, заметим, что начинается строка с тега 'a', а описание товара принадлежит 'title', через него и будем выводить информацию. Создаём небольшой перебор и выводим всё, что входит в наши теги. Должно это выглядеть так:

for name in v:
print(name.a['title'])

Смотрим вывод:

-6

Как видно, вывелся не 1 товар, а почти все. Но почему? Это связано с тем, что у всех товаров здесь одинаковые классы и теги, и это удобно, если нам нужно вывести все товары, но что если мы хотим вывести, например, все товары фирмы CASIO, тогда вначале программы создадим список: sp - [], строку print(name.a['title']) заменяем на sp.append(name.a['title']) и в конце программы допишем следующий оборот:

for i in sp:
if 'CASIO' in i:
print(i)

Теперь, программа сначала добавляет информацию о часах в список, а потом выводит только те элементы в которых есть CASIO. Смотрим что получилось:

-7

Весь код:

import requests
from bs4 import BeautifulSoup as bs
sp = []
URL_TEMPLATE = "https://market.yandex.ru/catalog--chasy/51960072/list?srnum=3339&was_redir=1&rt=9&rs=eJwzmswcwFjFwvH7BOssRo6L7Rc2XGy82H2UkYFh2k4g-WCyLZBc8MkKSCqs3Qsi5UCkA5cdkGzIA8kqJIPFJ-8BkgmqIPEFPCDxhFSQOMMesBpuEMlwczeInApiP0gBkQ2_wew7IPMP5IPUJ7wFqVHoBNviAxaZCDK54RXYJTZg8gZYTT1I_MFMG5CZiftB6hnAuhzALpEHiSfIgdgOL8Hu2Q6SPdAHEnfYBzbnvDXIhDcgkQM5YJfcAMu6g9ktYF3SYPf3g8w58Bds19LdYLvAthy3BpsJMrmhBGxmP9gW7n0gNUwg9QrHwGpMQOyG6WA3M4FDRhVEPpAD28UG1rUXbOOSvQBYfJQC&text=часы&hid=15064473&allowCollapsing=1&local-offers-first=0"
r = requests.get(URL_TEMPLATE)
print(r.status_code)
data = r.text
soup = bs(data, 'html.parser')
v = soup.find_all('h3', class_='_2UHry _1Oi8a')
for name in v:
#print(name.a['title'])
sp.append(name.a['title'])
#print(sp)
for i in sp:
if 'CASIO' in i:
print(i)

Вывод:

Получилась простая программа для сбора информации, которую вы с лёгкостью можете встроить в свой проект.

Всем удачи, и лёгкого кодинга