Цикл PRAW с исключениями HTTP

Я использую скрипт Python для просмотра списка субреддитов и извлечения их сообщений. Однако список длинный, и иногда там будут ошибки 403, 404 и т. д. Я пытаюсь обойти те, которые дают ошибки, но пока не смог этого сделать. Код ниже.

Я использую список сабреддитов и praw, чтобы извлекать из них. Однако список довольно длинный, и иногда субреддит в нем будет удален, что приведет к исключению HTTP (403, 404 и т. д.). Мой код ниже, кто-нибудь знает одну или две строки, которые я могу вставить, чтобы пропустить те, которые дают ошибки?

df = pd.read_csv('reddits.csv', sep = ',')
df.head()

Submission = namedtuple('Submission', ['time', 'score', 'title', 'text', 'author', 'comments', 'url', 'domain', 'permalink', 'ups', 'downs', 'likes', 'crosspost', 'duplicates', 'views'])
data = []

for i in df.reddits:
    subreddit = reddit.subreddit(i)
    for submission in subreddit.new(limit=10):
            time = datetime.utcfromtimestamp(submission.created_utc)
            score = submission.score
            title = submission.title
            text = submission.selftext
            author = submission.author
            comments = submission.num_comments
            url = submission.url
            domain = submission.domain
            permalink = submission.permalink
            ups = submission.ups
            downs = submission.downs
            likes = submission.likes
            crosspost = submission.num_crossposts
            duplicates = submission.num_duplicates
            views = submission.view_count
            data.append(Submission(time, score, title, text, author, comments, url, domain, permalink, ups, downs, likes, crosspost, duplicates, views))
    df = pd.DataFrame(data)
    os.chdir('wd')
    filename = i + str(datetime.now()) + '.csv'
    df.to_csv(filename, index=False, encoding='utf-8')

person dhrice    schedule 29.10.2020    source источник
comment
какая строка вызывает исключение? Короткий ответ — поместить эту строку в блок try: и ничего не делать (или, что еще лучше, записать что-нибудь полезное) в блок except.   -  person Ben    schedule 29.10.2020
comment
Это субреддит = reddit.subreddit(i). Я знаю, почему он выдает ошибку, список субреддитов не полностью обновлен и содержит некоторые старые субреддиты. Я просто хочу продолжить мимо тех, кто в списке. Некоторые поиски указывают на то, что continue: будет подходящей командой, но я не уверен, куда ее вставить.   -  person dhrice    schedule 30.10.2020


Ответы (1)


Вам нужно поймать исключение, тогда вы можете continue

df = pd.read_csv('reddits.csv', sep = ',')
df.head()

Submission = namedtuple('Submission', ['time', 'score', 'title', 'text', 'author', 'comments', 'url', 'domain', 'permalink', 'ups', 'downs', 'likes', 'crosspost', 'duplicates', 'views'])
data = []

for i in df.reddits:
    try:
        subreddit = reddit.subreddit(i)
    except HTTPError as e:
        print(f"Got {e} retrieving {subreddit}")
        continue # control passes back to next iteration of outer loop
    for submission in subreddit.new(limit=10):
        submission = Submission(
            datetime.utcfromtimestamp(submission.created_utc),
            submission.score,
            submission.title,
            submission.selftext,
            submission.author,
            submission.num_comments,
            submission.url,
            submission.domain,
            submission.permalink,
            submission.ups,
            submission.downs,
            submission.likes,
            submission.num_crossposts,
            submission.num_duplicates,
            submission.view_count,
        )
        data.append(submission)
    df = pd.DataFrame(data)
    os.chdir('wd')
    filename = i + str(datetime.now()) + '.csv'
    df.to_csv(filename, index=False, encoding='utf-8')

также, несвязанный: i не является хорошим именем для значения; он традиционно обозначает индекс, который там не содержится. e будет соответствующим общим именем, обозначающим элемент, но reddit будет идиоматическим выбором в python.

person Ben    schedule 30.10.2020