Когда я запускаю этот код, вывод: Процесс завершен с кодом завершения 0.
Ну, обычно это означает, что скрипт был выполнен без ошибок, но так как вызапустить его из PyCharm я не могу сказать гораздо больше.Вместо этого запустите скрипт из командной строки, и вы узнаете, что происходит.
Я новичок в Python, что-то не так?
Что ж, в вашем коде нет явной ошибки, которая помешала бы его запуску, но способ его написания не помогает при отладке (подробнее об этом позже).И, вероятно, в нем есть логическая ошибка (то же самое).
Вот немного пересмотренная (но функционально эквивалентная) версия:
import smtplib
try:
import urllib.request as urllib2
except ImportError:
import urllib2
import hashlib
import random
import time
# mail config
smtp_server = 'smtp.gmail.com'
smtp_port = 587
smtp_login = 'myaddress@gmail.com' # Your email
smtp_password = 'password' # Your email account password
recipient_email = 'sentoaddreess@gmail.com' # Who you are sending the message to
# url to be scraped
url = "https://www.off---white.com/en/IT/men/products/blue-af1-mca#"
# time between checks in seconds
sleeptime = 60
user_agents = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
'Opera/9.25 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19'
]
def get_random_agent():
return random.choice(user_agents)
def get_page(url):
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', get_random_agent())]
response = opener.open(url)
content = response.read()
response.close()
return content
def get_hash(url):
page = get_page(url)
return hashlib.sha224(page).hexdigest()
def sendmail(message):
server = smtplib.SMTP(smtp_server, smpt_port)
server.starttls()
server.login(smtp_login, smtp_password)
server.sendmail(smtp_login, recipient_email, message)
server.quit()
def main():
current_hash = get_hash(url)
while True: # Run forever => well, nope... cf below
time.sleep(sleeptime)
if get_hash(url) = current_hash:
print("Not Changed")
continue
print("changed, sending mail")
sendmail("has changed")
break # really ??? This means that you exit the loop here !
# this allow to use the script as either a script (python yourscript.py) or module
# so you can import it in a Python shell and test functions in isolation
if __name__ == "__main__":
main()
Как вы могли заметить, я разбил логику на маленькие функции,и обернул основной цикл в функцию main()
, которая выполняется, только если файл используется в качестве сценария (> python yourfile.py
в командной строке).Это позволяет вам импортировать скрипт в оболочку Python как модуль (без запуска основной функции) и тестировать функции изолированно, то есть:
bruno@blookup-MS-7982:~/Work/playground$ python
Python 2.7.15+ (default, Jul 9 2019, 16:51:35)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import somail
>>> somail.get_hash(somail.url)
'adc545b6e40da7b9a4c1319a933b7921e21f7877a03080ec720c71c9'
>>>
Как запустить этот код, например, 24/24?
Ну, во-первых, вы можете дважды подумать о выражении break
в цикле while
.Если вы ожидаете, что ваш код будет «работать вечно», вы не хотите выходить из цикла, не так ли? -)
Как только это будет исправлено, ваш цикл действительно будет «работать вечно» - или, точнее,до тех пор, пока что-то не сработает по какой-либо причине (отключение сайта, сетевая ошибка, ошибка smtp и т. д.), поскольку обработка ошибок точно равна нулю, но это на самом деле лучше, чем неправильно выполненная обработка ошибок, поскольку, по крайней мере, у вас будет сообщение об ошибке и полная трассировкачтобы сказать вам, что пошло не так, чтобы вы знали, какие исключения вы должны обработать и где их обработать.
Теперь все еще требуется, чтобы вы запустили свою программу (из командной строки или как угодно) и позволилизапуск процесса - если вы убьете свой терминал, это также убьет и скрипт.
Теперь есть способы «отсоединить» процесс от оболочки, но это зависит от системы (в linux / unices они называются"daemons", в Windows они называются "services" IIRC), и это на самом деле полный вопрос.
Получу ли я письмо?(Очевидно, моя информация указана в моем адресе, пароле и т. Д.).
Эээ ... Как мы можем знать, если ВЫ получили электронное письмо? -)
Как говорится, все мыможет действительно знать, что , если сценарий выполнен без ошибки , по крайней мере SMTP-сервер принял почту.Что происходит с сообщением тогда, никто не может знать (пока, возможно, кто-то не найдет его в своем почтовом ящике).
Похоже, ничего не произошло ...
Ваш оригинальный код упоминает только тогда, когда ничего не изменилось.Он не дает никакой обратной связи при обнаружении изменения.Первый простой и простой способ отследить выполнение кода - добавить в свой код операторы print
, чтобы вы могли сразу увидеть, что он делает (рабочий код будет использовать правильное ведение журнала).Второе, что нужно сделать, чтобы проверить ваш код, это то, что я сделал: разрезать его на небольшую, сфокусированную функцию (каждая выполняет одну вещь) и протестировать ваши функции из оболочки python.
Следующий шаг (каламбур предназначен) должен запускать ваш код под пошаговым отладчиком, но это также слишком широкая темаНо это все еще необходимый навык ...