Я писал веб-сканер на python, чтобы найти списки электронных писем и телефонных номеров из списка URL. Код, который я написал, может нормально запускаться и выводить данные, но я сталкиваюсь с проблемой, когда некоторые сайты мертвы и код застревает, пытаясь сканировать 1 URL. Есть ли способ ограничить время, в течение которого система будет пытаться выполнить каждый URL-адрес?
import csv
import urllib, re
from itertools import islice
with open('***', mode='r') as csv_file:
reader = csv.DictReader(csv_file)
with open('***', mode='w') as csv_file:
fieldnames = ['url', 'phone', 'email']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
# print(row)
print(row.values()[0])
f = urllib.urlopen(row.values()[0])
s = f.read().decode('utf-8')
# print(row.values())
print({'url': row.values(), 'phone': re.findall(r"((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})", s),
'email': re.findall(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", s)})
writer.writerow({'url': row.values(), 'phone': re.findall(r"((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})", s),
'email': re.findall(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", s)})
Ошибка, которую я получаю после остановки работы программы, такова:
Traceback (most recent call last):
File "***", line 17, in <module>
s = f.read().decode('utf-8')
File "***", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa9 in position 26045: invalid start byte
Любая помощь по ограничению этого сканера временем или неудавшимся запросом будет удивительной!