Python: многопроцессорная обработка для рекурсивного сканера страниц: - PullRequest
0 голосов
/ 21 апреля 2020

В настоящее время я пытаюсь ускорить мой рекурсивный сканер страниц с помощью многопроцессорного модуля python.

Таким образом, сканер рекурсивно сканирует все ссылки на странице, обрабатывая найденные "hrefs" на определенном стр. Пока все отлично работает, но занимает много времени.

Я попытался настроить многопроцессорность с помощью Pool (), чтобы разрешить параллельную обработку найденных ссылок. Я думал, что я вызову Pool () до того, как начнется первая рекурсия, так как при первом вызове вы просто переходите по ссылке на страницу, чтобы начать логически, поэтому нет необходимости в «дополнительных помощниках». При настройке пула я получаю:

AttributeError: Can't pickle local object '_createenviron.<locals>.encodekey' 

Что я делаю не так? Любая помощь будет очень оценена!

Ниже приведен код с методом, который я рекурсивно вызываю:

def crawl_urls(self, url_list, crawled_urls, driver, url):
    """ get a set of urls and crawl each url recursively"""

    # Once the url is parsed, add it to crawled url listfurl
    crawled_urls.append(url)
    driver.get(url)

    html = driver.page_source.encode("utf-8")

    soup = BeautifulSoup(html, 'html.parser')

    urls = soup.findAll("a")



    # Even if the url is not part of the same domain, it is still collected
    # But those urls not in the same domain are not parsed
    for a in urls:

        # Get URL from a tag.
        url = a.get("href")


        # Add domain if missing
        if (url.startswith("/")) :
            url = (self.parent_url + url)
            r = requests.head(url)
            if (r.status_code == 200):
                pass 
            else:
                print("URL not found =>" + url)
                continue

        if (url not in url_list) and (self.match_regex(url) and (urlparse(url).netloc == self.domain)):
            url_list.append(url)


    # Recursively parse each url within same domain
    for page in set(url_list):  # set to remove duplicates
        print(str(page not in crawled_urls))
        if (page not in crawled_urls):
            try:
                print("-----RECURSION-----")
                print(multiprocessing.active_children)
                with multiprocessing.Pool(3) as p:
                     p.map(self.crawl_urls, [url_list, crawled_urls, driver, page])
            except selexcept.UnexpectedAlertPresentException: #Catch JavaScript Alert window
                print("UnexpectedAlertPresentException:")
                self.crawl_urls(url_list, crawled_urls, driver, page)

    # Once all urls are crawled return the list to calling function
    else:
        return crawled_urls, url_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...