之前用RSS來監(jiān)控網(wǎng)頁更新內(nèi)容,可惜刷新時(shí)間太長了遗菠,三個(gè)小時(shí)联喘。。只能看看新聞啥的辙纬,又沒有小錢錢充會(huì)員(攤手
聽說Python可以做這個(gè)功能豁遭,抱著試試看的態(tài)度,本以為會(huì)很麻煩贺拣,沒想到這么簡單哈哈~我從來沒有用過Python都做出來了蓖谢,相信你也沒問題捂蕴!
(我真是純小白,路過的大佬請(qǐng)指教(⊙o⊙)ノ)
所用模塊
#監(jiān)控模塊
from urllib import request
from bs4 import BeautifulSoup
#正則表達(dá)
import re
import time
#發(fā)送郵件模塊
#郵箱服務(wù)器
import smtplib
#構(gòu)建郵件正文內(nèi)容
from email.mime.text import MIMEText
# email 用于構(gòu)建郵件內(nèi)容
from email.header import Header
1.原理
把網(wǎng)頁獲取到本地轉(zhuǎn)碼闪幽,然后篩選你需要的信息啥辨,重復(fù)這一過程。(看盯腌!是不是很簡單吶
2.獲取網(wǎng)頁信息
用到了python的urllib模塊溉知,先上代碼
#解析url地址 返回utf-8解碼信息
def analyUrl(url):
header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
#發(fā)送訪問請(qǐng)求 此處header作用為模擬瀏覽器訪問 部分網(wǎng)頁反爬蟲會(huì)檢測(cè)訪問源信息
_tmpRes=request.Request(url=url,headers=header)
_req=request.urlopen(_tmpRes)
#網(wǎng)頁utf-8解碼
html=_req.read().decode('utf-8')
return html
這里走了不少彎路,首先是一開始我是這么填的
request.Request(url)
也就是沒加headers腕够,導(dǎo)致總會(huì)報(bào)錯(cuò)级乍,不過我用百度試了一下卻沒問題。帚湘。玫荣。找了半天也不知道問題出在哪,后來才知道有的網(wǎng)頁會(huì)檢測(cè)你的訪問源信息大诸,只有訪問請(qǐng)求沒有設(shè)備信息有可能被拒絕...加上headers信息偽裝成瀏覽器訪問就好了捅厂。
害,我不會(huì)告訴你我最初Request就找了半天底挫。恒傻。脸侥。Python是嚴(yán)格區(qū)分大小寫的=ǖ恕!
3.分析網(wǎng)頁信息 開始匹配
這部分功能用到BeautifulSoup
#分析網(wǎng)頁信息并匹配關(guān)鍵字
def analyAndCompile(html,firstKey,secondKey):
#提取Html數(shù)據(jù)
html=BeautifulSoup(html,'html.parser')
#二級(jí)匹配關(guān)鍵字
pattern=re.compile(secondKey)
#循環(huán)次數(shù)
flag=0
#當(dāng)前已匹配的信息 使其不必重復(fù)提醒
currCom = ''
#while 循環(huán) 10s一次 重復(fù)匹配信息
while (1):
flag += 1
try:
print('第' + str(flag) + '次 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
#信息中包含'a'Tag和title內(nèi)容與一級(jí)匹配關(guān)鍵字相同的提取
for link in html.find_all('a',title=re.compile(firstKey)):
#獲取title內(nèi)容
link_title=link.get('title')
#獲取網(wǎng)址
info_link = link.get('href')
#compilText判斷是否與二級(jí)關(guān)鍵字匹配 關(guān)鍵字匹配且之前沒出現(xiàn)過即為所需信息
if compilText(pattern,link_title) and currCom is not link_title:
currCom=link_title
print(' ·出現(xiàn)新數(shù)據(jù):'+link_title+'\n 地址:'+info_link)
#發(fā)送郵件
SendMail.sendMail('出現(xiàn)新數(shù)據(jù):'+link_title+'\n地址:'+info_link)
else:
print(' ·無新數(shù)據(jù)'+link_title)
time.sleep(10)
#異常獲取
except Exception as e:
import traceback
print(traceback.format_exc())
print('異常')
time.sleep(10)
這部分需要細(xì)心睁枕,先在網(wǎng)頁上找好所需信息的Tag官边,再用find_all方法篩選出來find_all方法可填多種參數(shù),具體參考這里:http://www.jsphp.net/python/show-24-214-1.html
需要花時(shí)間慢慢找外遇,這部分沒什么好方法注簿,耐心找吧~
4其他模塊代碼
上文中的匹配方法
#匹配關(guān)鍵字 若匹配到返回True 否則返回False
def compilText(pattern,compilStr):
return pattern.search(compilStr) is not None
發(fā)送郵件模塊,這部分網(wǎng)上有很多跳仿,我的僅供參考吧
# 發(fā)信方的信息:發(fā)信郵箱诡渴,QQ 郵箱授權(quán)碼
from_addr = 'xx@qq.com'
password = '此處填入郵箱授權(quán)碼'
# 收信方郵箱
to_addr = 'xx@163.com'
# 發(fā)信服務(wù)器
smtp_server = 'smtp.qq.com'
def sendMail(sendMsg):
# 郵箱正文內(nèi)容,第一個(gè)參數(shù)為內(nèi)容菲语,第二個(gè)參數(shù)為格式(plain 為純文本)妄辩,第三個(gè)參數(shù)為編碼
msg = MIMEText(sendMsg, 'plain', 'utf-8')
# 郵件頭信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('郵件標(biāo)題')
# 開啟發(fā)信服務(wù),這里使用的是加密傳輸
#server = smtplib.SMTP_SSL()
server=smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登錄發(fā)信郵箱
server.login(from_addr, password)
# 發(fā)送郵件
server.sendmail(from_addr, to_addr, msg.as_string())
# 關(guān)閉服務(wù)器
server.quit()
大功告成
自己調(diào)用填上網(wǎng)址和篩選關(guān)鍵字就行啦
(同樣的功能別的語言能這么幾行就實(shí)現(xiàn)的嗎~ 哼哼~Python真香555
參考:
https://www.xiaoweigod.com/code/1609.html
https://blog.csdn.net/DahlinSky/article/details/104454971
https://www.cnblogs.com/hixiaowei/p/9721513.html
http://www.jsphp.net/python/show-24-214-1.html