Извлечение данных из Pinterest отличается от большинства работ по скраппингу HTML. Pinterest генерирует весь свой контент динамически и не оставляет на странице никаких структур данных, например JSON.
Если вы решите продолжить, то узнаете, как собирать данные о Pinterest с помощью следующих методов:
- Извлечение данных из Pinterest с помощью Playwright
- Извлечение данных о Pinterest с помощью API-скребка Bright Data
Что вы можете извлечь?
Если вы посмотрите на Pinterest в браузере, все пины глубоко вложены внутрь элемента div
с data-test-id="pinWrapper"
.
Если мы найдем все эти объекты на странице, то сможем извлечь все их данные, например:
- Название каждой булавки.
- url, указывающий непосредственно на булавку.
- Изображение булавки из результатов поиска.
Скраппинг Pinterest с драматургом
Начало работы
В Python есть множество отличных библиотек для скраппинга, и мы будем использовать Playwright. Во-первых, вам нужно убедиться, что Playwright установлен. Вы можете посмотреть их документацию здесь. Playwright – один из лучших безголовых браузеров.
Инсталлировать драматурга
pip install playwright
Установите браузеры для драматургов
playwright install
Соскабливание булавок
Теперь давайте рассмотрим, как извлечь реальные пины из Pinterest. В приведенном ниже коде мы создаем две функции, scrape_pins()
и main()
. scrape_pins()
открывает браузер и извлекает данные из Pinterest. main()
используется как точка входа для асинхронного времени выполнения.
import asyncio
from playwright.async_api import async_playwright
import json
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
async def scrape_pins(query):
search_url = f"https://www.pinterest.com/search/pins/?q={query}&rs=typed"
scraped_data = []
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page(user_agent=user_agent)
response = await page.goto(search_url)
await asyncio.sleep(2)
try:
#find the pins on the page
pins = await page.query_selector_all("div[data-test-id='pinWrapper']")
#iterate through the pins and extract data
for pin in pins:
title_link = await pin.query_selector("a")
pin_url = await title_link.get_attribute("href")
title = await title_link.get_attribute("aria-label")
img = await title_link.query_selector("img")
img_src = await img.get_attribute("src")
extracted_data = {
"title": title,
"url": pin_url,
"img": img_src
}
#add the data to our results
scraped_data.append(extracted_data)
except:
print(f"Failed to scrape pins at {search_url}")
finally:
await browser.close()
#everything has finished, return our scraped data
return scraped_data
async def main():
search_query = "office"
office_results = await scrape_pins(search_query)
with open(f"{search_query}-results.json", "w") as file:
try:
json.dump(office_results, file, indent=4)
except Exception as e:
print(f"Failed to save results: {e}")
if __name__ == "__main__":
asyncio.run(main())
Функция scrape_pins()
выполняет следующие действия в процессе поиска:
- Создайте наш url:
search_url
. - Создайте массив для хранения наших результатов,
scraped_data
. - Откройте новый экземпляр браузера.
- Установите пользовательский
user_agent
, чтобы работать в режиме headless. Без него Pinterest будет нас блокировать. - Мы ждем две секунды, пока содержимое загрузится с помощью
asyncio.sleep(2).
- Мы находим все видимые пины на странице с помощью этого селектора:
div[data-test-id='pinWrapper']
. - Для каждого пина мы извлекаем следующие данные:
название
: Название булавки.url
: url, ведущий непосредственно к контакту.img
: Изображение булавки, отображаемое в результатах поиска.
Вот несколько примеров данных из приведенного выше скребка Playwright.
[
{
"title": "A minimalist office featuring a soothing color palette of whites, greys, and natural wood accents, creating a calm and spacious feel3",
"url": "/pin/10203536650743650/",
"img": "https://i.pinimg.com/236x/b3/21/e2/b321e2485da40c0dde2685c3a4fdcb56.jpg"
},
{
"title": "a home office with two desks and an open door that leads to the outside",
"url": "/pin/261912534574291013/",
"img": "https://i.pinimg.com/236x/56/f1/29/56f129512885e1b3c9971b16f9445c9a.jpg"
},
{
"title": "home office decor, blakc home office, dark home office, moody home office, small home office",
"url": "/pin/60094976273327121/",
"img": "https://i.pinimg.com/236x/ba/75/c9/ba75c9be7e635cce3ee80acdf70d6f9f.jpg"
},
{
"title": "an office with a desk, chair and bookshelf in the middle of it",
"url": "/pin/599682506666665720/",
"img": "https://i.pinimg.com/236x/57/66/1d/57661dc80bebda3dfe946c070ee8ed13.jpg"
},
{
"title": "a home office with green walls and plants on the shelves, along with a computer desk",
"url": "/pin/1147080967585091410/",
"img": "https://i.pinimg.com/236x/ce/e8/b7/cee8b74151b29605a80e0f61898c249d.jpg"
},
Скраппинг Pinterest с помощью API Bright Data Scraper
С нашим Pinterest Scraper API вы можете полностью автоматизировать этот процесс, и вам не придется беспокоиться о безголовых браузерах, селекторах или чем-то еще!
Убедитесь, что у вас установлен Python Requests.
Запросы на установку
pip install requests
После того как вы настроили вызов API, вы можете запускать его из Python. Ниже у нас также есть две функции: get_pins()
и poll_and_retrieve_snapshot()
.
get_pins()
: Эта функция принимаетключевое слово
вместе с вашимapi_key
. Затем она создает и отправляет запрос на наш API-скребок. Этот запрос запускает поиск в Pinterest по нужному ключевому слову.Функция poll_and_retrieve_snapshot()
принимает вашapi_key
иsnapshot_id
. Затем каждые 10 секунд она проверяет, готов ли снимок. Как только снимок готов, данные загружаются, и мы выходим из функции.
import requests
import json
import time
#function to trigger the scrape
def get_pins(api_key, keyword):
url = "https://api.brightdata.com/datasets/v3/trigger"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
}
params = {
"dataset_id": "gd_lk0sjs4d21kdr7cnlv",
"include_errors": "true",
"type": "discover_new",
"discover_by": "keyword",
}
data = [
{"keyword":keyword},
]
#trigger the scrape
response = requests.post(url, headers=headers, params=params, json=data)
#return the snapshot_id
return response.json()["snapshot_id"]
def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file="snapshot-data.json"):
#create the snapshot url
snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
headers = {
"Authorization": f"Bearer {api_key}"
}
print(f"Polling snapshot for ID: {snapshot_id}...")
while True:
response = requests.get(snapshot_url, headers=headers)
if response.status_code == 200:
print("Snapshot is ready. Downloading...")
snapshot_data = response.json()
#write the snapshot to a new json file
with open(output_file, "w", encoding="utf-8") as file:
json.dump(snapshot_data, file, indent=4)
print(f"Snapshot saved to {output_file}")
break
elif response.status_code == 202:
print("Snapshot is not ready yet. Retrying in 10 seconds...")
else:
print(f"Error: {response.status_code}")
print(response.text)
break
time.sleep(10)
if __name__ == "__main__":
API_KEY = "YOUR-BRIGHT-DATA-API-KEY"
KEYWORD = "office"
snapshot_id = get_pins(API_KEY, KEYWORD)
poll_and_retrieve_snapshot(API_KEY, snapshot_id)
Вот несколько примеров данных из загруженного файла. Поскольку наш запрос триггера имел значение "include_errors": "true"
, в файл также были включены пины с ошибками. Приведенный ниже пример данных включает два пина с ошибками, а также два пина с хорошими данными.
[
{
"post_type": null,
"timestamp": "2025-02-17T15:26:17.248Z",
"input": {
"url": "https://www.pinterest.com/pin/jh46IGe2",
"discovery_input": {
"keyword": "office"
}
},
"warning": "Bad input. Wrong id!",
"warning_code": "dead_page",
"discovery_input": {
"keyword": "office"
}
},
{
"post_type": null,
"timestamp": "2025-02-17T15:26:18.757Z",
"input": {
"url": "https://www.pinterest.com/pin/4471026676503806548",
"discovery_input": {
"keyword": "office"
}
},
"warning": "Bad input. Page does not exist.",
"warning_code": "dead_page",
"discovery_input": {
"keyword": "office"
}
},
{
"url": "https://www.pinterest.com/pin/929782285570058239",
"post_id": "929782285570058239",
"title": "Essential Tips for Designing a Functional Small Office Space: Maximize Efficiency",
"content": "17 Smart Tips for Designing a Productive Small Office Space",
"date_posted": "2025-02-06T15:00:47.000Z",
"user_name": "wellnesswink",
"user_url": "https://www.pinterest.com/wellnesswink",
"user_id": "929782422978147260",
"followers": 232,
"likes": 0,
"categories": [
"Explore",
"Home Decor"
],
"attached_files": [
"https://i.pinimg.com/originals/c8/c0/d5/c8c0d5fb45352e40535db4510049a142.jpg"
],
"image_video_url": "https://i.pinimg.com/originals/c8/c0/d5/c8c0d5fb45352e40535db4510049a142.jpg",
"video_length": 0,
"post_type": "image",
"comments_num": 0,
"discovery_input": {
"keyword": "office"
},
"timestamp": "2025-02-17T15:26:19.502Z",
"input": {
"url": "https://www.pinterest.com/pin/929782285570058239",
"discovery_input": {
"keyword": "office"
}
}
},
{
"url": "https://www.pinterest.com/pin/889812838892568569",
"post_id": "889812838892568569",
"title": "20 Modern Masculine Home Office Design Ideas for Men",
"content": "Explore 25 chic home office decor ideas that blend style and functionality. Create a workspace you love and boost your productivity effortlessly!",
"date_posted": "2025-01-27T07:11:38.000Z",
"user_name": "artfullhouses",
"user_url": "https://www.pinterest.com/artfullhouses",
"user_id": "889812976285233957",
"followers": 10,
"likes": 0,
"categories": [
"Explore",
"Home Decor"
],
"attached_files": [
"https://i.pinimg.com/originals/f1/cb/f7/f1cbf7b127db2bef2306ba19ffcc0646.png"
],
"image_video_url": "https://i.pinimg.com/originals/f1/cb/f7/f1cbf7b127db2bef2306ba19ffcc0646.png",
"video_length": 0,
"hashtags": [
"Mens Desk Decor",
"Chic Home Office Decor",
"Mens Desk",
"Home Office Ideas For Men",
"Office Ideas For Men",
"Masculine Home Office Ideas",
"Masculine Home Office",
"Masculine Home",
"Chic Home Office"
],
"post_type": "image",
"comments_num": 0,
"discovery_input": {
"keyword": "office"
},
"timestamp": "2025-02-17T15:26:20.069Z",
"input": {
"url": "https://www.pinterest.com/pin/889812838892568569",
"discovery_input": {
"keyword": "office"
}
}
},
Как видите, API Scraper собирает гораздо больше данных, чем первоначальный скребок, который мы создали с помощью Playwright. Наш API просматривает Pinterest по ключевому слову
, а затем собирает все отдельные пины, которые он находит в процессе просмотра.
Удобство – не единственное преимущество такого подхода. Наш Pinterest Scraper API извлекает ваши данные по крайне низкой цене. Наш общий файл результатов составил почти 45 000 строк, а его создание обошлось всего в $0,97.
Нанять кого-то для создания скрепера такого же качества, скорее всего, будет стоить несколько сотен долларов, и вам придется ждать своих данных несколько дней. С нашим API-скрепером вы получите данные в считанные минуты и всего за долю стоимости.
Заключение
Извлечение данных из Pinterest не обязательно должно быть сложным. Создадите ли вы собственный скрепер с помощью Playwright или выберете полностью автоматизированное решение, такое как наш Pinterest Scraper, правильный подход зависит от ваших потребностей.
Для быстрого, надежного и масштабируемого извлечения данных о Pinterest API скрепера Bright Data устраняет проблемы, связанные с работой с безголовыми браузерами, прокси и CAPTCHA – структурированные данные предоставляются без особых усилий.
✅ Быстрее результаты – получайте данные за минуты, а не за часы
✅ Экономичность – платите только за то, что извлекаете.
✅ Никакого обслуживания – Избегайте блокировки запросов
Начните бесплатную пробную версию сегодня и упростите работу с Pinterest с помощью API Web Scraper от Bright Data!
Кредитная карта не требуется