<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          瘋狂!丈母娘讓我用 Python 算領(lǐng)證吉日!

          共 2242字,需瀏覽 5分鐘

           ·

          2021-01-27 18:51

          文 |?閑歡

          來源:Python 技術(shù)「ID: pythonall」

          決定和女朋友去領(lǐng)證了,心里那個(gè)激動(dòng)啊,無以言表!我們倆都是比較隨性的,準(zhǔn)備拿到戶口本就去領(lǐng)。

          可誰知女朋友回家拿戶口本的時(shí)候,跟我說:最近可能領(lǐng)不了了!

          what?到手的鴨子要飛了?我心里咯噔一下。

          詢問后才知道,丈母娘說領(lǐng)證可以,但是要選擇一個(gè)良辰吉日,要求有倆:一個(gè)是看萬年歷,選取宜“婚假”的日子;一個(gè)是需要選擇農(nóng)歷的雙數(shù)日期,雙數(shù)代表吉利。

          聽了之后,我拍著胸脯說沒問題。接著準(zhǔn)備去翻萬年歷了,可不想這時(shí)候女朋友來一句:你個(gè)呆子,還準(zhǔn)備一天天地去翻啊?寫個(gè)小程序不就1秒鐘的事嗎?

          我拍了拍腦袋,對哦,還是老婆聰明!話不多說,打開電腦就開干。

          思路和實(shí)現(xiàn)

          我在百度輸入框輸入“萬年歷”查詢,彈出的第一個(gè)當(dāng)然是百度自己的萬年歷咯,但是我不想在百度上耗時(shí)間,因?yàn)闀r(shí)間緊,任務(wù)重,我選取一個(gè)相對容易的。

          這個(gè)網(wǎng)站看起來信息比較全,并且不是那種熱門的大網(wǎng)站,所以應(yīng)該獲取信息相對容易些。

          首頁也比較清晰明了,我所需要的幾大信息(日歷、農(nóng)歷日期、黃歷)都有。

          接著,我們來看看頁面的請求,來定位我們所需信息的請求。

          我在這個(gè)頁面不算多的請求里面發(fā)現(xiàn)了這個(gè)請求(https://staticwnl.tianqistatic.com/Public/Home/js/api/yjs/2021.js):

          這好像就是我們的目標(biāo)請求,我們來看看返回:

          非常好,人家一次性把一年的數(shù)據(jù)都返回了,感覺好簡單啊,都不用咱們一天天請求了。

          我再仔細(xì)看了下這個(gè)返回,發(fā)現(xiàn)并沒有那么簡單,我沒找到農(nóng)歷的日期:

          {
          ??"y":?[
          ????"祭祀",
          ????"塑繪",
          ????"開光",
          ????"裁衣",
          ????"冠笄",
          ????"嫁娶",
          ????"納采",
          ????"拆卸",
          ????"修造",
          ????"動(dòng)土",
          ????"豎柱",
          ????"上梁",
          ????"安床",
          ????"移徙",
          ????"入宅",
          ????"安香",
          ????"結(jié)網(wǎng)",
          ????"捕捉",
          ????"畋獵",
          ????"伐木",
          ????"進(jìn)人口",
          ????"放水"
          ??],
          ??"j":?[
          ????"出行",
          ????"安葬",
          ????"修墳",
          ????"開市"
          ??],
          ??"ts":?"占房床房內(nèi)北",
          ??"c":?"沖豬",
          ??"s":?"煞東",
          ??"zc":?"丁亥",
          ??"zh":?"執(zhí)",
          ??"yq":?"五富?益後",
          ??"yj":?"劫煞?小耗?復(fù)日?重日?元武"
          }

          我收起了天真,又開始尋找獲取農(nóng)歷日期的方法。我沒有找到獲取農(nóng)歷日期的請求,但是我發(fā)現(xiàn)了一個(gè)特別的請求:

          這個(gè)請求并沒有直接獲取農(nóng)歷日期,而是用 JavaScript 計(jì)算的,我們可以看到這個(gè)請求里面的計(jì)算方法:

          //======================================?算出農(nóng)歷,?傳入日期控件,?返回農(nóng)歷日期控件
          //???????????????????????????????????????該控件屬性有?.year?.month?.day?.isLeap
          //sDObj?=?new?Date(y,m,i+1);???當(dāng)月1日日期
          function?Lunar(objDate)?{
          ????var?i,?leap?=?0,?temp?=?0;
          ????var?offset?=?(Date.UTC(objDate.getFullYear(),?objDate.getMonth(),?objDate
          ????????????.getDate())?-?Date.UTC(1900,?0,?31))?/?86400000;
          ????for?(i?=?1900;?i??0;?i++)?{
          ????????temp?=?lYearDays(i);
          ????????offset?-=?temp;
          ????}
          ????if?(offset?????????offset?+=?temp;
          ????????i--;
          ????}
          ????this.year?=?i;
          ????leap?=?leapMonth(i);?//閏哪個(gè)月
          ????this.isLeap?=?false;
          ????for?(i?=?1;?i??0;?i++)?{
          ????????//閏月
          ????????if?(leap?>?0?&&?i?==?(leap?+?1)?&&?this.isLeap?==?false)?{
          ????????????--i;
          ????????????this.isLeap?=?true;
          ????????????temp?=?leapDays(this.year);
          ????????}?else?{
          ????????????temp?=?monthDays(this.year,?i);
          ????????}
          ????????//解除閏月
          ????????if?(this.isLeap?==?true?&&?i?==?(leap?+?1))?{
          ????????????this.isLeap?=?false;
          ????????}
          ????????offset?-=?temp;
          ????}
          ????if?(offset?==?0?&&?leap?>?0?&&?i?==?leap?+?1)?{
          ????????if?(this.isLeap)?{
          ????????????this.isLeap?=?false;
          ????????}?else?{
          ????????????this.isLeap?=?true;
          ????????????--i;
          ????????}
          ????}
          ????if?(offset?????????offset?+=?temp;
          ????????--i;
          ????}
          ????this.month?=?i;
          ????this.day?=?offset?+?1;
          }

          當(dāng)然,這個(gè) js 文件里面還有好多其他諸如計(jì)算星期、節(jié)假日之類的方法,我們可以把這個(gè) js 里面的方法實(shí)現(xiàn)用 python 來實(shí)現(xiàn)就可以計(jì)算出農(nóng)歷日期以及節(jié)假日之類的信息了。但是我的時(shí)間比較緊迫,所以我選擇用最簡單的辦法——百度。將度娘里面別人寫的方法直接拿來用,就不用重復(fù)造輪子了。

          搜索可以發(fā)現(xiàn)好多計(jì)算萬年歷信息的方法,我從其中選取了一個(gè)作為工具類來用。

          前奏已經(jīng)弄完了,接下來就好辦了,我們來看看代碼怎么寫。

          第一步是獲取某一年每天的信息:


          def?get_data(year):
          ????url?=?'https://staticwnl.tianqistatic.com/Public/Home/js/api/yjs/%d.js'?%?year
          ????response?=?requests.get(url)
          ????text?=?response.text
          ????start_str?=?'lmanac["%d"]?='?%?year
          ????his_end_str?=?';if(typeof(lmanac_2345)!="undefined"){lmanac_2345();}'
          ????cur_end_str?=?';if(typeof(lmanac_2345)!="undefined"){lmanac_2345()};'
          ????cur_year?=?datetime.datetime.now().year
          ????jsonstr?=?text.replace(start_str,?'')
          ????if?cur_year?==?year:
          ????????jsonstr?=?jsonstr.replace(cur_end_str,?'')
          ????else:
          ????????jsonstr?=?jsonstr.replace(his_end_str,?'')

          ????return?jsonstr
          ????

          這里需要注意的是,獲取到的結(jié)果數(shù)據(jù)在 JSON 數(shù)據(jù)的前后都加了字符串干擾信息,我們需要將這些字符串給去掉才能解析 JSON。

          你以為這樣就完了嗎?是不是發(fā)現(xiàn)用解析2021年的數(shù)據(jù)的方法去2020年的數(shù)據(jù)不行?你沒看錯(cuò),這里網(wǎng)站開發(fā)人員開了一個(gè)小玩笑,他們把結(jié)尾字符串里面的一個(gè)分號換了個(gè)位置。據(jù)我仔細(xì)觀察發(fā)現(xiàn),當(dāng)年的返回結(jié)果中這個(gè)分號是在最后的,而其他年份的返回?cái)?shù)據(jù)中這個(gè)分號是在大括號里面的。

          獲取到數(shù)據(jù)之后,我們就來計(jì)算日期:


          def?choose_day(year,?jsonstr):
          ????jobj?=?json.loads(jsonstr)
          ????for?day?in?jobj.keys():
          ????????y?=?jobj[day]['y']
          ????????if?'嫁娶'?in?y:
          ????????????dtime?=?datetime.datetime(year,?int(day[1:3]),?int(day[3:5]))
          ????????????#?獲取農(nóng)歷日期
          ????????????ludar_date?=?lunarUtils.get_ludar_date(dtime)
          ????????????#?取得日,然后看是否是雙數(shù)
          ????????????if?ludar_date[2]?%?2?==?0:
          ???????????????print('公歷日期:%s,農(nóng)歷日期:%s'?%?(day,?ludar_date))

          這里面就相對比較簡單了,先解析返回的 JSON 數(shù)據(jù),然后遍歷日期,獲取每天的信息,看哪天宜“嫁娶”,就再獲取這天的農(nóng)歷日期,看是不是雙數(shù),如果是的話,這就是我們的目標(biāo)日期。

          我最后獲得的日期是這樣子的:

          公歷日期:d0107,農(nóng)歷日期:(2020, 11, 24)
          公歷日期:d0122,農(nóng)歷日期:(2020, 12, 10)
          公歷日期:d0124,農(nóng)歷日期:(2020, 12, 12)
          公歷日期:d0126,農(nóng)歷日期:(2020, 12, 14)
          公歷日期:d0203,農(nóng)歷日期:(2020, 12, 22)
          公歷日期:d0209,農(nóng)歷日期:(2020, 12, 28)
          公歷日期:d0225,農(nóng)歷日期:(2021, 1, 14)
          公歷日期:d0305,農(nóng)歷日期:(2021, 1, 22)
          公歷日期:d0311,農(nóng)歷日期:(2021, 1, 28)
          公歷日期:d0318,農(nóng)歷日期:(2021, 2, 6)
          公歷日期:d0324,農(nóng)歷日期:(2021, 2, 12)
          公歷日期:d0401,農(nóng)歷日期:(2021, 2, 20)
          公歷日期:d0419,農(nóng)歷日期:(2021, 3, 8)
          公歷日期:d0425,農(nóng)歷日期:(2021, 3, 14)
          公歷日期:d0507,農(nóng)歷日期:(2021, 3, 26)
          公歷日期:d0513,農(nóng)歷日期:(2021, 4, 2)
          公歷日期:d0525,農(nóng)歷日期:(2021, 4, 14)
          公歷日期:d0531,農(nóng)歷日期:(2021, 4, 20)
          公歷日期:d0606,農(nóng)歷日期:(2021, 4, 26)
          公歷日期:d0613,農(nóng)歷日期:(2021, 5, 4)
          公歷日期:d0617,農(nóng)歷日期:(2021, 5, 8)
          公歷日期:d0619,農(nóng)歷日期:(2021, 5, 10)
          公歷日期:d0625,農(nóng)歷日期:(2021, 5, 16)
          公歷日期:d0701,農(nóng)歷日期:(2021, 5, 22)
          公歷日期:d0711,農(nóng)歷日期:(2021, 6, 2)
          公歷日期:d0713,農(nóng)歷日期:(2021, 6, 4)
          公歷日期:d0717,農(nóng)歷日期:(2021, 6, 8)
          公歷日期:d0723,農(nóng)歷日期:(2021, 6, 14)
          公歷日期:d0725,農(nóng)歷日期:(2021, 6, 16)
          公歷日期:d0729,農(nóng)歷日期:(2021, 6, 20)
          公歷日期:d0804,農(nóng)歷日期:(2021, 6, 26)
          公歷日期:d0811,農(nóng)歷日期:(2021, 7, 4)
          公歷日期:d0813,農(nóng)歷日期:(2021, 7, 6)
          公歷日期:d0815,農(nóng)歷日期:(2021, 7, 8)
          公歷日期:d0823,農(nóng)歷日期:(2021, 7, 16)
          公歷日期:d0827,農(nóng)歷日期:(2021, 7, 20)
          公歷日期:d0914,農(nóng)歷日期:(2021, 8, 8)
          公歷日期:d0926,農(nóng)歷日期:(2021, 8, 20)
          公歷日期:d1013,農(nóng)歷日期:(2021, 9, 8)
          公歷日期:d1015,農(nóng)歷日期:(2021, 9, 10)
          公歷日期:d1025,農(nóng)歷日期:(2021, 9, 20)
          公歷日期:d1029,農(nóng)歷日期:(2021, 9, 24)
          公歷日期:d1106,農(nóng)歷日期:(2021, 10, 2)
          公歷日期:d1110,農(nóng)歷日期:(2021, 10, 6)
          公歷日期:d1112,農(nóng)歷日期:(2021, 10, 8)
          公歷日期:d1116,農(nóng)歷日期:(2021, 10, 12)
          公歷日期:d1124,農(nóng)歷日期:(2021, 10, 20)
          公歷日期:d1130,農(nóng)歷日期:(2021, 10, 26)
          公歷日期:d1207,農(nóng)歷日期:(2021, 11, 4)
          公歷日期:d1211,農(nóng)歷日期:(2021, 11, 8)
          公歷日期:d1219,農(nóng)歷日期:(2021, 11, 16)
          公歷日期:d1223,農(nóng)歷日期:(2021, 11, 20)
          公歷日期:d1231,農(nóng)歷日期:(2021, 11, 28)

          看了一下,今天就是個(gè)好日子,公歷是0126,農(nóng)歷是1214,12+14=26,我覺得挺好,可惜今天錯(cuò)過了,只能推后了。我看了一下,要趕在年前領(lǐng)證的話,只有兩個(gè)日期可選了,我想選2月3日,這天正好立春,是個(gè)好日子。

          總結(jié)

          Python 應(yīng)用無處不在,只要善于運(yùn)用,我們的生活會(huì)更高效美好!我馬上要領(lǐng)證了,大家可否點(diǎn)個(gè)贊祝福一下?

          PS公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計(jì)劃!


          老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!

          代碼獲取方式

          識(shí)別文末二維碼,回復(fù):210127

          瀏覽 52
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  处一女一级a一片视频 | 国产又粗又长又大在线免费观看 | 欧美成人电影导航影院 | 在线观看亚洲免费视频 | 大香蕉官网|