Как очистить/загрузить все изображения Tumblr с определенным тегом

Я пытаюсь загрузить много (1000) изображений с tumblr с определенным тегом (например, #art). Я пытаюсь найти самый быстрый и простой способ сделать это. Я рассматривал как scrapy, так и puppeteer в качестве вариантов, и я немного читал об API tumblr, но я не уверен, как использовать API для локальной загрузки изображений, которые я хочу. В настоящее время puppeteer кажется лучшим способом, но я не уверен, как справиться с тем фактом, что tumblr использует ленивую загрузку (например, каков код для получения всех изображений, прокрутки вниз, ожидания загрузки изображений и получения эти) Был бы признателен за любые советы!

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

harada 14.12.2020 18:19

Харада спасибо! Я никогда не использовал API tumblr, не могли бы вы дать мне более конкретные инструкции?

gollyzoom 15.12.2020 23:18
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скрейпинг становится все более популярным и сегодня является одной из актуальных тем в IT-сообществе. В результате несколько библиотек помогают...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
1
2
1 932
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я рекомендую вам использовать Tumblr API, поэтому вот несколько инструкций о том, как это сделать.

  1. Ознакомьтесь с разделом What You Need документации.
  2. Читайте в разделе Получать посты с тегом
  3. Рассмотрите возможность использования библиотеки, такой как PyTumblr.
import pytumblr

list_of_all_posts = []

# Authenticate via OAuth
client = pytumblr.TumblrRestClient(
    'YOUR KEY HERE'
)

def get_art_posts():
    posts = client.tagged('art', **params) # returns HTML of 20 most recent posts in the tag
    # use params (shown in tumblr documentation) to change the timestamp of limit of the posts
    # i.e. to only posts before a certain time
    return posts

 list_of_all_posts.append(get_art_posts())

Я довольно ржавый с Tumblr API, не буду врать. Но документация поддерживается в актуальном состоянии. Когда у вас будет HTML-код поста, там будет ссылка на изображения. Существует множество библиотек, таких как Beautiful Soup, которые могут извлекать изображения из HTML с помощью своих селекторов CSS. Надеюсь, это помогло!

Спасибо Харада! Это очень полезно. На самом деле я начал работать над реализацией pytumblr, но у меня проблемы с получением более 20 сообщений - похоже, что client.tagged не имеет параметра смещения? когда я пытаюсь добавить смещение, я получаю сообщение об ошибке «смещение не разрешено». Вы знаете, как обойти это?

gollyzoom 16.12.2020 00:31

@gollyzoom Я рад, что pytumblr работает на вас. Похоже, вы сами позаботились об ограничении в 20 сообщений. Удачи с проектом!

harada 16.12.2020 01:56
Ответ принят как подходящий

Мое решение ниже. Поскольку я не мог использовать смещение, вместо этого я использовал временные метки каждого сообщения в качестве смещения. Поскольку я пытался специально получить ссылки на изображения в сообщениях, я также немного обработал вывод. Затем я использовал простой скрипт Python для загрузки каждого изображения из моего списка ссылок. Я включил веб-сайт и дополнительный пост о переполнении стека, который я нашел полезным.

import pytumblr

def get_all_posts(client, blog):
    offset = None

    for i in range(48):
        #response = client.posts(blog, limit=20, offset=offset, reblog_info=True, notes_info=True)

        response = client.tagged('YOUR TAG HERE', limit=20, before=offset)
        for post in response:
            #    for post in response:
            if ('photos' not in post):
                #print(post)
                if ('body' in post):
                    body = post['body']
                    body = body.split('<')
                    body = [b for b in body if 'img src=' in b]
                    if (body):
                        body = body[0].split('"')
                        print(body[1])
                        yield body[1]
                    else:
                        yield
            else:
                print(post['photos'][0]['original_size']['url'])
                yield post['photos'][0]['original_size']['url']

        # move to the next offset
        offset = response[-1]['timestamp']
    print(offset)

client = pytumblr.TumblrRestClient('USE YOUR API KEY HERE')

blog = 'staff'

# use our function
with open('{}-posts.txt'.format(blog), 'w') as out_file:
    for post in get_all_posts(client, blog):
        print(post, file=out_file)

Ссылки:

https://64.media.tumblr.com/9f6b4d8d15caffe88c5877cd2fb31726/8882b6bec4975045-23/s540x810/49586f5b05e8661d77e370845d01b34f0f5f2ca6.png

Распечатать более 20 постов из Tumblr API

Также большое спасибо Хараде, чьи советы очень помогли!

Другие вопросы по теме