Python 骚操作:如何给你爱的读者每天发早报?
??點擊“小詹學Python”,星標公眾號
重磅干貨,第一時間送達
早報
最近和一個朋友嘮嗑,聽她吐槽了好久……
她是一個社群運營,每天早上收集信息、整理、排版、到推送社群,大概要花費30分鐘,需要花費大量的時間和精力,苦不堪言。
那么有沒有辦法將這個流程自動化呢?于是乎,我們想到了 「?除了生孩子無所不能的 Python 」,請接著看!
早報圖片思路很簡單,分為3步:
1.從目標網站采集信息;
2.將采集到的信息生成早報圖片
3.將生成的圖片發送到微信群或好友
實現流程一、早報數據收集
網絡上有很多提供早報的網站,這里為了避免做廣告,但是為了演示方便,只提供地址,不說明名字,下文將我采集的網站稱為A網站,A網站有專門的早報模塊
1.獲取最新日報的url
首先獲取A網站最新早報頁面的鏈接,通過查看網頁源代碼發現,所有的展示信息在頁面 li 中,我們要獲取的鏈接的地址正好在h2中,所以分析完畢開始提取鏈接
image.png首先引入相關的網絡請求庫u,如下圖
import?requestsfrom?bs4?import?BeautifulSoupfrom?bs4?import?BeautifulSoup
點擊第一個早報信息進入后鏈接為https://www.pmtown.com/archives/197318.html,而我們使用find方式找到最新日報頁面的鏈接為相對路徑/archives/197318.html,所以需要我們手動組裝完整的URL,具體見下方。
#?獲取第一個早報的urlobj1?=?requests.get('http://www.pmtown.com/archives/category/早報')url_obj?=?BeautifulSoup(obj1.text,?'lxml')url?=?url_obj.find('h2').find('a').get('href')first_url?=?'http://www.pmtown.com'?+?urlobj1?=?requests.get('http://www.pmtown.com/archives/category/早報')
url_obj?=?BeautifulSoup(obj1.text,?'lxml')
url?=?url_obj.find('h2').find('a').get('href')
first_url?=?'http://www.pmtown.com'?+?url
2.獲取日報頁面的日報內容
頁面1制作早報時,我們只需要新聞的標題即可,通過分析發現頁面比較簡單,所有的標題都在p下面,所以我們直接提取內容
#?獲取當前頁obj?=?requests.get(first_url)obj_1?=?BeautifulSoup(obj.text,?'lxml')titles?=?obj_1.findAll('p')#?獲得新聞標題a?=?[]for?title?in?titles:????a.append(title.get_text())obj?=?requests.get(first_url)
obj_1?=?BeautifulSoup(obj.text,?'lxml')
titles?=?obj_1.findAll('p')
#?獲得新聞標題
a?=?[]
for?title?in?titles:
????a.append(title.get_text())
獲取的內容部分截圖如下
3.文本處理
A網站日報的內容有科技頭條,國內動態,海外動態和投資收購四個模塊,實質得到的文本除了“科技頭條”得到的日報標題是列表,而其他3個模塊的日報標題各自在一整段字符串中,所以就要對字符串進行處理,使其成為列表
定義函數,將國內動態,海外動態和投資收購的日報標題分割開來,組成新的列表,這樣日報的4類內容的格式就統一了
#?將新聞文本格式統一,生成新的列表def?get_text(text_orgin):????#將標題的序號統一替換為‘sp’,然后將整段文本分割組成新的日報標題列表????first_list?=?re.sub(r'\d{1,2}、',?'SP',?text_orgin)????mid_list?=?first_list.split('SP')????finnal_list?=?mid_list[1:len(mid_list)]????return?finnal_listdef?get_text(text_orgin):
????#將標題的序號統一替換為‘sp’,然后將整段文本分割組成新的日報標題列表
????first_list?=?re.sub(r'\d{1,2}、',?'SP',?text_orgin)
????mid_list?=?first_list.split('SP')
????finnal_list?=?mid_list[1:len(mid_list)]
????return?finnal_list
上述步驟中,我們把標題的序號替換了,所以需要需要加上新的序號,具體操作
#?定義函數,給信息加上編號,輸出列表def?inf_list(inf_orgin):????inf_after?=?[]????for?num,?single_info?in?enumerate(inf_orgin):????????inf_after.append(u'%s、%s'?%?((num?+?1),?single_info))????return?inf_afterdef?inf_list(inf_orgin):
????inf_after?=?[]
????for?num,?single_info?in?enumerate(inf_orgin):
????????inf_after.append(u'%s、%s'?%?((num?+?1),?single_info))
????return?inf_after
二、生成早報圖片
首先導入畫圖的庫,這里使用PIL庫
from?PIL?import?Image,?ImageDraw,?ImageFontimport?Image,?ImageDraw,?ImageFont1.畫日報報頭
設置字體類型和顏色,字體類型后續會用到,字體需要填寫自己電腦上有的字體,window一般在C:/Windows/Fonts文件夾下,如果字體設置錯誤,程序會報錯。
#?設置字體樣式font_type?=?'C:/Windows/Fonts/simkai.ttf'font_medium_type?=?'C:/Windows/Fonts/simkai.ttf'header_font?=?ImageFont.truetype(font_medium_type,?55)title_font?=?ImageFont.truetype(font_medium_type,?20)font?=?ImageFont.truetype(font_type,?38)color?=?"#726053"color1?=?"#294E76"font_type?=?'C:/Windows/Fonts/simkai.ttf'
font_medium_type?=?'C:/Windows/Fonts/simkai.ttf'
header_font?=?ImageFont.truetype(font_medium_type,?55)
title_font?=?ImageFont.truetype(font_medium_type,?20)
font?=?ImageFont.truetype(font_type,?38)
color?=?"#726053"
color1?=?"#294E76"
(1)畫題目
header_x 和header_y是要畫圖的坐標,color是題目的顏色,header_font是題目的字體類型
#?開始畫圖header?=?'互聯網日報'header_x?=?130header_y?=?200draw.text((header_x,?header_y),?u'%s'?%?header,?color,?header_font)header?=?'互聯網日報'
header_x?=?130
header_y?=?200
draw.text((header_x,?header_y),?u'%s'?%?header,?color,?header_font)
(2)畫副標題
title?=?'由python腳本自動生成'title_x?=?header_xtitle_y?=?header_y?+?80draw.text((title_x,?title_y),?u'%s'?%?title,?color1,?title_font)title_x?=?header_x
title_y?=?header_y?+?80
draw.text((title_x,?title_y),?u'%s'?%?title,?color1,?title_font)
(3)添加當前時間
在圖片上添加生成圖片的時間,單純是為了顯得高大上
首先引入import time模塊,然后開始畫圖
cur_time?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())cur_time_x?=?666cur_time_y?=?title_ycur_time_font?=?ImageFont.truetype(font_type,?20)draw.text((cur_time_x,?cur_time_y),?u'%s'?%cur_time,?color,?cur_time_font)cur_time_x?=?666
cur_time_y?=?title_y
cur_time_font?=?ImageFont.truetype(font_type,?20)
draw.text((cur_time_x,?cur_time_y),?u'%s'?%cur_time,?color,?cur_time_font)
報頭效果預覽
2.畫日報內容
因為新聞標題很長(最多2行),而圖片是有寬度上限的,所以必須考慮換行的問題,我的處理方式是將原列表直接按照設定的寬度(我設定為750px)處理成為新列表,具體操作見下
def?old_to_new_list(oldlist):????newlist?=?[]????for?single_text?in?oldlist:????????if?font.getsize(single_text.strip())[0]?<?750?or?font.getsi(single_text.strip())?==?750:????????????newlist.append(single_text)????????else:????????????strList?=?[]????????????newStr?=?''????????????index?=?0????????????#?從字符串single_text逐個取字,直到總長度大于750px????????????for?item?in?single_text:????????????????newStr?+=?item????????????#gitsize可以同時輸出字符串的寬和高????????????????if?font.getsize(newStr.strip())[0]?>?750:????????????????????newlist.append(newStr[:-1])????????????????????newStr?=?''????????????????????#?如果后面長度沒有750px長就返回這部分字符串????????????????????if?font.getsize(single_text[index:])[0]?<?750:????????????????????????newlist.append(single_text[index:])????????????????????else:????????????????????????break????????????????index?+=?1????print(newlist)????return?newlist????newlist?=?[]
????for?single_text?in?oldlist:
????????if?font.getsize(single_text.strip())[0]?<?750?or?font.getsi(single_text.strip())?==?750:
????????????newlist.append(single_text)
????????else:
????????????strList?=?[]
????????????newStr?=?''
????????????index?=?0
????????????#?從字符串single_text逐個取字,直到總長度大于750px
????????????for?item?in?single_text:
????????????????newStr?+=?item
????????????#gitsize可以同時輸出字符串的寬和高
????????????????if?font.getsize(newStr.strip())[0]?>?750:
????????????????????newlist.append(newStr[:-1])
????????????????????newStr?=?''
????????????????????#?如果后面長度沒有750px長就返回這部分字符串
????????????????????if?font.getsize(single_text[index:])[0]?<?750:
????????????????????????newlist.append(single_text[index:])
????????????????????else:
????????????????????????break
????????????????index?+=?1
????print(newlist)
????return?newlist
接下來定義函數來畫圖,傳入畫圖開始的的坐標:x,y值,要畫的列表list,以及字體高度和標題文字;做函數的優點就在于不用重復寫代碼
def?draw_info(x,?y,?the_list,?linehigh,?title_text):????draw.text((x,?y),?u'%s'?%?(title_text),?color,?font)????for?num,?info?in?enumerate(the_list):????????height?=?num?*?linehigh????????draw.text((x,?y?+?height?+?80),?u'%s'?%?(info),?color,?font)????draw.text((x,?y),?u'%s'?%?(title_text),?color,?font)
????for?num,?info?in?enumerate(the_list):
????????height?=?num?*?linehigh
????????draw.text((x,?y?+?height?+?80),?u'%s'?%?(info),?color,?font)
比如繪制“科技新聞”,我們設定好繪畫坐標,標題,內容列表等,調用上面的函數即可,其他“科技新聞”,“海外新聞”和“融資收購”類似不做演示,原理相同
#?繪制科技keji_x?=?title_x?-?30keji_y?=?title_y?+?88title_text?=?'【科技新聞】'keji_text?=?a[1:gn:2]keji_newlist?=?old_to_new_list(keji_text)draw_info(keji_x,?keji_y,?keji_newlist,?linehigh,?title_text)keji_x?=?title_x?-?30
keji_y?=?title_y?+?88
title_text?=?'【科技新聞】'
keji_text?=?a[1:gn:2]
keji_newlist?=?old_to_new_list(keji_text)
draw_info(keji_x,?keji_y,?keji_newlist,?linehigh,?title_text)
來看成品
3.將日報發送給好友或微信群
首先引入wxpy庫,wxpy是python專門用于調取微信功能的庫
from?wxpy?import?*import?time#獲取系統時間cur_time?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())#初始化bot?=?Bot()time#獲取系統時間
cur_time?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())
#初始化
bot?=?Bot()
你可以把日報發送給好友,只需要填寫好友的昵稱,如果要發給多個好友,加入循環結構即可
myfriends?=?bot.friends().search('好友昵稱')[0]myfriends.send('python自動早報到了?'?+?cur_time)myfriends.send_image('日報.jpeg')'好友昵稱')[0]myfriends.send('python自動早報到了?'?+?cur_time)
myfriends.send_image('日報.jpeg')
早報
你也可以選擇把日報發送給微信群,操作類似
groups?=?['微信群的名字']for?send_OBJ?in?groups:????my_groups?=?bot.groups().search(groups)[0]????my_groups.send('python自動早報到了?'?+?cur_time)????my_groups.send_image('日報.jpeg')for?send_OBJ?in?groups:
????my_groups?=?bot.groups().search(groups)[0]
????my_groups.send('python自動早報到了?'?+?cur_time)
????my_groups.send_image('日報.jpeg')
如果有自己的微信群,需要每天做早報;或者你本身就是互聯網運營等職業,相信能給你節約大量的時間!
做一次的事尋找可行解,重復做的事尋找最優解。如果需要完整代碼,可以掃下方二維碼回復「日報」即可獲取哦。
總結
以上是生活随笔為你收集整理的Python 骚操作:如何给你爱的读者每天发早报?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习模型大合集:GitHub 趋势榜
- 下一篇: 杀手级 AI 补代码工具问世,支持 23