使用Python自動(dòng)制作歷史上的今天宣傳圖片

大家好滩字,今天分享一個(gè)通過 Python 自動(dòng)創(chuàng)建相關(guān)圖片的教程,而這個(gè)相關(guān)圖片就是《歷史上的今天》御吞,那么為啥是歷史呢,因?yàn)樘}卜哥是一個(gè)歷史迷漓藕,從小就喜歡啃歷史書陶珠,隨著年齡的增長(zhǎng),這份熱情還是沒有減退~ 好了閑話不都說享钞,我們直接上干貨 ![](https://upload-images.jianshu.io/upload_images/5803165-c0faae5afa7c54a3.png) ## 數(shù)據(jù)獲取 首先就是數(shù)據(jù)哪里來揍诽,我試過使用網(wǎng)上的一些免費(fèi)歷史查詢接口,但是效果都不理想栗竖,這些接口不是太不穩(wěn)定暑脆,就是數(shù)據(jù)不友好。最后我還是選擇了一個(gè)精簡(jiǎn)的網(wǎng)站狐肢,直接扒網(wǎng)站頁面信息即可 > http://jintian.160.com/ 網(wǎng)站很簡(jiǎn)單添吗,也沒有任何反爬措施,我們直接抓取數(shù)據(jù) ```Python def get_data(month, day): result_dict = dict() for i in range(1, 3): url = "http://jintian.160.com/ashx/GreatThing.ashx?act=getgreatthinglist&page=%s&m=%s&d=%s&c=" % (str(i), month, day) data = requests.get(url) html = BeautifulSoup(data.json()["data"]) data_li = html.find_all("li") for li in data_li: result = deal_some(li.text) tmp = result.split(" ") year = tmp[0].split("年")[0] new_day = tmp[0].split("年")[1] result_dict[year] = tmp[1] return result_dict, new_day ``` 這里提供了月和天的變量份名,就是為了后面我們做成 web 服務(wù)時(shí)可以方面的獲取任何時(shí)間的歷史信息 然后我們?cè)倬帉懸粋€(gè)函數(shù)碟联,把獲取到的數(shù)據(jù)轉(zhuǎn)化成 DataFrame 格式 ```Python def gen_df(result_dict): df = pd.DataFrame.from_dict(result_dict, orient='index', columns=['事件']) df = df.reset_index().rename(columns={'index': '年份'}) return df ``` ## 圖片制作 對(duì)于最終生成的圖片,使用的是 PyEcharts 制作僵腺,核心代碼復(fù)用了《可以叫我才哥》公眾號(hào)號(hào)主`才哥`的相關(guān)代碼鲤孵,下面我們簡(jiǎn)單解析下相關(guān)代碼 首先我們明確圖片基礎(chǔ)是 Line 類型,沒錯(cuò)就是我們平時(shí)用的最多的折線圖辰如! 先生成 Y 軸 數(shù)據(jù) ```Python def gen_y(data): y_data = [] counter = 0 position = ['left', 'right'] for idx, row in data.iterrows(): msg = '{bbb|%s}\n{aaa|%s}' % (row['年份'], row['事件']) l_item = opts.LineItem( name=10, value=counter, symbol='emptyCircle', symbol_size=10, label_opts=opts.LabelOpts( is_show=True, font_size=16, position=position[counter%2], formatter=msg, rich = { 'aaa': { 'fontSize': 18, 'color': 'red', 'fontWeight':'bold', 'align':position[(counter+1)%2], }, 'bbb': { 'fontSize': 15, 'color': '#000', 'align':position[(counter+1)%2]}} ) ) y_data.append(l_item) counter+=1 return y_data ``` 使用系列配置`pyecharts.options`當(dāng)中的`LineItem`類普监,不過很奇怪的是,這個(gè)類竟然在 PyEcharts 官網(wǎng)中找不到琉兜,還是查看了官方源碼才大概了解其作用 ```Python class LineItem(BasicOpts): def __init__( self, name: Union[str, Numeric] = None, value: Union[str, Numeric] = None, *, symbol: Optional[str] = "circle", symbol_size: Numeric = 4, symbol_rotate: Optional[Numeric] = None, symbol_keep_aspect: bool = False, symbol_offset: Optional[Sequence] = None, label_opts: Union[LabelOpts, dict, None] = None, itemstyle_opts: Union[ItemStyleOpts, dict, None] = None, tooltip_opts: Union[TooltipOpts, dict, None] = None, ): self.opts: dict = { "name": name, "value": value, "symbol": symbol, "symbolSize": symbol_size, "symbolRotate": symbol_rotate, "symbolKeepAspect": symbol_keep_aspect, "symbolOffset": symbol_offset, "label": label_opts, "itemStyle": itemstyle_opts, "tooltip": tooltip_opts, } ``` 大概的意思就是批量的設(shè)置 Line 的屬性凯正,這里不得不吐槽下 PyEcharts 官方文檔,真的該好好維護(hù)下啊~(如果我這里理解的不對(duì)呕童,歡迎指出漆际,咱們一起學(xué)習(xí)~) 也就是說上面的代碼生成了一系列數(shù)據(jù),這些數(shù)據(jù) X 軸都是 10夺饲,Y 軸是從 0 開始奸汇,一直到循環(huán)的最后一個(gè)值遞增施符,同時(shí)還通過`LabelOpts`設(shè)置了 msg 信息,也就是我們最終看到的歷史信息 XY 軸數(shù)據(jù)設(shè)置好之后擂找,就是其他的樣式調(diào)整了 ```Python def myLine(y, day): line = Line( init_opts=opts.InitOpts( theme='light', width='1000px', height='800px' ) ) line.add_xaxis( [''] ) line.add_yaxis( '', y, linestyle_opts={ 'normal': { 'width': 4, # 設(shè)置線寬 'color':'red', 'shadowColor': 'rgba(155, 18, 184, .3)', # 陰影顏色 'shadowBlur': 10, # 陰影大小 'shadowOffsetY': 10, # Y軸方向陰影偏移 'shadowOffsetX': 10, # x軸方向陰影偏移 } }, itemstyle_opts={ 'normal': { 'color':'red', 'shadowColor': 'rgba(155, 18, 184, .3)', # 陰影顏色 'shadowBlur': 10, # 陰影大小 'shadowOffsetY': 10, # Y軸方向陰影偏移 'shadowOffsetX': 10, # x軸方向陰影偏移 } }, tooltip_opts=opts.TooltipOpts(is_show=False) ) line.set_global_opts( xaxis_opts=opts.AxisOpts(is_show=False, type_='category'), yaxis_opts=opts.AxisOpts(is_show=False, type_='value', max_=len(y)), title_opts=opts.TitleOpts( title="歷史上的今天-%s" % day, pos_left='center', pos_top='2%', title_textstyle_opts=opts.TextStyleOpts(color='red', font_size=20), subtitle="公眾號(hào):蘿卜大雜燴 出品" ), toolbox_opts=opts.ToolboxOpts( is_show=True, orient="vertical", feature=opts.ToolBoxFeatureOpts( save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(type_="jpeg", title="保存為jpeg", background_color="white"), restore=opts.ToolBoxFeatureRestoreOpts(), data_view=opts.ToolBoxFeatureDataViewOpts(), data_zoom=opts.ToolBoxFeatureDataZoomOpts(), magic_type=opts.ToolBoxFeatureDataViewOpts(), brush=opts.ToolBoxFeatureDataZoomOpts(), ) ), graphic_opts=[ opts.GraphicGroup( graphic_item=opts.GraphicItem(id_='1',left="center", top="center", z=-1), children=[# tokyo opts.GraphicImage(graphic_item=opts.GraphicItem(id_="logo", left='center', z=-1), graphic_imagestyle_opts=opts.GraphicImageStyleOpts( image="1.jpg", width=800, height=1000, opacity=0.1,) ) ] ) ] ) return line ``` 這里考驗(yàn)的就是 PyEcharts 的熟練程度了戳吝,反正蘿卜我是不達(dá)標(biāo)的,這樣樣式如果是我自己贯涎,可能要對(duì)照官網(wǎng)調(diào)整大半天听哭,哈哈哈 好了,圖片制作就介紹到這里 ## 部署 Web 服務(wù) 因?yàn)橛袀€(gè)需求就是每天獲取圖片塘雳,然后轉(zhuǎn)發(fā)到微信群陆盘,那么最方便的方法就是部署成 Web,在公網(wǎng)上訪問即可 對(duì)于這種臨時(shí)的败明,個(gè)人網(wǎng)站隘马,還是推薦使用 Flask,畢竟快就是優(yōu)勢(shì)(這里的快指的是編寫快妻顶,上手快~) 導(dǎo)入 Flask 和 PyEcharts 相關(guān)庫 ```Python from flask import Flask from jinja2 import Markup, Environment, FileSystemLoader from pyecharts.globals import CurrentConfig import datetime from flask import request # 關(guān)于 CurrentConfig酸员,可參考 [基本使用-全局變量] CurrentConfig.GLOBAL_ENV = Environment(loader=FileSystemLoader("./templates")) ``` 然后設(shè)置路由函數(shù) ```Python def gen_line(month, day): result_dict, day = get_data(month, day) df = gen_df(result_dict) y = gen_y(df) line = myLine(y, day) return line @app.route("/") def index(): month = request.args.get("month") day = request.args.get("day") if month and day: c = gen_line(month, day) return Markup(c.render_embed()) i = datetime.datetime.now() c = gen_line(i.month, i.day) return Markup(c.render_embed()) ``` 這樣就好了,通過 Flask 自帶的 Web 容器啟動(dòng)即可 ```python if __name__ == "__main__": app.run(debug=True, host="0.0.0.0") ``` 好了讳嘱,今天的分享就到這里幔嗦,想要體驗(yàn)的同學(xué),可以訪問這個(gè)網(wǎng)址 > http://47.105.185.84:8080/ 看到這里的朋友沥潭,如果你覺得滿意請(qǐng)務(wù)必點(diǎn)個(gè)贊 + 在看 支持下邀泉。 一鍵三連,私信獲取完整代碼~ 本文由[mdnice](https://mdnice.com/?platform=6)多平臺(tái)發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钝鸽,一起剝皮案震驚了整個(gè)濱河市呼渣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寞埠,老刑警劉巖屁置,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仁连,居然都是意外死亡蓝角,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門饭冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來使鹅,“玉大人,你說我怎么就攤上這事昌抠』贾欤” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵炊苫,是天一觀的道長(zhǎng)裁厅。 經(jīng)常有香客問我冰沙,道長(zhǎng),這世上最難降的妖魔是什么执虹? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任拓挥,我火速辦了婚禮,結(jié)果婚禮上袋励,老公的妹妹穿的比我還像新娘侥啤。我一直安慰自己,他們只是感情好茬故,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布盖灸。 她就那樣靜靜地躺著,像睡著了一般磺芭。 火紅的嫁衣襯著肌膚如雪糠雨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天徘跪,我揣著相機(jī)與錄音,去河邊找鬼琅攘。 笑死垮庐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坞琴。 我是一名探鬼主播哨查,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剧辐!你這毒婦竟也來了寒亥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤荧关,失蹤者是張志新(化名)和其女友劉穎溉奕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍啤,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡加勤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同波。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳄梅。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖未檩,靈堂內(nèi)的尸體忽然破棺而出戴尸,到底是詐尸還是另有隱情,我是刑警寧澤冤狡,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布孙蒙,位于F島的核電站项棠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏马篮。R本人自食惡果不足惜沾乘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浑测。 院中可真熱鬧翅阵,春花似錦、人聲如沸迁央。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岖圈。三九已至讹语,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜂科,已是汗流浹背顽决。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留导匣,地道東北人才菠。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贡定,于是被迫代替她去往敵國(guó)和親赋访。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容