几天前,听说了九价疫苗这个东西,搏一搏女神欢心,就试着抢了一下,没抢到,但是也不知道下一次什么时候开始抢,所以就想着做了个爬虫去获取预约信息,能够及时的通知到我。
以前也没有写过Python方面的东西,自己也不会,但是之前看过几个老哥写的一些例子,凭着自己的强大的学习能力,半天时间就高出来了,顺便也部署好了,哈哈,好简单啊
废话不多说,直接上代码,然后讲思路。
import requests as rq
from bs4 import BeautifulSoup
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 按间距中的绿色按钮以运行脚本。
def getHtml():
# 先获取网页内容
url = 'http://xa.bendibao.com/live/2019422/67045.shtm'
response = rq.get(url)
# 获取了内容后发现中文乱码,于是修改了编码格式
result = response.text.encode(response.encoding).decode(response.apparent_encoding)
# 将文字内容转为这个对象去管理,也好方便获取内容
soup = BeautifulSoup(result, 'lxml')
# 获取class为content的那个标签所有信息
content = soup.find(attrs={'class': 'content'})
# 获取所有的文字信息,找到第一个开头为更新时间的那一段
for span in content.strings:
if span.lstrip().startswith('更新时间'):
update_time = span.lstrip()
# 截取更新时间后面的字符串,并转为时间戳
time1 = get_timestamp_from_format_time(update_time.split('更新时间:')[1])
# 获取当前的时间,并跟当前时间做比较
time2 = time.time()
print(time2)
print(time1)
print(time1 < time2)
print((time2 - time1) < 172800)
# 发布时间距今日两天内,则发送邮件通知,否则直接下一次获取
if (time2 - time1) < 172800:
send_email(update_time)
return
def send_email(update_time):
# 第三方 SMTP 服务
mail_host = "smtp.163.com" # 设置服务器
mail_user = "XXX@XXX.com" # 发送方的用户名
mail_pass = "XXXXXXX" # 口令,邮箱的POP3协议口令,也就相当于密码
sender = 'XXX@163.com' # 发送方的邮箱,没啥用了,跟上面的重复了
receivers = ['XXX0@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 消息文本内容
message = MIMEText('今日九价疫苗预约公告已发布,请尽快确认,公告最近更新时间为' + update_time, 'plain', 'utf-8')
message['From'] = Header("程序提醒", 'utf-8')
message['To'] = Header("测试", 'utf-8')
# 消息标题
subject = '今日九价疫苗预约公告已发布,请尽快前往确认预约时间'
message['Subject'] = Header(subject, 'utf-8')
try:
# 这块本来使用的是25端口去发送邮件的,但是由于用的是阿里云的服务器,在访问25端口的时候一直无响应,所以不得以更改了下面没注掉的方式去发送邮件
# print("准备发送邮件...")
# smtpObj = smtplib.SMTP()
# print("已连接服务器...")
# smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
# print("已绑定25端口...")
# smtpObj.login(mail_user, mail_pass)
# print("正在发送邮件...")
# smtpObj.sendmail(sender, receivers, message.as_string())
# print("邮件发送成功")
# 通过ssl方式发送,服务器地址,端口
print("开始发送邮件....")
s = smtplib.SMTP_SSL(mail_host, 465)
# 登录到邮箱
print("登录到邮箱....")
s.login(mail_user, mail_pass)
# 发送邮件:发送方,收件方,要发送的消息
print("正在发送....")
s.sendmail(mail_user, receivers, message.as_string())
print('发送成功....')
except smtplib.SMTPException:
print("Error: 无法发送邮件")
def timer(n):
"""
每n秒执行一次
"""
while True:
print(time.strftime('%Y-%m-%d %X',time.localtime()))
getHtml() # 此处为要执行的任务
time.sleep(n)
def get_timestamp_from_format_time(format_time):
struct_time = time.strptime(format_time, '%Y.%m.%d')
return time.mktime(struct_time)
if __name__ == '__main__':
# 轮询去获取需要爬取得信息,每两小时执行一次
timer(7200)
第一次使用python做定时任务,不会做,用了最耗资源的轮询来做,服务器自己的服务器,反正没有其他的业务在上面,也就没管那么多
思路呢就是审查元素,取到相应的标签,然后分析,没多少技术含量
第一次写Python爬虫,还是相当顺利的,爬取的公开的数据,也不牵扯法律相关问题,而且两小时爬取一次,也不会影响网站的正常使用
相关声明:本帖为技术讨论帖,请勿用作非法用途,若非法使用,与本技术贴无关,若侵权,请告知删帖