Кодирование монитора Python - PullRequest
       7

Кодирование монитора Python

0 голосов
/ 24 сентября 2019

Я пытаюсь реализовать монитор для веб-сайта.Я хотел бы получать по электронной почте каждый раз, когда товар, который был продан, стал доступным.(Или если добавлен новый элемент)

Когда я запускаю этот код, вывод: Процесс завершен с кодом выхода 0.

Я новичок в Python, что-то не так?Как мне запустить этот код как 24/24?Получу ли я письмо?(Очевидно, мои данные указаны в моем адресе, пароле и т. Д.).

Похоже, ничего не случилось ...

#import urllib2
import smtplib
try:
    import urllib.request as urllib2
except ImportError:
    import urllib2

import hashlib
import random
import time


# url to be scraped
url = "https://www.off---white.com/en/IT/men/products/blue-af1-mca#"

# time between checks in seconds
sleeptime = 60


def getHash():
    # random integer to select user agent
    randomint = random.randint(0, 7)

    # User_Agents
    # This helps skirt a bit around servers that detect repeaded requests from the same machine.
    # This will not prevent your IP from getting banned but will help a bit by pretending to be different browsers
    # and operating systems.
    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'
    ]

    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', user_agents[randomint])]
    response = opener.open(url)
    the_page = response.read()

    return hashlib.sha224(the_page).hexdigest()


current_hash = getHash()  # Get the current hash, which is what the website is now

while 1:  # Run forever
    if getHash() == current_hash:  # If nothing has changed
        print
        "Not Changed"
    else:  # If something has changed
        email = 'myaddress@gmail.com'  # Your email
        password = 'password'  # Your email account password
        send_to_email = 'sentoaddreess@gmail.com'  # Who you are sending the message to
        message = 'This is my message'  # The message in the email

        server = smtplib.SMTP('smtp.gmail.com', 587)  # Connect to the server
        server.starttls()  # Use TLS
        server.login(email, password)  # Login to the email server
        server.sendmail(email, send_to_email, message)  # Send the email
        server.quit()  # Logout of the email server
        break
    time.sleep(sleeptime)

1 Ответ

0 голосов
/ 25 сентября 2019

Когда я запускаю этот код, вывод: Процесс завершен с кодом завершения 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.

Следующий шаг (каламбур предназначен) должен запускать ваш код под пошаговым отладчиком, но это также слишком широкая темаНо это все еще необходимый навык ...

...