前几天闲来无事,看到了一个羊毛线报网站,发现每日都在更新一些比较好的内容,比如领券、云盘、加油优惠、免费会员等一手信息,自己按照操作还撸了不少的优惠,但是每天手动打开这个网站还是挺麻烦的,主要有两点功能。
- 自动抓取最新的羊毛日报信息
- 将获取到的信息自动发送到邮箱
这样利用每天上班在地铁上的时间,就可以阅览下信息,如果有价值就可以直接操作了,非常的方便!
代码地址
- https://github.com/AnTi-anti/Python_Demo
思路
抓取内容
虽然网页有很多优惠信息,但是并不是所有的信息都值得被推送,比如有些过期了的优惠活动,这里我默认抓取前五条时间最新的信息,如果你有需求,也可以自己修改。
网页的元素也是简单到不能再简单了,没有反爬,也不需要登录。
所有的信息都在下面这个li标签中
liTags = soup.find_all('li', attrs={
'class': 'grid-item post-list-item'})
至于元素,我们只要文本内容、链接和时间就可以。
直接用BS4进行抓取就可以。
首先获取网页内容,我们用一个字典进行存储。
def get_content():
url = 'https://ym.today/yangmao'
ret = requests.get(url)
test = ret.text
comments = []
soup = BeautifulSoup(test, 'lxml')
liTags = soup.find_all('li', attrs={
'class': 'grid-item post-list-item'})
for li in liTags:
comment = {
}
try:
comment['content'] = li.find('a').text.strip()
comment['URL'] = li.find('a')['href']
comment['time'] = li.find('time')['datetime']
comments.append(comment)
except:
print('出了点小问题')
return comments
接着,为了后续处理方便,我们将字典存储为一个CSV表格。
def Out2File(dict):
df = pd.DataFrame()
list_content = []
list_url = []
list_time = []
for comment in dict:
list_content.append(comment['content'])
list_url.append(comment['URL'])
list_time.append(comment['time'])
df['content'] = list_content
df['url'] = list_url
df['time'] = list_time
df = df.head(6)
df.to_csv('羊毛.csv', index=False) # 输出为csv文本格式
return df
最后就是发送到邮箱这一步骤了,这里我们采用的邮箱模板是QQ邮箱,如果你想要别的邮箱,也可以自己选择对应的发送模板。
需要你自己修改的参数如下
- 发送人的邮箱
- 接收人的邮箱
- 接收人邮箱的smtp 值
- 指定发送的时间
如何获取SMTP值,打开QQ邮箱,点击设置,账户,
找到IMAP/SMTP,点击开启,吧得到的SMTP值复制到代码中即可。
def email():
df = pd.read_csv('羊毛.csv')
number = '发送人的邮箱'
smtp = ''
to = '接收人的邮箱' # 可以是非QQ的邮箱
mer = MIMEMultipart()
# 设置邮件正文内容
head = '''
<p>羊毛最新信息</p>
<p><a href="{}">{}--{}</a></p>
<p>羊毛最新前五条信息</p>
<p><a href="{}">{}--{}</a></p>
<p><a href="{}">{}--{}</a></p>
<p><a href="{}">{}--{}</a></p>
<p><a href="{}">{}--{}</a></p>
<p><a href="{}">{}--{}</a></p>
'''.format(df.iloc[0, :]['url'], df.iloc[0, :]['content'],df.iloc[0, :]['time'],
df.iloc[1, :]['url'], df.iloc[1, :]['content'],df.iloc[1, :]['time'],
df.iloc[2, :]['url'], df.iloc[2, :]['content'],df.iloc[2, :]['time'],
df.iloc[3, :]['url'], df.iloc[3, :]['content'],df.iloc[3, :]['time'],
df.iloc[4, :]['url'], df.iloc[4, :]['content'],df.iloc[4, :]['time'],
df.iloc[5, :]['url'], df.iloc[5, :]['content'],df.iloc[5, :]['time'])
mer.attach(MIMEText(head, 'html', 'utf-8'))
fujian = MIMEText(open('羊毛.csv', 'rb').read(), 'base64', 'utf-8')
fujian["Content-Type"] = 'application/octet-stream' # 附件内容
fujian.add_header('Content-Disposition', 'file', filename=('utf-8', '', '羊毛.csv'))
mer.attach(fujian)
mer['Subject'] = '每日羊毛信息' # 邮件主题
mer['From'] = number # 发送人
mer['To'] = to # 接收人
# 5.发送邮件
s = smtplib.SMTP_SSL('smtp.qq.com', 465)
s.login(number, smtp)
s.send_message(mer) # 发送邮件
s.quit()
print('成功发送')
成功接收的右键格式如下:
这样就可以愉快的浏览信息了。
如果不想每天开着脚本,还可以使用Windows任务计划自动运行Python程序,也是很方便的。