помогите оптимизировать мой код
Я сделал код который по id участника вернёт словарь, где ключами является n репутации, а значение количество ответов имеющие такое количество репутации
Для некоторых пользователей у которых большое количество ответов программа выполняется долго, как это исправить?
как его можно оптимизировать?
import requests
from bs4 import BeautifulSoup as BS
def get_count(url):
page = requests.get(url)
soup = BS(page.text, "html.parser")
pages = soup.find_all("a", class_ = "s-pagination--item")
return int(max(pages, key = lambda x: int(x.text) if x.text.isdigit() else -1).text)
def get_rep(url):
page = requests.get(url)
soup = BS(page.text, "html.parser")
votes = soup.find_all("div", class_ = "answer-votes")
return map(lambda x: int(x.text.strip()), votes)
id = "2"
url = "https://ru.stackoverflow.com/users/" + id + "?tab=answers&sort=newest&page={}"
dict_ = {}
count = get_count(url.format(0))
for i in range(1, count + 1):
for rep in get_rep(url.format(i)):
if rep in dict_:
dict_[rep] += 1
else:
dict_[rep] = 1
print("\033[H\033[J")
for key, value in sorted(list(dict_.items()), reverse = True):
print(f"{key}: {value}"
Ответы (1 шт):
Автор решения: Namerek
→ Ссылка
Ну как то вот так попробуйте, только не удивляйтесь если ваш IP заблокируют на SO
from multiprocessing import get_context
def get_count(url):
import requests
from bs4 import BeautifulSoup as Soup
page = requests.get(url)
soup = Soup(page.text, "html.parser")
pages = soup.find_all("a", class_="s-pagination--item")
return int(max(pages, key=lambda x: int(x.text) if x.text.isdigit() else -1).text)
def get_rep(url_):
import requests
from bs4 import BeautifulSoup as Soup
page = requests.get(url_)
soup = Soup(page.text, "html.parser")
votes = soup.find_all("div", class_="answer-votes")
return [*map(lambda x: int(x.text.strip()), votes)]
id_ = "2"
url = "https://ru.stackoverflow.com/users/" + id_ + "?tab=answers&sort=newest&page={}"
dict_ = {}
count = get_count(url.format(0))
def update_rep(iter_):
for rep in iter_:
if rep in dict_:
dict_[rep] += 1
else:
dict_[rep] = 1
if __name__ == '__main__':
with get_context('spawn').Pool(10) as pool:
for prep in pool.imap_unordered(get_rep, [url.format(i) for i in range(1, count + 1)]):
update_rep(prep)
for key, value in sorted(list(dict_.items()), reverse=True):
print(f"{key}: {value}")
print("\033[H\033[J")
pool.close()
pool.join()