日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python 骚操作:如何给你爱的读者每天发早报?

發(fā)布時(shí)間:2024/9/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 骚操作:如何给你爱的读者每天发早报? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??點(diǎn)擊“小詹學(xué)Python”,星標(biāo)公眾號(hào)

重磅干貨,第一時(shí)間送達(dá)


早報(bào)

最近和一個(gè)朋友嘮嗑,聽她吐槽了好久……

她是一個(gè)社群運(yùn)營(yíng),每天早上收集信息、整理、排版、到推送社群,大概要花費(fèi)30分鐘,需要花費(fèi)大量的時(shí)間和精力,苦不堪言。

那么有沒有辦法將這個(gè)流程自動(dòng)化呢?于是乎,我們想到了 「?除了生孩子無所不能的 Python 」請(qǐng)接著看!

早報(bào)圖片

思路很簡(jiǎn)單,分為3步:

1.從目標(biāo)網(wǎng)站采集信息;

2.將采集到的信息生成早報(bào)圖片

3.將生成的圖片發(fā)送到微信群或好友

實(shí)現(xiàn)流程

一、早報(bào)數(shù)據(jù)收集

網(wǎng)絡(luò)上有很多提供早報(bào)的網(wǎng)站,這里為了避免做廣告,但是為了演示方便,只提供地址,不說明名字,下文將我采集的網(wǎng)站稱為A網(wǎng)站,A網(wǎng)站有專門的早報(bào)模塊

A網(wǎng)站

1.獲取最新日?qǐng)?bào)的url

首先獲取A網(wǎng)站最新早報(bào)頁面的鏈接,通過查看網(wǎng)頁源代碼發(fā)現(xiàn),所有的展示信息在頁面 li 中,我們要獲取的鏈接的地址正好在h2中,所以分析完畢開始提取鏈接

image.png

首先引入相關(guān)的網(wǎng)絡(luò)請(qǐng)求庫(kù)u,如下圖

import?requestsfrom?bs4?import?BeautifulSoup
from?bs4?import?BeautifulSoup

點(diǎn)擊第一個(gè)早報(bào)信息進(jìn)入后鏈接為https://www.pmtown.com/archives/197318.html,而我們使用find方式找到最新日?qǐng)?bào)頁面的鏈接為相對(duì)路徑/archives/197318.html,所以需要我們手動(dòng)組裝完整的URL,具體見下方。

#?獲取第一個(gè)早報(bào)的urlobj1?=?requests.get('http://www.pmtown.com/archives/category/早報(bào)')url_obj?=?BeautifulSoup(obj1.text,?'lxml')url?=?url_obj.find('h2').find('a').get('href')first_url?=?'http://www.pmtown.com'?+?url
obj1?=?requests.get('http://www.pmtown.com/archives/category/早報(bào)')
url_obj?=?BeautifulSoup(obj1.text,?'lxml')
url?=?url_obj.find('h2').find('a').get('href')
first_url?=?'http://www.pmtown.com'?+?url

2.獲取日?qǐng)?bào)頁面的日?qǐng)?bào)內(nèi)容

頁面1

制作早報(bào)時(shí),我們只需要新聞的標(biāo)題即可,通過分析發(fā)現(xiàn)頁面比較簡(jiǎn)單,所有的標(biāo)題都在p下面,所以我們直接提取內(nèi)容

#?獲取當(dāng)前頁obj?=?requests.get(first_url)obj_1?=?BeautifulSoup(obj.text,?'lxml')titles?=?obj_1.findAll('p')#?獲得新聞標(biāo)題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')

#?獲得新聞標(biāo)題
a?=?[]
for?title?in?titles:
????a.append(title.get_text())

獲取的內(nèi)容部分截圖如下

內(nèi)容截圖

3.文本處理

A網(wǎng)站日?qǐng)?bào)的內(nèi)容有科技頭條,國(guó)內(nèi)動(dòng)態(tài),海外動(dòng)態(tài)和投資收購(gòu)四個(gè)模塊,實(shí)質(zhì)得到的文本除了“科技頭條”得到的日?qǐng)?bào)標(biāo)題是列表,而其他3個(gè)模塊的日?qǐng)?bào)標(biāo)題各自在一整段字符串中,所以就要對(duì)字符串進(jìn)行處理,使其成為列表

文本處理

定義函數(shù),將國(guó)內(nèi)動(dòng)態(tài),海外動(dòng)態(tài)和投資收購(gòu)的日?qǐng)?bào)標(biāo)題分割開來,組成新的列表,這樣日?qǐng)?bào)的4類內(nèi)容的格式就統(tǒng)一了

#?將新聞文本格式統(tǒng)一,生成新的列表def?get_text(text_orgin):????#將標(biāo)題的序號(hào)統(tǒng)一替換為‘sp’,然后將整段文本分割組成新的日?qǐng)?bào)標(biāo)題列表????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?get_text(text_orgin):
????#將標(biāo)題的序號(hào)統(tǒng)一替換為‘sp’,然后將整段文本分割組成新的日?qǐng)?bào)標(biāo)題列表
????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

上述步驟中,我們把標(biāo)題的序號(hào)替換了,所以需要需要加上新的序號(hào),具體操作

#?定義函數(shù),給信息加上編號(hào),輸出列表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_after
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_after

二、生成早報(bào)圖片

首先導(dǎo)入畫圖的庫(kù),這里使用PIL庫(kù)

from?PIL?import?Image,?ImageDraw,?ImageFontimport?Image,?ImageDraw,?ImageFont

