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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法

發布時間:2024/1/8 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章不談江流所專研的營銷與運營,而聊一聊技能學習之路,聊一聊Python這門最簡單的編程語言該如何學習,我完成的第一個Python項目,將任意公眾號的所有歷史文章導出成PDF電子書。

或許我這個Python初學者的學習路徑能給你帶來啟發,或許你產生了要學一門新技術的沖動。

文末附送了學習資源通道。

學習python兩度放棄最終有所成

我想要學python五年了,三度捧起python入門書決定開啟學習,到第三次才算上道了。

第一次死于安裝軟件環境,安裝碰了太多壁,面對各種困難無從解決而擱置。所以傳說三分之一python學習者死于安裝軟件,此言不虛。

第二次死于一直找不到成就感。從學習python到能夠正經用python干些有意義的事情,太費時,于是擱置了。這實際上是學習方法不對,花費太多時間學習知識點,而不是盡早通過解決實際問題學習。

第三次,經過一個星期的死磕,終于完成了爬取任意公眾號歷史文章并生成PDF文集這件事。獲得了成就感,也在死磕的過程中總算入門了python。

Python很火,誰都可以學

想要學一項技能與學成一項技能之間往往有些差距,我們往往想得多,而堅持的少。所以堅持了一件事情,就值得寫文章紀念一下,并給他人以啟迪。

python火了幾年了,有詩為證,“人生苦短,快學python”。

python幾乎是各種編程語言里最簡單易學的語言,python的應用范圍很廣,爬蟲,數據分析,網站開發,自動化辦公,機器學習,云計算,python有大量的庫,意味著我們用python編程可以充分利用前人的勞動成果,對程序進行改編,或者運用前人編好的功能模塊,進行重新組合,來創造達你的新程序。結果是你用C++可能要寫1000行代碼,用Python寫50行代碼就干了同樣的事情。

傳說有些娛樂圈明星在學python,雖然我目前也沒有看到她們的學習成果,可能有的放棄了,可能有的已經在悶聲發大財。

知名商人潘石屹,賣了自己的地產,也專心學python去了,他已經堅持微博打卡學python半年多了,每條微博都會提及輔導自己Python的培訓機構。我們也不知道他是單純的行為藝術癖好呢,還是就是想體會中學生刷題的樂趣呢,還是是因為改行做了某培訓機構的幕后股東為其站臺。

我們學python可沒刷半年題的耐心,追求的就是能快速豐富自己的能力,創造更多可能性。

學習Python的最短準備路徑

學習Python第一步:裝合適的軟件環境,買一本合適的入門書

我最開始,看到各種討論安裝哪個python版本,安裝什么樣的python環境,怎么安裝需要用到的各種包,觀點不一,而且容易安裝失敗。這個過程讓很多人絕望。

趟過各種坑后,推薦初學者無腦按以下步驟來:

下載安裝python3.7版本。其他python3的版本應該也可以。

下載pycharm(感謝北京的張祥幫忙下載安裝),我的是JetBrains PyCharm 2018.3.2版本。

搜索下pycharm激活碼(激活碼經常失效,后臺可告訴你怎么找激活碼,我試了挺多激活碼都無效的)

買本《Python編程快速上手:讓繁瑣工作自動化(第2版)》,這本書豆瓣評分9.0分,其實作者在他的個人網站發布了該書1.0版的英文版,書中有網站鏈接,用chrome瀏覽器的自帶翻譯也能流暢閱讀。但我總覺得學習一項技能要買本書創造點儀式感。

有很多人推薦廖雪峰的Python入門教程,網上可以搜到網站,但我看了下目錄,總覺得學習過程過于漫長,離上手項目太遙遠,很容易促使新手放棄。

而《Python編程快速上手》這本書,只需要看基礎部分那110頁,然后看自動化任務部分的兩個章節,比如對我要做的爬蟲項目有用的是讀寫文件這個章節和從web抓取信息這個章節。其他內容則是在項目實踐過程中,遇到了問題,再回頭查找書中的相關內容補充。

這是我目前認為的自學Python的最短路徑。

安裝各種第三方包

Python的妙處是有大量的第三方開發的包,用于各種功能,你在某個具體項目中,可能會用到其中的幾個包,這些包就節省了你大量的工作量。

進入PyCharm,進入File-Settings-Project-Project Interpreter,點擊右側的“+”號,就可以搜索你需要的包,點擊Install安裝了。

有時會安裝失敗,但成功率高于其他方式。如果安裝失敗,你可以考慮1、等網絡狀況好了再試試;2、打開VPN再下載;3、在Pycharm界面底部選擇Terminal,然后輸入pip install +要安裝的包。

