Парсинг сайтов через питон

Устанавливаем и импортируем библиотеки в питон

pip install requests
pip install pandas
import requests
from bs4 import BeautifulSoup
import pandas as pd
from time import sleep

Переменной url присваиваем ссылку на страницу кинопоиска, в переменную r результат гет запроса к этой странице

url = "https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/"
r = requests.get(url)
Текстовое содержимое страницы сайта — r.text

Переведем содержимое страницы в формат кода

soup = BeautifulSoup(r.text, "lxml")
Содержимое переменной — soup
При помощи инспектора кода находим контейнеры с названием фильма, годом, названием на языке оригинала и баллом кинопоиска
russian_name = soup.find('div',class_ = "element").find('div', class_ = "info").find('a', class_ = "js-serp-metrika").text
russian_name
original_name = soup.find('div',class_ = "element").find('span', class_ = "gray").text
original_name
year = soup.find('div',class_ = "element").find('span', class_ = "year").text
year
kinopoisk = soup.find('div',class_ = "element").find('div', class_ = "rating").text
kinopoisk
Все данные по первому фильму встречающемуся на странице

Находим контейнер с кусочком кода и генерируем ссылку на фильм

link = "https://www.kinopoisk.ru" +soup.find('div',class_ = "element").find('div', class_ = "info").find('a').get("data-url")
link
Готовая ссылка на фильм и контейнер содержащий ссылку

Можно составить код, который сделает таблицу, содержащую все фильмы с данной таблицы

data = []
films =soup.findAll("div",class_ = "element")
for film in films:
    russian_name = film.find('div', class_ = "info").find('a', class_ = "js-serp-metrika").text
    original_name = film.find('span', class_ = "gray").text
    
    try:
        year = film.find('span', class_ = "year").text
    except:
        year = ""
    
    try:
        kinopoisk = film.find('div', class_ = "rating").text
    except:
        kinopoisk = ""
    
    link = "https://www.kinopoisk.ru" +film.find('div', class_ = "info").find('a').get("data-url")
  
    #print (russian_name)
    #print (original_name)
    #print (year)
    #print (kinopoisk)
    #print (link)
    data.append([russian_name, original_name,year,kinopoisk,link  ])
Содержимое таблицы data

Мы можем собрать все фильмы с одной страницы. Теперь нужно сделать цикл для сбора со всех страниц данного раздела. В этом разделе 11 страниц, значит нужен цикл для формирования списка страниц

for page in range(1,12):
    url = f"https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/order/relevant/page/{str(page)}/"
    print(url)
Результат выполнения цикла for с полученными страницами

Теперь можно дополнить весь код. Не забываем про слип, так как на многих сайтах стоит защита от парсинга

data = []

for page in range(1,12):
    url = f"https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/order/relevant/page/{str(page)}/"
    print(url)
    
    r = requests.get(url)
    sleep(40)
    soup = BeautifulSoup(r.text, "lxml")
    
    films = soup.findAll("div", class_ ="element")

    for film in films:
        
        russian_name = film.find("div", class_="info").find("a").text
       # print(russian_name)
    
        original_name = film.find("div", class_="info").find("span", class_="gray").text
    
        year = film.find("span", class_="year").text

        try:
            year = film.find("div", class_= "span").text
        except:
            year = ""
        
        try:
            rate = film.find("div", class_= "rating").text
        except:
            rate = ""
    
        link = "https://www.kinopoisk.ru"+film.find("div", class_="info").find("a").get("data-url")
    
        data.append([russian_name, original_name, year, link])
По мере прохождения страниц, будут печатаются страницы на которых находится сейчас робот

Делаем заголовки таблицы и выгружаем в файл csv

header = ['russian_name', 'original_name', 'year', 'link']
df = pd.DataFrame(data, columns = header)
df.head()

df.to_csv("d:\data_kino.csv")
получившаяся таблица с выгрузкой

Можно и в питоне получить список всех ссылок на фильмы, работая с таблицей

for i in data:
    #print (i)
    link = i[3]
    print (link)
Вебинар курса «Веб-скрейпинг для журналистов. С программированием и без». Используется среда разработки Анаконда.
Отправить
Поделиться
Твитнуть
Запинить

Считаю метрики, делаю сквозную аналитику и когортный анализ, составляю интерактивные дешборды, моделирую юнит-экономику


Обратиться с задачей