假如我监控某一个商品网页中的某个属性,当发现它从“ True ”变为“ False ”的时候,我调用 emai 控件发送一封邮件给目标邮箱。
那么问题来了:
假如我把这个程序放在服务器上,每 2 秒中对目标网页进行监视,那么在该商品未下架之前,程序将会一直以 2 秒钟为时间,向目标用户发送邮件。
请问大家有什么思路来解决这个问题,使得只发送一封邮件吗?
我初步的想法是一旦发送一封邮件后,直接将该属性强制改为'True',但是获取网站信息之后,仍然会变为'False',没有一点思路......
1
est 2016-02-28 20:52:31 +08:00
再立一个 is_sent 的 flag 就行了。
|
2
ElegantOfKing OP @est 能否麻烦您说得详细一点?我现在还一头雾水,想不到什么具体的思路 。
|
3
zangxixi 2016-02-28 21:01:13 +08:00
可以用数据库保存信息呀,每次发送邮件后就保存下,每次判断的时候就到数据库查一把
|
4
billgreen1 2016-02-28 21:48:07 +08:00
email_sent = False
item_attribute = True should_send_email = (not item_attribute) and (not email_sent) if should_send_email: send_email(mail_content): email_sent = True |
5
gamexg 2016-02-29 08:19:51 +08:00 via Android
你需要保存商品的状态,如果这次抓取时和上次保存的一致就直接跳过。
|
6
ElegantOfKing OP @billgreen1
按照您的操作,做了个小测试,发现还是继续运行啊。 def send_mail(): print('已经发送短信!') email_sent = False item_ = False should_send_email = (not email_sent) and (not item_) while True: if should_send_email: send_mail() email_sent = True |
7
ElegantOfKing OP |
8
billgreen1 2016-02-29 12:35:19 +08:00
@ElegantOfKing 你可以把 should_send_mail 定义为函数
def should_send_mail(email_sent, item_): return (not item_) and (not email_sent) 在 while 循环里面, while True: if should_send_email(email_sent, item_): send_mail() email_sent = True |
9
ElegantOfKing OP @zangxixi 这个思路感觉有点 BUG 。假如我发送邮件后存到了数据库,再次发送的时候,向数据库查询。假如说该商品再次缺货,然后再次上架,估计有点难处理。
|
10
ElegantOfKing OP @billgreen1 感谢您的回复,我尝试一下`
|
11
ElegantOfKing OP @billgreen1
额,貌似有点问题? 当我正确运行一次后, email_sent 变为 True ,这点可以实现。 但是一旦 email_sent 变为 True 之后,无论 item_变量怎么改变, should_sent_mail()函数会一直 return False 。那么就意味着这个程序,只能运行一次? |
12
edwardlol 2016-02-29 20:20:21 +08:00
@ElegantOfKing 按照这个逻辑 应该要在改变 item_的时候同时改变 email_sent 吧
|