Threading / Async в запросах-HTML - PullRequest
0 голосов
/ 23 июня 2018

У меня есть большое количество ссылок, которые мне нужно почистить с веб-сайта.У меня ~ 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)
...