У меня есть большое количество ссылок, которые мне нужно почистить с веб-сайта.У меня ~ 70 базовых ссылок и из них более 700 ссылок, которые нужно очистить от тех, которые начинаются с 70. Поэтому, чтобы ускорить этот процесс, занимает около 2-3 часов без многопоточности / асинхронности, я решил попробовать использовать нить/async.
Моя проблема в том, что мне нужно отрендерить некоторый javascript, чтобы получить ссылки в первую очередь.Я использовал для этого запрос-html, так как его метод html.render () очень надежный.Тем не менее, когда я пытаюсь запустить это с использованием многопоточности или асинхронности, я сталкиваюсь с множеством проблем.Я пробовал AsyncHTMLSession из-за этого Github PR , но не смог заставить его работать.Мне было интересно, есть ли у кого-нибудь какие-либо идеи или ссылки, которые они могут указать мне тоже, которые могут помочь.
Вот пример кода:
from multiprocessing.pool import ThreadPool
from requests_html import AsyncHTMLSession
links = (tuple of links)
n = 5
batch = [links[i:i+n] for i in range(0, len(links), n)]
def link_processor(batch_link):
session = AsyncHTMLSession()
results = []
for l in batch_link:
print(l)
r = session.get(l)
r.html.arender()
tmp_next = r.html.xpath('//a[contains(@href, "/matches/")]')
return tmp_next
pool = ThreadPool(processes=2)
output = pool.map(link_processor, batch)
pool.close()
pool.join()
print(output)
Вывод:
RuntimeError: There is no current event loop in thread 'Thread-1'.
Был в состоянии исправить это с некоторой помощью из subreddit learnpython.Оказывается, request-html, вероятно, каким-то образом использует потоки, и поэтому у потоков с потоками есть проблема, поэтому простое использование многопроцессорного пула работает.
FIXED CODE:
from multiprocessing import Pool
from requests_html import HTMLSession
.....
pool = Pool(processes=3)
output = pool.map(link_processor, batch[:2])
pool.close()
pool.join()
print(output)