Веб-гусеничный ход останавливается - PullRequest
0 голосов
/ 10 октября 2019

Я писал веб-сканер на 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

Любая помощь по ограничению этого сканера временем или неудавшимся запросом будет удивительной!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...