В качестве предисловия я хотел бы сделать скребок для твиттера, который сможет обновлять меня по новым твитам быстрее, чем твик-палуба, и быстрее, чем может предоставить потоковый 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 верхних твита соответствующей временной шкалы,Если я отправляю твит во время работы программы, вывод не отражает новый твит до тех пор, пока программа не остановится, и я не запущу его снова.