Как ускорить парсер Аватарок?
Я практиковался в мнопоточности и решил сделать парсер аватарок. Но скорость сбора данных оставляет желать лучшего. Что я делаю не так? Или может это всё под asyncio переделать?
import threading
import requests
from bs4 import BeautifulSoup
import lxml
def getImage():
#https://cspromogame.ru/avatars?page=1999
links = set()
for page in range(1,101): #2000
url = "https://cspromogame.ru/avatars?page={page}"
req = requests.get(url=url)
soup = BeautifulSoup(req.text,"lxml")
a = soup.findAll("a", class_="avatars__link")
for link in a:
link = link.get("href")
alinks = link.split("/")[-1].replace(".jpg","")
req2 = requests.get(link)
out = open(f"Avatars/Картинка_{alinks}.jpg",'wb')
out.write(req2.content)
out.close()
print("Обработано ", alinks)
threads = []
for i in range(11):
t = threading.Thread(target=getImage)
t.start()
for th in threads:
th.join()
Ответы (1 шт):
Автор решения: Виктор
→ Ссылка
Вариант реализации (для ознакомления)
from bs4 import BeautifulSoup
import lxml
import asyncio
import aiohttp
import time
start_time = time.time()
async def main():
async def get_one_page(page:int):
url = f'https://cspromogame.ru/avatars?page={page}'
async with session.get(url) as resp:
text = await resp.text()
print(f'Page: {page}')
soup = BeautifulSoup(text,"lxml")
a = soup.findAll("a", class_="avatars__link")
for link in a:
link = link.get("href")
alinks = link.split("/")[-1].replace(".jpg","")
async with session.get(link) as resp:
filename = f'Avatars/Pic_{alinks}.jpg'
chunk_size = 64 * 1024
with open(filename, 'wb') as fd:
async for chunk in resp.content.iter_chunked(chunk_size):
fd.write(chunk)
print(f'Done: {filename}')
async with aiohttp.ClientSession() as session:
pages = [ get_one_page(page) for page in range(1, 3)]
await asyncio.gather(*pages)
asyncio.run(main())
print("--- %s seconds ---" % (time.time() - start_time))