上GITHUB找相關項目代碼

我們初學者,最好的方式是找前人的項目代碼研究。通過改編借鑒別人的代碼或者思路,來實現自己的目的。

我遵循行業規矩,上GITHUB網站(https://github.com/)搜索相關項目,GITHUB的用法還需要學習下,B站上有一些視頻教程。我遵循規矩在GITHUB注冊了賬號,然后安裝了GITHUB Desktop(就是桌面客戶端)。

這樣,我就可以

1、登陸GITHUB網站搜索相關項目。

2、點擊搜索結果查看可能相關的項目。

3、點擊綠色按鈕Clone or Download,再點擊Open in Desktop,將項目保存到本地。

4、在本地保存項目的文件夾里,打開py后綴的文件,查看和修改項目代碼。

這里GITHUB Desktop的作用似乎可有可無,但是當我們跨過了初學者的階段,才會發現它的作用,作用是方便保管項目文件,并顯示項目更新,并同步到云上,以便其他人能夠同步改進。

GITHUB的項目下載速度很慢,可以試試打開VPN加速。有人推薦國內版的GITHUB“碼云”,說下載速度更快,說能把GITHUB上的代碼同步到碼云然后下載,我注冊了,但還沒正式用。

梳理項目邏輯

《Python編程快速上手》這本書的一個妙處在于,教給了我們簡潔的工作方法。指導我們在開始項目前先要梳理這個程序需要依次實現的動作。

以我完成的爬取公眾號歷史文章這個項目為例。

第一步:我給自己樹立了一個任務,就是要把某一個微信公眾號的歷史文章都整理到一個pdf文檔里。方便我存檔信息。

第二步:分解步驟,我認為要完成我這個任務,我需要做三件事。

1、找到獲得公眾號歷史文章url的方式。

2、抓去到這個公眾號所有歷史文章的url,并保存到一個文件中。

3、讀取每個文章的url鏈接里的文章內容,生成pdf文件。

通過看書,我已經知道了第三步用pdfkit這個包就可以完成,將url等數據保存到csv文件里也可以完成。所以任務變成了,如何抓取到一個公眾號所有歷史文章的url鏈接了。

第三步:去GITHUB里找相關項目。

由于微信的挺強的反爬蟲能力,很多相關項目都已經不能順利運行,我們需要尋找相似的項目,分析其邏輯是否可行。

我找到一個項目,里面討論了獲取url的幾種方法。根據爬蟲所見即所得的原則,你在前端能看到的東西,就一定能用爬蟲爬到。

這里就要插入一個知識點了。在chrome瀏覽器某個頁面,按F12鍵,可以打開瀏覽器的開發者模式,可以查看這個網頁的源代碼。只要你在某個頁面的源代碼中可以找到url,這個 url就可以被爬到。

有一種方法是微信PC端查看公眾號的歷史文集時可以看到url,但以前我看一個爬蟲教程教這種方法時,在手機與電腦連接同一個wifi的過程中,遇到了難處,可能是手機的問題,所以這次我就沒敢嘗試這種方法。

有一種方法是通過個人微信號登陸后臺,搜索任意公眾號,可以看到這個公眾號發的文章,可以查到文章的永久鏈接。于是我決定使用這種方法。

網上看到很多文章的方法是通過搜狗搜索引擎搜索公眾號文章,進行篩選,然而問題是搜狗只顯示100頁搜索結果,并且不一定能夠做到搜索精確,所以幾乎不可能做到下載一個 公眾號的所有歷史文章,故排除這一思路。

在GITHUB上下載了運用個人微信公眾號這個方法的python代碼,run了一下失敗了。然后就開始讀代碼,想弄明白這個代碼的邏輯是什么樣子的,在哪些問題上需要修改。

發現問題,解決問題

有了現成的代碼后,我的任務進一步細化。在現有代碼的基礎上,梳理邏輯,尋找出錯的地方,尋找已經過時的地方。我只需要解決現有代碼中出現的bug,一個個解決掉,就應該能夠爬到url。

我發現這個程序用到的是selenium包,于是從頭去了解了selenium這個包的特點,工作原理,入門書里的相關章節。

selenium是一種Python可以用的爬蟲工具,特點是模擬人操作電腦完成各種動作,比如自動打開某些頁面,進行翻頁,點擊,動作等,比如解讀某個頁面的源代碼,提取出url等內容。優點是你只要人工能完成的動作就能用selenium完成,缺點是速度慢,容易被反爬蟲檢測到。

經過閱讀代碼,我發現這個程序的邏輯是這樣的:

1、通過import工具引入需要用到的包。

2、通過def語句,定義一些需要用到的動作。

3、按順序排列這個程序依次需要執行的動作。

4、通過for循環實現依次完成抓取url的重復性動作。

5、將抓取到的url保存到一個數組,再保存到一個數據庫中。

由于我還沒有學習python和數據庫是如何配合的,我想將數據保存到csv文件中,應該也可以被調用,并且csv文件我可以直接打開查看效果。

于是我將步驟5的代碼從保存到數據庫改為保存到csv文件。為了怕我反悔,我在代碼前添加#號讓某些代碼不被執行。

以下是原代碼中保存到數據庫的代碼,被我棄用。

with open('data2.pickle', 'wb') as f:pickle.dump(data, f) # 讀取 with open('data.pickle', 'rb') as f:b = pickle.load(f)

我改為保存到csv文件的代碼。

outputFile = open('outputurl.csv','w',newline='') outputWriter = csv.writer(outputFile) outputWriter.writerow(url_title_lst) outputFile.close()

這段代碼確實實現了將數據保存到csv文件,但是格式很有問題,之后放我后來發現問題并更改的代碼。

解決bug1:

原代碼作者有提醒,為了使用selenium,需要使用與chrome瀏覽器相對應的chrome driver,為了滿足這個要求,也花了我不少功夫。最后百度搜索了一番,終于找到了適配的chrome driver,成功的標志是運行程序時,chrome瀏覽器被自動啟動了。搜索關鍵詞“selenium chrome driver”

看到chrome瀏覽器自動啟動的時候,內心開心,因為這個程序我已經跑通了第一步。

解決bug2:

chrome瀏覽器自動啟動,并打開了微信公眾平臺的登陸頁,然而程序停了。

于是我看代碼尋找原因。

def login(username, password):#打開微信公眾號登錄頁面driver.get('https://mp.weixin.qq.com/')driver.maximize_window()time.sleep(3)# 自動填充帳號密碼driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[1]/div/span/input").clear()driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[1]/div/span/input").send_keys(username)driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[2]/div/span/input").clear()driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[2]/div/span/input").send_keys(password)time.sleep(1)#自動點擊登錄按鈕進行登錄driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[4]/a").click()# 拿手機掃二維碼!time.sleep(15)

猜想是在自動填充的過程中出bug了 。driver.find_element_by_xpath這個句子我似乎見過,翻入門書發現,是selenium里的語句,意思是通過xpath這種方式來尋找元素。
后面的后綴很容易猜,clear()意思是清空內容,sen_keys()意思是填入內容,click()意思是點擊,time.sleep(1)意思是程序休息1秒鐘。

于是我猜想可能是程序里面定位的位置錯了吧。于是百度搜索selenium的find_element_by語句的用法講解,并搜索xpath相關的內容,xpath后面是什么意思。搜索關鍵詞“selenium find_element_by”

按F12打開開發者工具,點擊左側的箭頭按鈕,然后光標移到頁面中你要定位的的區域,在下方就可以看到當前區域的代碼塊。此時點擊右鍵,下方代碼就定位到這個代碼塊,在這個代碼塊再點擊右鍵,copy-xpath,我粘貼到其他地方,發現復制的代碼和原代碼里xpath()的內容很相似。我猜想,只需要替換xpath()里的代碼就可以正確定位了。

替換了xpath里的內容后,再運行程序,自動填充賬號密碼的動作果真完成了。

注意,原代碼是進入微信公眾平臺登陸頁面后就直接填寫賬號密碼了,而我登陸微信公眾平臺時發現優先項是先掃二維碼,于是模仿原代碼用driver.find_element_by_xpath語句加了個點擊輸入賬號密碼的動作。

def login(username, password):#打開微信公眾號登錄頁面driver.get('https://mp.weixin.qq.com/')#driver.get('https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN')driver.maximize_window()time.sleep(3)driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[2]/a").click()# 自動填充帳號密碼driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input").clear()driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input").send_keys(username)driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input").clear()driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input").send_keys(password)time.sleep(1)#自動點擊登錄按鈕進行登錄driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[4]/a").click()# 拿手機掃二維碼!time.sleep(15)

后來我想,既然之后還要掃二維碼,其實這段代碼可以簡化,不用輸入賬號密碼,直接最開始就掃二維碼就行了吧。

解決bug3

掃碼登陸后,要點擊新建圖文素材打開一個新頁面,每次打開新頁面后程序就停止了,chrome瀏覽器地址欄提醒已攔截不被信任的flash,我猜想是瀏覽器的問題,于是去瀏覽器里設置信任,反復設置之后依然出現攔截,猜想這就是傳說中的反爬蟲機制生效了吧。

于是搜索selenium相關的反爬蟲策略如何解決。找了好久解決方案,都沒有合適的。后來頓悟,既然掃二維碼那一步可以手動完成,那點擊鏈接跳到新頁面的這一個動作也手動完成是不是就能跳過反爬蟲機制呢。經實驗,果然跳過了反爬蟲機制。這是個本辦法,因為嘗試其他辦法可能會增加不少工作量,對于初學而言,可以擱置在以后再嘗試。

解決bug4

在爬取url時,本應該不斷翻頁,爬取所有url的,結果程序沒有實現翻頁。為了解決這個問題,我加了個print數組的動作,以便發現爬取url的動作是否實現,爬取的數據是什么樣子。

以及分析翻頁這個動作,原代碼是怎么實現的。

page_num = int(driver.find_elements_by_class_name('weui-desktop-pagination__num__wrp')[-1].text.split('/')[-1]) # 點擊下一頁 url_title_lst = get_url_title(driver.page_source) #print(driver.page_source) print(url_title_lst) #for _ in range(1, page_num): for _ in range(1, page_num): # i =int(driver.find_elements_by_class_name('weui-desktop-pagination__num__wrp')[-1].text.split('/')[0])try:#pagination = driver.find_elements_by_class_name('pagination')[1]pagination = driver.find_elements_by_class_name('weui-desktop-pagination__nav')[-1]pagination.find_elements_by_tag_name('a')[-1].click()time.sleep(5)url_title_lst += get_url_title(driver.page_source)

于是去查找幾個代碼的含義,來解讀整句代碼的意思。了解了原理是提取頁碼的文本,當當前頁碼小于總頁碼數時,就執行翻頁動作,當當前頁碼數等于總頁碼數時,就停止執行翻頁動作。于是按照這個動作邏輯,來查找現有代碼的錯誤。嘗試了很多種語法可能,最終找到了跑通這段程序的方式,獲得了完整的url。

解決bug5

已經獲得了數組,然后要把數據保存到csv文件,發現保存后的格式有問題。由于是數組里包含大量字典數據,保存到csv里的形式是每個單元格保存一個字典,橫排保存。

而我們希望呈現的數據是每條數據呈現在一行單元格,豎向排列。

于是百度搜索“python 字典保存到csv文件”

最終完美解決問題。附解決問題后的代碼:

下面的url_title_1st是上面生成的url數組里包含字典的數據。

url_list = url_title_lst with open('outputurl.csv','w',encoding="utf-8",newline='') as f:writer = csv.DictWriter(f, fieldnames=['date','url', 'title'])writer.writeheader()writer.writerows(url_list)

解決bug6

現在任務只剩下通過url地址生成pdf文檔了,看起來一步之遙。然而……

我看知乎上或者百度搜索的使用pdfkit生成pdf的代碼,要么是只將一個網頁轉換成pdf文件,要么是在代碼中列舉多個url??墒俏矣袛蛋賯€url,寫進代碼多麻煩啊。能否直接用python傳入csv文件里的所有url,生成pdf呢。

我閱讀pdfkit包的說明文檔,觀察pdfkit的傳入url的方法;猜想,只要我傳入的是url數組,那應該就可以達到目的。

pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf') pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')

