Проблема с парсингом unsplash.com

Рейтинг: 0Ответов: 2Опубликовано: 09.08.2023

Доброго времени суток всем. Осваиваю python и в качестве практики и надобности решил написать парсер, который по введенному тегу(запросу поисковика на сайте), собирал бесплатные картинки наиболее близкие к требуемому мной разрешении с сайта unsplash.com. Я решил реализовать это получая ссылки на личные страницы карточек, а уже затем на них проверять разрешение и скачивать. Прилагаю скриншоты: Страница выдает карточки по запросу Личная страница карточки

Собрать ссылки со страницы запроса на странницы карточек у меня вышло, как и спарсить, сохранив их в файл(хотя я еще не очень разобрался с пагинацией, тч собираю лишь часть карточек).

Суть проблемы: В сохраненных мною страницах не открывается сайдбар(кнопка download - второй скриншот), где и располагаются ссылки на скачивание в различном разрешении, хотя при открытии на сайте все работает. Я отследил, что при этом меняет один атрибут тега(выделен на скриншоте), после чего в пустом div появляютс теги откуда и можно всязть необходимую мне инфу:когда сайдбар закрыт - false, открыт true Я пытался реализовать это так:

def download_images(headers, base_url, im_urls):
    # Iterate through pages and save them to files
    cnt = 1
    for im_url in im_urls:
        src = scraping_and_saving_page(headers, base_url, im_url)
        im_page = bs(src, 'lxml')
        if not sub_stat(im_page):
            try:
                button = im_page.find(class_='slPFO DQBsa p1cWU jpBZ0 EzsBC KHq0c zhYdL I0aPD dEcXu cMuzD jpBZ0')
                button.attrs['aria_expanded'] = 'true'
                im_resolutions = im_page.find('div', class_="KeJv5 voTTC").find('div', class_="jl4QA").find_all('span', class_="HoCsv").text().strip()
            except TypeError:
                print(f"{cnt}: {im_url} __Sidebar not found__")
        cnt += 1

В этой функции я обрабатываю список ссылок через requests, скачивая их и изменяю тег атрибута на true, чтобы затем в блоке try-except забрать инфу из динамически появляющегося div, но этого не происходит

PS: Я думал, что это может быть связано с отправкой запроса на сервер. Частично это так - запросы исходят, но ничего интересного в вкладке сеть не происходит

Заранее хочу поблагодарить всех людей, которые уделили время на помощь в решение моей проблемы. Надеюсь, что информации, которую я предоставил, было достаточно :)

Ответы

▲ 0Принят
import requests

per_page = 30
page = 1
while True:
    params = {
        'query': 'rain',
        'per_page': per_page,
        'page': page,
        #'plus': 'none',
        'xp': 'search-synonym-replica:control',
    }

    response = requests.get('https://unsplash.com/napi/search/photos', params=params)

    if not response.json()['results']:
        break
    page += 1

    for x in response.json()['results']:
        url = f"https://unsplash.com/photos/{x['id']}/download"
        for z, y in ('', 'original'), ('?&w=640', 'small'), ('?&h=1920', 'medium'), ('?&w=2400', 'large'):
            with open(f"image/{x['id']}_{y}.jpg", "wb") as f:
                f.write(requests.get(url+z).content)
▲ 0

Как написал @mister_svinia, selenium покрыл необходимые требования Сохранение html в файл необходимо делать после имитации открытия сайдбара страницы selenium'ом. Так же решается проблема с пагинацией картинок.

PS: возможно позже прикреплю код, вдруг кому будет полезен пример имитации скролла не из документации