Проблема при парсинге сайтов - сайты перебираются, но запрос не отрабатывается и зависает

Задача следующая. Есть список сайтов в txt, сам список можно найти по ссылке: [1]: https://docs.google.com/document/d/1WAtOFo9oxrHU-zRUHnXzizDsDlhnLdZa9O2ZvGHo49w/edit?tab=t.0

Также есть список ключевых слов. Необходимо на странице по каждой ссылке сделать поиск ключевых слов. Что хотелось бы иметь в итоге - словарь, содержащий сами ссылки и количество ключевых слов, найденных по каждой ссылке.

Мой код позволяет обработать каждую ссылку, но проблема в том, что в конце, обработав все ссылки, финально запрос не отрабатывает, при этом ошибки не выдает. При загрузке списка других сайтов запрос обрабатывается, получаю желаемый результат. Пробовала выставить таймаут, уже перешла с multiprocessing на ThreadPool, но не поддается пока

import requests, bs4, lxml, re, json
from __future__ import unicode_literals
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
from concurrent.futures import ThreadPoolExecutor
from concurrent import futures
import re
import ssl

words = ['судоремонта', 'vessels', 'судоремонтное','судоремонтные','судоремонт','судоремонтный','суда','судов','судостроительный', 'судостроительного','судовое', 'корабли', 'кораблестроение', 'кораблестроении']
words = [re.compile(w) for w in words]

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'uk,en-US;q=0.9,en;q=0.8,ru;q=0.7',
    'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

with open('Список сайтов тест раб.txt', 'r', encoding = 'utf-8', errors='ignore') as f:
    urls = [line.strip() for line in f if line.strip()]
def Match(url):
    try:
        text = requests.get(url, verify=False, headers=headers).text
        text = text.lower()
        soup = bs4.BeautifulSoup(text, 'lxml')
        for word in words:
            if len(soup(text = word)) > 20:
                return url, 20
            if len(soup(text = word)) > 10:
                return url, 10
            if len(soup(text = word)) > 9:
                return url, 9
            if len(soup(text = word)) > 8:
                return url, 8
            if len(soup(text = word)) > 7:
                return url, 7
            if len(soup(text = word)) > 6:
                return url, 6
            if len(soup(text = word)) > 5:
                return url, 5
            if len(soup(text = word)) > 4:
                return url, 4
            if len(soup(text = word)) > 3:
                return url, 3
            if len(soup(text = word)) > 2:
                return url, 2
            if len(soup(text = word)) > 1:
                return url, 1
        return url, 0
    except Exception as ex:
        return url, str(ex)
    finally:
        print('.', end = '', flush = True)

        
with futures.ThreadPoolExecutor(max_workers=4) as pool:
    try:
        d = dict(list(pool.map(Match, urls ,timeout=15)))
    except concurrent.futures.TimeoutError:
        import atexit
        atexit.unregister(concurrent.futures.thread._python_exit)
        executor.shutdown = lambda wait:None
        raise TimeoutError()
with open('websites.res.json', 'w', encoding = 'utf-8') as f:
    f.write(json.dumps(d, indent = 4))    

Прошу помощи в понимании в чем может быть проблема.


Ответы (0 шт):