背景:
~哎,感觉每天用自己这衰老的身体走动好累的,所以又萌发出了买一辆自行车的冲动,首先肯定是溜去睿思瞧瞧,然而发现挺多好车的~然而都出手了,So!!!自己动手爬最新信息发到邮件的岂不是美滋滋!!!用py写东西是真的舒服,各种包各种调,想起当年用世界上最好的语言发邮件的时候的苦呀~
基本思想:
先找到RS的普通交易url,找到每个标题的url,先判断url中是否有我想要的”车”这个关键词,如果有,那么再爬其url,找到其主要内容,用邮件发到我的邮箱,然后1个小时爬一次(毕竟自己人。这样就可以获取到最新的消息啦!
PY:
这里我用的新浪邮箱发送
#coding:utf-8
import requests
from bs4 import BeautifulSoup
import time
import smtplib # 加载smtplib模块
from email.mime.text import MIMEText #发邮件所用包
from email.utils import formataddr
my_sender = '发送人地址' # 发件人邮箱账号,为了后面易于维护,所以写成了变量
my_user = '收件人地址' # 收件人邮箱账号,为了后面易于维护,所以写成了变量
def mail(content):
ret = True
try:
msg = MIMEText(content, 'plain', 'utf-8') #这里是邮件内容
msg['From'] = formataddr(["xduer", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["wrm", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "it is subject" # 邮件的主题,也可以说是标题
server = smtplib.SMTP("smtp.sina.cn", 25) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, "发件人密码") # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 这句是关闭连接的意思
except Exception: # 如果try中的语句没有执行,则会执行下面的ret=False
ret = False
return ret
#ret = mail()
# if ret:
# print("ok") # 如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
# else:
# print("filed") # 如果发送失败则会返回filed
dire1 = { '破单车': '666' }; #建立一个字典,字典的作用就是判断这个标题是否有发送过
url = 'http://rs.xidian.edu.cn/forum.php?mod=forumdisplay&fid=110'#要爬的地址URL,这里以睿思为例
res = requests.get(url)
res.encoding = 'utf-8'
text = res.text
soup = BeautifulSoup(text,'html.parser') #唔,BeautifulSoup可以了解一波
times = 5 #这里是设置爬虫爬几次就暂停
url = 'http://rs.xidian.edu.cn/'
mark = 0 #标记为未爬过
while(times):
times = times-1
header = soup.find_all('a',attrs={'class':'s xst'}) #爬下这个网站标签为a,class为...的内容
for i in header: #内容以数组的形式存在着,那么循环判断
content = i.text #拿出里面的内容
for j in range(len(content)):
if(content[j]=='车'): #当内容存在车这个关键字的时候,判断这个标题是否被爬过
if (dire1.get(content) == None): #只有没爬过的才发送
dire1[content] = 1
content_url = url+i['href']#找到标题的href然后点进去,拿到第一个内容
res2 = requests.get(content_url)
res2.encoding = 'utf-8'
text2 = res2.text
soup2 = BeautifulSoup(text2, 'html.parser')
result = soup2.find_all('td',attrs={'class':'t_f'})
if(mark==0): #只有爬过一次,然后新发的消息才会有一个邮件的发送,如果不想要查看第一次的结果,将其设置为1即可
#print(i.text+result[0].text) #如果想发送邮件,那么注释这句并执行mail()即可
#这里i.text是标题,result[0].text为点进标题作者的内容
ret = mail(i.text+result[0].text)
if ret:
print("ok") # 如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
else:
print("filed") # 如果发送失败则会返回filed
time.sleep(60 * 60) # 让代码休息60*60s,毕竟我电的网站,还是不要爆破
mark=1