Отправка асинхронных запросов в твиттер с помощью aiohttp не обновляется при публикации нового твита? - PullRequest
0 голосов
/ 15 октября 2019

В качестве предисловия я хотел бы сделать скребок для твиттера, который сможет обновлять меня по новым твитам быстрее, чем твик-палуба, и быстрее, чем может предоставить потоковый API. Когда я делаю запросы к странице, которую я пытаюсь отслеживать для новых твитов, программа не изменяет свой вывод, когда новый твит публикуется, как это должно быть. В настоящее время мой код должен сделать несколько асинхронных запросов к https://twitter.com/username, и он возвращает два верхних твита (включая закрепленный твит). Как я могу настроить свои запросы так, чтобы страница обновлялась новым твитом во время работы программы?

Я все еще пытаюсь понять библиотеку aiohttp, так что я не смог настроить что-то особенноеи иметь какой-либо успех.

import requests
import re
import time
import aiohttp
import asyncio
from bs4 import BeautifulSoup as bs

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()


# takes a url, and takes number of tweets to print
async def get_recent(username, n):
    base_link = 'https://twitter.com'
    url = base_link + '/' + username
    async with aiohttp.ClientSession() as session:
        data_text = await fetch(session, url)
    # data = requests.get(url)
    recent_tweets = []
    html = bs(data_text, 'html.parser')
    # get timeline
    timeline = html.select('#timeline li.stream-item')

    # DEBUG makes a file to see the exact html we're working with, but
    # formatted nicely. Uncomment the next two lines to do so.

    # with open('html.html', 'w', encoding='utf-8') as f_out:
        # f_out.write(html.prettify())

    for tweet in timeline[:n]:
        PARSE STUFF [deleted for clarity]

        # output to a list of dictionaries

        recent_tweets.append({"id": tweet_id, "text": tweet_text, "link_to_tweet": tweet_link, "links": in_tweet_links, "link_to_pic": pic_link})


    print(recent_tweets)

, а затем в моей основной функции

loop = asyncio.get_event_loop()
    all_groups = asyncio.gather(*[get_recent('username', 2) for _ in range(20)])
    results = loop.run_until_complete(all_groups)

Насколько я понимаю, это должно сделать 20 запросов и дать мне 2 верхних твита соответствующей временной шкалы,Если я отправляю твит во время работы программы, вывод не отражает новый твит до тех пор, пока программа не остановится, и я не запущу его снова.

...