1.畫日?qǐng)?bào)報(bào)頭

設(shè)置字體類型和顏色,字體類型后續(xù)會(huì)用到,字體需要填寫自己電腦上有的字體,window一般在C:/Windows/Fonts文件夾下,如果字體設(shè)置錯(cuò)誤,程序會(huì)報(bào)錯(cuò)。

#?設(shè)置字體樣式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是要畫圖的坐標(biāo),color是題目的顏色,header_font是題目的字體類型

#?開始畫圖header?=?'互聯(lián)網(wǎng)日?qǐng)?bào)'header_x?=?130header_y?=?200draw.text((header_x,?header_y),?u'%s'?%?header,?color,?header_font)
header?=?'互聯(lián)網(wǎng)日?qǐng)?bào)'
header_x?=?130
header_y?=?200
draw.text((header_x,?header_y),?u'%s'?%?header,?color,?header_font)

(2)畫副標(biāo)題

title?=?'由python腳本自動(dòng)生成'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)添加當(dāng)前時(shí)間

在圖片上添加生成圖片的時(shí)間,單純是為了顯得高大上

首先引入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)

報(bào)頭效果預(yù)覽

報(bào)頭效果預(yù)覽

2.畫日?qǐng)?bào)內(nèi)容

因?yàn)樾侣剺?biāo)題很長(zhǎng)(最多2行),而圖片是有寬度上限的,所以必須考慮換行的問題,我的處理方式是將原列表直接按照設(shè)定的寬度(我設(shè)定為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逐個(gè)取字,直到總長(zhǎng)度大于750px????????????for?item?in?single_text:????????????????newStr?+=?item????????????#gitsize可以同時(shí)輸出字符串的寬和高????????????????if?font.getsize(newStr.strip())[0]?>?750:????????????????????newlist.append(newStr[:-1])????????????????????newStr?=?''????????????????????#?如果后面長(zhǎng)度沒有750px長(zhǎng)就返回這部分字符串????????????????????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逐個(gè)取字,直到總長(zhǎng)度大于750px
????????????for?item?in?single_text:
????????????????newStr?+=?item
????????????#gitsize可以同時(shí)輸出字符串的寬和高
????????????????if?font.getsize(newStr.strip())[0]?>?750:
????????????????????newlist.append(newStr[:-1])
????????????????????newStr?=?''
????????????????????#?如果后面長(zhǎng)度沒有750px長(zhǎng)就返回這部分字符串
????????????????????if?font.getsize(single_text[index:])[0]?<?750:
????????????????????????newlist.append(single_text[index:])
????????????????????else:
????????????????????????break

????????????????index?+=?1
????print(newlist)
????return?newlist

接下來定義函數(shù)來畫圖,傳入畫圖開始的的坐標(biāo):x,y值,要畫的列表list,以及字體高度和標(biāo)題文字;做函數(shù)的優(yōu)點(diǎn)就在于不用重復(fù)寫代碼

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)

比如繪制“科技新聞”,我們?cè)O(shè)定好繪畫坐標(biāo),標(biāo)題,內(nèi)容列表等,調(diào)用上面的函數(shù)即可,其他“科技新聞”,“海外新聞”和“融資收購(gòu)”類似不做演示,原理相同

#?繪制科技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)

來看成品

日?qǐng)?bào)成品

3.將日?qǐng)?bào)發(fā)送給好友或微信群

首先引入wxpy庫(kù),wxpy是python專門用于調(diào)取微信功能的庫(kù)

from?wxpy?import?*import?time#獲取系統(tǒng)時(shí)間cur_time?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())#初始化bot?=?Bot()time
#獲取系統(tǒng)時(shí)間
cur_time?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())
#初始化
bot?=?Bot()

你可以把日?qǐng)?bào)發(fā)送給好友,只需要填寫好友的昵稱,如果要發(fā)給多個(gè)好友,加入循環(huán)結(jié)構(gòu)即可

myfriends?=?bot.friends().search('好友昵稱')[0]myfriends.send('python自動(dòng)早報(bào)到了?'?+?cur_time)myfriends.send_image('日?qǐng)?bào).jpeg')'好友昵稱')[0]
myfriends.send('python自動(dòng)早報(bào)到了?'?+?cur_time)
myfriends.send_image('日?qǐng)?bào).jpeg')
早報(bào)

你也可以選擇把日?qǐng)?bào)發(fā)送給微信群,操作類似

groups?=?['微信群的名字']for?send_OBJ?in?groups:????my_groups?=?bot.groups().search(groups)[0]????my_groups.send('python自動(dòng)早報(bào)到了?'?+?cur_time)????my_groups.send_image('日?qǐng)?bào).jpeg')
for?send_OBJ?in?groups:
????my_groups?=?bot.groups().search(groups)[0]
????my_groups.send('python自動(dòng)早報(bào)到了?'?+?cur_time)
????my_groups.send_image('日?qǐng)?bào).jpeg')

如果有自己的微信群,需要每天做早報(bào);或者你本身就是互聯(lián)網(wǎng)運(yùn)營(yíng)等職業(yè),相信能給你節(jié)約大量的時(shí)間!

做一次的事尋找可行解,重復(fù)做的事尋找最優(yōu)解。如果需要完整代碼,可以掃下方二維碼回復(fù)「日?qǐng)?bào)」即可獲取哦。

總結(jié)

以上是生活随笔為你收集整理的Python 骚操作:如何给你爱的读者每天发早报?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。