В настоящее время я пытаюсь ускорить мой рекурсивный сканер страниц с помощью многопроцессорного модуля 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