python监控网页_【小白教程】Python3监控网页
之前用RSS來監(jiān)控網(wǎng)頁更新內(nèi)容,可惜刷新時間太長了,三個小時。。只能看看新聞啥的,又沒有小錢錢充會員(攤手
聽說Python可以做這個功能,抱著試試看的態(tài)度,本以為會很麻煩,沒想到這么簡單哈哈~我從來沒有用過Python都做出來了,相信你也沒問題!
(我真是純小白,路過的大佬請指教(⊙o⊙)ノ)
所用模塊
#監(jiān)控模塊
from urllib import request
from bs4 import BeautifulSoup
#正則表達
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)碼,然后篩選你需要的信息,重復這一過程。(看!是不是很簡單吶
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ā)送訪問請求 此處header作用為模擬瀏覽器訪問 部分網(wǎng)頁反爬蟲會檢測訪問源信息
_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,導致總會報錯,不過我用百度試了一下卻沒問題。。。找了半天也不知道問題出在哪,后來才知道有的網(wǎng)頁會檢測你的訪問源信息,只有訪問請求沒有設(shè)備信息有可能被拒絕...加上headers信息偽裝成瀏覽器訪問就好了。
害,我不會告訴你我最初Request就找了半天。。。Python是嚴格區(qū)分大小寫的!!
3.分析網(wǎng)頁信息 開始匹配
這部分功能用到BeautifulSoup
#分析網(wǎng)頁信息并匹配關(guān)鍵字
def analyAndCompile(html,firstKey,secondKey):
#提取Html數(shù)據(jù)
html=BeautifulSoup(html,'html.parser')
#二級匹配關(guān)鍵字
pattern=re.compile(secondKey)
#循環(huán)次數(shù)
flag=0
#當前已匹配的信息 使其不必重復提醒
currCom = ''
#while 循環(huán) 10s一次 重復匹配信息
while (1):
flag += 1
try:
print('第' + str(flag) + '次 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
#信息中包含'a'Tag和title內(nèi)容與一級匹配關(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判斷是否與二級關(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)
這部分需要細心,先在網(wǎng)頁上找好所需信息的Tag,再用find_all方法篩選出來find_all方法可填多種參數(shù),具體參考這里:http://www.jsphp.net/python/show-24-214-1.html
需要花時間慢慢找,這部分沒什么好方法,耐心找吧~
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)容,第一個參數(shù)為內(nèi)容,第二個參數(shù)為格式(plain 為純文本),第三個參數(shù)為編碼
msg = MIMEText(sendMsg, 'plain', 'utf-8')
# 郵件頭信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('郵件標題')
# 開啟發(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)鍵字就行啦
(同樣的功能別的語言能這么幾行就實現(xiàn)的嗎~ 哼哼~Python真香555
總結(jié)
以上是生活随笔為你收集整理的python监控网页_【小白教程】Python3监控网页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vijos 1082
- 下一篇: PHP函数array_intersect