于是我的任務現在轉化為,將之前生成的數組包含字典的數據格式,變為只包含url的數組格式?;蛘邔⒈緛戆嗔袛祿腸sv文件,提取其中url那一列生成只有url的數組。
于是百度搜索,關鍵詞“python 數組含字典”,搜索了一陣子,終于看到我想要的解決方案了。

I have a list of dictionaries, and I need to get a list of the values from a given key from the dictionary (all the dictionaries have those same key). For example, I have: l = [ { "key": 1, "Val1": 'val1 from element 1', "Val2": 'val2 from element 1' }, { "key": 2, "Val1": 'val1 from element 2', "Val2": 'val2 from element 2' }, { "key": 3, "Val1": 'val1 from element 3', "Val2": 'val2 from element 3' } ] I need to get 1, 2, 3. Of course, I can get it with: v=[] for i in l: v.append(i['key']) But I would like to get a nicer way to do so. 解決方案 Using a simple list comprehension (if you're sure every dictionary has the key): In [10]: [d['key'] for d in l] Out[10]: [1, 2, 3] Otherwise you'll need to check for existence first: In [11]: [d['key'] for d in l if 'key' in d] Out[11]: [1, 2, 3]

我于是模仿著寫了以下代碼,果然打印出了url數組:

url_title=[] for i in url_title_lst:url_title.append(i['url']) print(url_title)

如果是從csv文件中提取url數組,又該怎么做呢?
百度搜索“python csv文件中讀取數組”,試了網上的一些方式,都bug了,最后找到一種可行方式。

csvrows =[] csvFileobj = open('out.csvpip','r',encoding='UTF-8') readerobj = csv.reader(csvFileobj) for row in readerobj:if readerobj.line_num == 1:continuecsvrows.append(row) csvFileobj.close() print(csvrows)

這個代碼的思路是,由于第一行是表頭,跳過不讀。一行行的讀,每讀一行,就把讀的這一行加到之前的數組里,這樣整個文件讀完了,數組也就產生了。
應該還有其他可行方法,就留待以后開展別的項目時再學。

解決bug7

現在有了一個包含多列數據的數組。如何只提取url那一列生成新的數組呢。

再次百度搜索“python 讀取數組中某一列”,找到了方法:

>>> a=[[1,2,3],[4,5,6]] >>> a[0] #取一行 [1, 2, 3] >>> a[:,0] #嘗試用數組的方法讀取一列失敗 TypeError: list indices must be integers or slices, not tuple ? 我們需要用列表解析的方法讀取一列: >>> b=[x[0] for x in a] >>> print(b) [1, 4]

所以我用以下代碼提取數組中的某一列:

url = [x[1] for x in csvrows] print(url)

打印成功了。

代步車造出來了!

經過一系列的解決bug后,代碼終于成功生成了pdf文檔。雖然仍然存在一些待解決的問題,但是我心中一種成就感油然而生,總算入門了,總算邁過了容易放棄的痛苦期了。這就是自學python死磕一周的成果。

仍然有一些待解決的問題,比如:

1、同一ip短時間頻繁訪問一個公眾號的歷史文章,有時服務器會拒絕訪問。

2、沒有生成目錄??戳藀dfkit,似乎需要先有個目錄文件才能生成,如何生成這個目錄文件呢。

3、沒有導出圖片。網上看到一些人提出了同樣的問題。

4、我導出不到200篇文章的pdf時,可行,但是導出一個有600多篇文章的pdf時失敗了,猜想可能是url數組太長了,需要尋找解決方案。

學習一門技術的心得

學習一項技能,都有一條前期平緩后期陡峭的學習曲線,學習一項技能的初期,投入的精力成本雖然較高,但可見的進步卻微小,讓人缺乏成就感,看不到希望,而一旦跨越了某個轉折點,花費同樣的精力,獲得的進步卻變得非常明顯。只要能夠跨過這一拐點,學習這項技能的成功率就會大幅提升,并且很容易走向精通。

推動一個人行動起來的策略,大體有兩個方向:1、給他足夠強的驅動力,2、讓事情變得更容易辦到。

我吸取了前兩次學習失敗的教訓,做了一些改進策略。

1、讓學習的啟動更加簡單。

從安裝各種軟件,學習復雜的安裝步驟。到選擇pycharm簡化安裝步驟。

2、細分目標,將整個項目分解成多個階段目標,從而降低難度。

將一個項目任務,分解為三個分階段目標,其中兩個階段我有信心完成,又將剩下的目標分解為需要不斷克服的各種bug,每克服一個bug我都能感受到項目離成功更近了一步。

3、簡化一些暫時不大需要的學習任務,緊抓核心任務。

我在這個項目中放棄了補習數據庫的知識,放棄了補習fidler抓包,以及如何提取json文件中信息的知識,放棄了代理ip反爬蟲的知識,放棄了尋找全自動爬蟲的解決方法而選擇暫時用半自動爬蟲。

4、尋找讓python學習變得更有價值得學習目標。

我最開始從數據分析的角度學習python,然而少量數據分析可以用excel等工具迅速完成,大數據的分析暫時沒有施展機會。后來從爬蟲的角度入手python,爬蟲是每一個個體都可以學習并應用的領域,起碼可以幫助自己備份一些信息資料,進一步地可以通過網上爬到的數據進行數據分析,做一些數據分析作品出來,再進一步地,可以用來運作商業項目。

只要方法對了,你也可以一周入門python,或短時間學會某種技術。

分享轉發這篇文章,為你的學習立下一個Flag吧!

在公眾號【江流】后臺回復關鍵詞“python”可以獲得文中提到的自學python用到的資源鏈接,如何找到可用的pycharm激活碼,并限量幫50個讀者導出pdf版公眾號歷史文集。

之后,我可能還會繼續在公眾號【江流】更新我學習python的進展報告。也希望與更多學習者交流。歡迎后臺留言。

總結

以上是生活随笔為你收集整理的Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。