主要功能:擷取網頁所有桌面儲存至伺服器,通過微信機器人每日定時分享給自己和好友,源碼及更多内容歡迎下載下傳https://github.com/oubahe/python-WallPaperShare
主要知識點:urllib解析網頁、python類和對象、re正規表達式、字典結構、bot機器人和圖檔檔案的讀寫
GetWallPaper:
import urllib
import requests
import re,time
import socket
class GetMitao(object):
def init(self):
self.ip = ‘http://www.mitozhi.com/’
self.wallpaper={}
def getHtmls(self):
# 解析網頁
ip = self.ip
html = urllib.request.urlopen(ip).read()
html = html.decode('utf-8')
# 擷取欄目的内容清單
content = '<li class="col-xs-2"><a class="text-overflow" href="/.*?>'
hot_html = 'http://www.mitozhi.com/shoujibizhi/'
reg = re.compile(content)
selected = reg.findall(html)
# print(selected) ## 列印所有的網頁位址測試
blank = [elem.split('/')[-2] for elem in selected]
# 擷取桌面網頁
htmls = [];hot_end=100;end = 30
# 添加其他類型桌面網頁
for trans in blank:
if trans == 'wenzikong':
for i in range(1, end):
wenzi = hot_html + trans + '/list_14_' + str(i) + '.html'
# print(wenzi)
htmls.append(wenzi)
if trans == 'yijingfengge':
for i in range(1, end):
yijing = hot_html + trans + '/list_19_' + str(i) + '.html'
# print(yijing)
htmls.append(yijing)
if trans == 'qinglvbizhi':
for i in range(1, end):
qinglv = hot_html + trans + '/list_18_' + str(i) + '.html'
# print(qinglv)
htmls.append(qinglv)
if trans == 'gexinglinglei':
for i in range(1, end):
gexing = hot_html + trans + '/list_17_' + str(i) + '.html'
# print(gexing)
htmls.append(gexing)
if trans == 'yingshimingxing':
for i in range(1, end):
mingxing = hot_html + trans + '/list_16_' + str(i) + '.html'
# print(mingxing)
htmls.append(mingxing)
if trans == 'youxibizhi':
for i in range(1, end):
youxi = hot_html + trans + '/list_15_' + str(i) + '.html'
# print(youxi)
htmls.append(youxi)
if trans == 'chongwubizhi':
for i in range(1, end):
chongwu = hot_html + trans + '/list_21_' + str(i) + '.html'
# print(chongwu)
htmls.append(chongwu)
if trans == 'katong':
for i in range(1, end):
katong = hot_html + trans + '/list_13_' + str(i) + '.html'
# print(katong)
htmls.append(katong)
if trans == 'suopingbizhi':
for i in range(1, end):
suoping = hot_html + trans + '/list_20_' + str(i) + '.html'
# print(suoping)
htmls.append(suoping)
if trans == 'liaotianbeijing':
for i in range(1, end):
liaotian = hot_html + trans + '/list_26_' + str(i) + '.html'
# print(liaotian)
htmls.append(liaotian)
if trans == 'meinvbizhi':
for i in range(1, end):
meinv = hot_html + trans + '/list_25_' + str(i) + '.html'
# print(meinv)
htmls.append(meinv)
#添加熱門桌面類型的網址
for i in range(1,hot_end+1):
remen=hot_html + '/list_11_' + str(i) + '.html'
htmls.append(remen)
return htmls
# 擷取圖檔及圖檔名字儲存至字典
def getWallPaper(self):
htmls=self.getHtmls()
for url in htmls[:]:
try:
page = urllib.request.Request(url)
NET_STATUS = False
while not NET_STATUS:
try:
# 擷取頁面的圖檔内容
html = urllib.request.urlopen(page,data=None,timeout=3).read()
html = html.decode('utf-8')
# 擷取圖檔及圖檔名字資訊
reg = '<img src="http://.*? class="'
img = re.compile(reg)
imglist = img.findall(html)
# 将圖檔及圖檔名字儲存為字典
for jpg in imglist:
# 圖檔位址
pos='http://.*?"'
pos=re.compile(pos)
jpg_pos=pos.findall(jpg)[0][:-1]
# 圖檔名字
patten='[\u4e00-\u9fa5]'
chinese=re.compile(patten)
chinese=''.join(chinese.findall(jpg))
name=''.join([str(ord(elem)) for elem in chinese])
# 存入字典
if name in list(self.wallpaper.keys()):
continue
else:
self.wallpaper[name]=jpg_pos
print('已抓取圖檔數:',len(list(self.wallpaper.keys())),name) ##列印擷取的圖檔名字進行測試
time.sleep(0.5)
break
except socket.timeout:
NET_STATUS = False
except:
continue
print('桌面采集完畢!')
return self.wallpaper
SendWallPaper:
from wxpy import *
import time,datetime
import os,sys
import requests
from GetWallPaperAndSend.GetWallPaper import GetMitao
class SaveAndSendImg(object):
def init(self,path):
self.sended=[]
self.path=path
# 擷取圖檔位址響應
def getImgRequest(self,img):
r = requests.get(img)
return r
# 儲存圖檔至本地
def SaveImg(self):
# 抓取圖檔并儲存至本地
wallpaper = GetMitao().getWallPaper()
files = os.listdir(self.path)
# 将未儲存的圖檔儲存
for img in list(wallpaper.keys()):
jpg=img+'.jpg'
if jpg not in files:
img_pos = wallpaper[img]
img = self.getImgRequest(img_pos)
f = open(self.path + '\\' + jpg, 'wb')
f.write(img.content)
f.close()
time.sleep(0.5)
print('桌面儲存完畢!.')
def Send(self):
while True:
# 初始化緩存機器人登入
bot = Bot(cache_path=True)
# 擷取人物
ying = bot.friends().search(u'萦')[0]
zhuo = bot.friends().search(u'林')[0]
bot.file_helper.send('桌面分享中...')
# 擷取時間,到達時間點則分享
hour=int(datetime.datetime.now().strftime('%H'))
if hour==9:
# 擷取新圖檔并儲存
self.SaveImg()
# 記錄桌面張數
pic_number=0
# 擷取檔案夾所有圖檔
files = sorted(os.listdir(self.path))
# 發送今日份資訊
ying.send('今日份桌面送到啦!')
bot.file_helper.send('今日份桌面送到啦!')
zhuo.send('今日份桌面送到啦!')
# 發送圖檔
for name in files:
img = self.path+'\\'+name
# 将圖檔名字數字字元轉化為文字名字
params = name.split('.')[0]
img_name=''
while params:
word = params[:5]
img_name += chr(int(word))
params = params[5:]
if len(params) == 5:
break
img_name+=chr(int(params))
img_name = 'WallPaperName:'+img_name
try:
if name not in self.sended:
print('開始分享第%d張桌面'%(pic_number+1))
# 微信發送桌面
ying.send(img_name)
ying.send_image(img)
#
bot.file_helper.send(img_name)
bot.file_helper.send_image(img)
#
zhuo.send(img_name)
zhuo.send_image(img)
# 儲存已發送的桌面
self.sended.append(name)
# 記錄桌面張數
pic_number+=1
else:
continue
# 每日推送3張後退出等待
if pic_number==3:
break
time.sleep(3)
except ResponseError as e:
print('桌面發送出現問題:',e.err_code,e.err_msg)
sys.exit()
print('->等待明日桌面分享...')
time.sleep(3600)
if name==‘main’:
# 桌面抓取、存儲與定時分享
SaveAndSendImg(r’G:\WallPaper’).Send()
微信實時測試分享效果: