Соберите изображения Brave с помощью Python
- "Вступление"
- Что будет соскабливать
- Что такое смелый поиск
- Полный код
- "Подготовка"
- Пояснение кода
- "Выход"
- Ссылки
вступление
В настоящее время у нас нет API, поддерживающего извлечение данных из Brave Search.
Этот пост в блоге должен показать вам, как вы можете сделать это самостоятельно с помощью предоставленного ниже решения DIY, пока мы работаем над выпуском нашего надлежащего API.
Решение можно использовать для личного использования, так как оно не включает Юридический щит США, который мы предлагаем для наших платных производственных и выше планов, и имеет свои ограничения, такие как необходимость обхода блоков, например, CAPTCHA.
Вы можете проверить нашу общедоступную дорожную карту, чтобы отслеживать прогресс для этого 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
Создайте параметры 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' }
params
более красивый способ передачи параметров URL в запрос.content-type
для указания исходного медиатипа ресурса (до любой кодировки контента, примененной для отправки). В ответах заголовокContent-Type
предоставляет клиенту фактический тип возвращаемого контента.user-agent
действовать как настоящий пользовательский запрос от браузера, передавая его в заголовки запроса. По умолчаниюrequests
user-agent — этоpython-reqeusts
, чтобы веб-сайты могли понять, что это бот или скрипт, и заблокировать запрос к веб-сайту. Проверь, какой у тебяuser-agent
.
Создайте список 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"
Добавьте Запрос функции💫 или Ошибку🐞