Соберите изображения Brave с помощью Python

вступление

В настоящее время у нас нет API, поддерживающего извлечение данных из Brave Search.

Этот пост в блоге должен показать вам, как вы можете сделать это самостоятельно с помощью предоставленного ниже решения DIY, пока мы работаем над выпуском нашего надлежащего API.

Решение можно использовать для личного использования, так как оно не включает Юридический щит США, который мы предлагаем для наших платных производственных и выше планов, и имеет свои ограничения, такие как необходимость обхода блоков, например, CAPTCHA.

Вы можете проверить нашу общедоступную дорожную карту, чтобы отслеживать прогресс для этого API:

[Новый API] Храбрый поиск

Что будет очищено

Что такое смелый поиск

В предыдущем сообщении в блоге Brave ранее описывалось что такое Brave search. Во избежание дублирования контента эта информация не упоминается в этом сообщении блога.

Полный код

Если вам не нужны объяснения, посмотрите полный пример кода в онлайн-IDE.

import requests, json


def scrape_brave_images():
    # https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
    params = {
        'q': 'dune 2021',       # query 
        'source': 'web',        # source 
        'size': 'All',          # size (Small, Medium, Large, Wallpaper) 
        '_type': 'All',         # type (Photo, Clipart, AnimatedGifHttps, Transparent) 
        'layout': 'All',        # layout (Square, Tall, Wide) 
        'color': 'All',         # colors (Monochrome, ColorOnly, Red etc) 
        'license': 'All',       # license (Public, Share, Modify etc)
        'offset': 0
    }

    # https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
    headers = {
        'content-type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }

    data = []
    old_page_result = []

    while True:
        html = requests.get('https://search.brave.com/api/images', headers=headers, params=params).json()

        new_page_result = html['results']

        if new_page_result == old_page_result:
            break

        for result in new_page_result:
            data.append({
                'title': result.get('title'),
                'link': result.get('url'),
                'source': result.get('source'),
                'width': result.get('properties').get('width'),
                'height': result.get('properties').get('height'),
                'image': result.get('properties').get('url')
            })

        params['offset'] += 151
        old_page_result = new_page_result

    return data


if __name__ == "__main__":
    brave_images = scrape_brave_images()
    print(json.dumps(brave_images, indent=2))

Подготовка

Установите библиотеки:

pip install requests

Уменьшить вероятность блокировки

Убедитесь, что вы используете заголовки запроса user-agent, чтобы действовать как настоящий визит пользователя. Потому что по умолчанию requests user-agent равно python-requests, и веб-сайты понимают, что это, скорее всего, скрипт, который отправляет запрос. Проверь, какой у тебя user-agent.

Есть как уменьшить вероятность блокировки при парсинге поста в блоге, который может познакомить вас с базовыми и более продвинутыми подходами.

Код Пояснение

Импортировать библиотеки:

import requests, json
  • requestsсделать запрос на сайт.
  • jsonдля преобразования извлеченных данных в объект JSON.

Создайте параметры URL и заголовки запроса:

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    'q': 'dune 2021',       # query 
    'source': 'web',        # source 
    'size': 'All',          # size (Small, Medium, Large, Wallpaper) 
    '_type': 'All',         # type (Photo, Clipart, AnimatedGifHttps, Transparent) 
    'layout': 'All',        # layout (Square, Tall, Wide) 
    'color': 'All',         # colors (Monochrome, ColorOnly, Red etc) 
    'license': 'All',       # license (Public, Share, Modify etc)
    'offset': 0
}

# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
headers = {
    'content-type': 'application/json',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}

Создайте список data для хранения всех данных и список old_page_result, который нам понадобится позже:

data = []
old_page_result = []

Чтобы очистить изображения Brave с нумерацией страниц, вам нужно использовать параметр offset URL-адреса, который по умолчанию равен 0 для первой страницы, 151 для второй и так далее. Поскольку данные извлекаются со всех страниц, необходимо реализовать цикл while:

while True:
    # pagination will be here

В каждой итерации цикла нужно делать запрос к Brave API, передавать созданные параметры запроса и заголовки. С помощью метода json() ответ преобразуется в JSON-объект для дальнейшей работы:

html = requests.get('https://search.brave.com/api/images', headers=headers, params=params).json()

Список new_page_result содержит все результаты на текущей странице. Список new_page_result сравнивается со списком old_page_result. Если они совпадают, то это значит, что мы дошли до последней страницы и новых данных больше нет. Поэтому вам нужно break цикл:

new_page_result = html['results']

if new_page_result == old_page_result:
    break

📌Примечание: в первой итерации цикла в списке old_page_result нет данных. Поэтому проверка не пройдет.

Перебирая список new_page_result в цикле for, вы можете получить данные. Для каждого результата извлекаются такие данные, как title, link, source, width, height и image:

for result in new_page_result:
    data.append({
        'title': result.get('title'),
        'link': result.get('url'),
        'source': result.get('source'),
        'width': result.get('properties').get('width'),
        'height': result.get('properties').get('height'),
        'image': result.get('properties').get('url')
    })

📌Примечание: ключ image содержит изображение в полном разрешении.

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

params['offset'] += 151

Более наглядно это показано на GIF ниже:

На каждой итерации данные из списка new_page_result будут записываться в список old_page_result до тех пор, пока они не станут одинаковыми:

old_page_result = new_page_result

Выход

[
  {
    "title": "Dune (2021) | The Poster Database (TPDb)",
    "link": "https://theposterdb.com/posters/42710?page=2",
    "source": "theposterdb.com",
    "width": 1365,
    "height": 2048,
    "image": "https://image.tmdb.org/t/p/original/2sxSn0jjjQoIIZfZjC6j5GZkMVR.jpg"
  },
  {
    "title": "Dune (2021) - Posters \u2014 The Movie Database (TMDB)",
    "link": "https://www.themoviedb.org/movie/438631-dune/images/posters",
    "source": "The Movie Database",
    "width": 2000,
    "height": 3000,
    "image": "https://www.themoviedb.org/t/p/original/7S56MF6XA1jIzD9I2ejMjd6aNvN.jpg"
  },
  {
    "title": "Dune (2021) - Posters \u2014 The Movie Database (TMDb)",
    "link": "https://www.themoviedb.org/movie/438631-dune/images/posters",
    "source": "The Movie Database",
    "width": 956,
    "height": 1333,
    "image": "https://www.themoviedb.org/t/p/original/AqjrlcNRSKx84CeNJyNueg6V1SR.jpg"
  },
  {
    "title": "Dune - Pel\u00edcula 2021 - SensaCine.com",
    "link": "http://www.sensacine.com/peliculas/pelicula-133392/",
    "source": "Sensacine",
    "width": 600,
    "height": 800,
    "image": "http://es.web.img2.acsta.net/pictures/20/04/15/09/53/3283826.jpg"
  },
  {
    "title": "DUNE 2021 Movie Poster : dune",
    "link": "https://www.reddit.com/r/dune/comments/kh9som/dune_2021_movie_poster/",
    "source": "reddit.com",
    "width": 1890,
    "height": 2800,
    "image": "https://preview.redd.it/3fl2s0q1ug661.jpg?auto=webp&s=ed5e4418f962103b0d47b5b466036d7b40aa761b"
  },
  ... other images
]

Ссылки

Первоначально опубликовано на SerpApi: https://serpapi.com/blog/scrape-brave-images-with-python/

Присоединяйтесь к нам в Твиттере | "YouTube"

Добавьте Запрос функции💫 или Ошибку🐞