Ловить надо то, что вы готовы пережить, остальное пусть падает громко. Падение с понятным текстом лучше тихой строчки «oshibka», по которой нельзя восстановить, что произошло.
Разберу ваш кусок по всем пяти пунктам сразу, чтобы не растягивать.
Первое, про время ожидания, Марина уже написала. Второе: ловите отдельные виды ошибок и печатайте текст самой ошибки целиком. Третье: печать в консоль пропадает вместе с окном терминала, ночному прогону нужен файл. Четвёртое: результат должен ложиться на диск по ходу дела, иначе падение на сорок девятом адресе уносит всю работу. Пятое: разбор заголовка через нарезку строк развалится на первой же странице, где тег написан с пробелом внутри.
Вот тот же скрипт с учётом всего перечисленного:
import logging, time, random, requests
from lxml import html as lh
logging.basicConfig(filename="progon.log", level=logging.INFO,
format="%(asctime)s %(message)s")
with open("spisok.txt", encoding="utf-8") as f:
adresa = [s.strip() for s in f if s.strip()]
with open("vyhod.tsv", "a", encoding="utf-8") as out:
for u in adresa:
try:
r = requests.get(u, timeout=20)
zagolovok = lh.document_fromstring(r.content).findtext(".//title") or ""
out.write("%s\t%s\n" % (u, zagolovok.strip()))
out.flush()
logging.info("ok %s %s", r.status_code, u)
except requests.RequestException as e:
logging.warning("set %s %s", u, e)
time.sleep(random.uniform(1.0, 3.0))
```
Обратите внимание на flush после записи и на паузу с разбросом в конце. Обе строчки короткие, обе снимают по классу проблем.