Проблема при парсинге сайтов - сайты перебираются, но запрос не отрабатывается и зависает
Задача следующая. Есть список сайтов в 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))
Прошу помощи в понимании в чем может быть проблема.