Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法
這篇文章不談江流所專研的營(yíng)銷與運(yùn)營(yíng),而聊一聊技能學(xué)習(xí)之路,聊一聊Python這門最簡(jiǎn)單的編程語言該如何學(xué)習(xí),我完成的第一個(gè)Python項(xiàng)目,將任意公眾號(hào)的所有歷史文章導(dǎo)出成PDF電子書。
或許我這個(gè)Python初學(xué)者的學(xué)習(xí)路徑能給你帶來啟發(fā),或許你產(chǎn)生了要學(xué)一門新技術(shù)的沖動(dòng)。
文末附送了學(xué)習(xí)資源通道。
學(xué)習(xí)python兩度放棄最終有所成
我想要學(xué)python五年了,三度捧起python入門書決定開啟學(xué)習(xí),到第三次才算上道了。
第一次死于安裝軟件環(huán)境,安裝碰了太多壁,面對(duì)各種困難無從解決而擱置。所以傳說三分之一python學(xué)習(xí)者死于安裝軟件,此言不虛。
第二次死于一直找不到成就感。從學(xué)習(xí)python到能夠正經(jīng)用python干些有意義的事情,太費(fèi)時(shí),于是擱置了。這實(shí)際上是學(xué)習(xí)方法不對(duì),花費(fèi)太多時(shí)間學(xué)習(xí)知識(shí)點(diǎn),而不是盡早通過解決實(shí)際問題學(xué)習(xí)。
第三次,經(jīng)過一個(gè)星期的死磕,終于完成了爬取任意公眾號(hào)歷史文章并生成PDF文集這件事。獲得了成就感,也在死磕的過程中總算入門了python。
Python很火,誰都可以學(xué)
想要學(xué)一項(xiàng)技能與學(xué)成一項(xiàng)技能之間往往有些差距,我們往往想得多,而堅(jiān)持的少。所以堅(jiān)持了一件事情,就值得寫文章紀(jì)念一下,并給他人以啟迪。
python火了幾年了,有詩為證,“人生苦短,快學(xué)python”。
python幾乎是各種編程語言里最簡(jiǎn)單易學(xué)的語言,python的應(yīng)用范圍很廣,爬蟲,數(shù)據(jù)分析,網(wǎng)站開發(fā),自動(dòng)化辦公,機(jī)器學(xué)習(xí),云計(jì)算,python有大量的庫,意味著我們用python編程可以充分利用前人的勞動(dòng)成果,對(duì)程序進(jìn)行改編,或者運(yùn)用前人編好的功能模塊,進(jìn)行重新組合,來創(chuàng)造達(dá)你的新程序。結(jié)果是你用C++可能要寫1000行代碼,用Python寫50行代碼就干了同樣的事情。
傳說有些娛樂圈明星在學(xué)python,雖然我目前也沒有看到她們的學(xué)習(xí)成果,可能有的放棄了,可能有的已經(jīng)在悶聲發(fā)大財(cái)。
知名商人潘石屹,賣了自己的地產(chǎn),也專心學(xué)python去了,他已經(jīng)堅(jiān)持微博打卡學(xué)python半年多了,每條微博都會(huì)提及輔導(dǎo)自己Python的培訓(xùn)機(jī)構(gòu)。我們也不知道他是單純的行為藝術(shù)癖好呢,還是就是想體會(huì)中學(xué)生刷題的樂趣呢,還是是因?yàn)楦男凶隽四撑嘤?xùn)機(jī)構(gòu)的幕后股東為其站臺(tái)。
我們學(xué)python可沒刷半年題的耐心,追求的就是能快速豐富自己的能力,創(chuàng)造更多可能性。
學(xué)習(xí)Python的最短準(zhǔn)備路徑
學(xué)習(xí)Python第一步:裝合適的軟件環(huán)境,買一本合適的入門書
我最開始,看到各種討論安裝哪個(gè)python版本,安裝什么樣的python環(huán)境,怎么安裝需要用到的各種包,觀點(diǎn)不一,而且容易安裝失敗。這個(gè)過程讓很多人絕望。
趟過各種坑后,推薦初學(xué)者無腦按以下步驟來:
下載安裝python3.7版本。其他python3的版本應(yīng)該也可以。
下載pycharm(感謝北京的張祥幫忙下載安裝),我的是JetBrains PyCharm 2018.3.2版本。
搜索下pycharm激活碼(激活碼經(jīng)常失效,后臺(tái)可告訴你怎么找激活碼,我試了挺多激活碼都無效的)
買本《Python編程快速上手:讓繁瑣工作自動(dòng)化(第2版)》,這本書豆瓣評(píng)分9.0分,其實(shí)作者在他的個(gè)人網(wǎng)站發(fā)布了該書1.0版的英文版,書中有網(wǎng)站鏈接,用chrome瀏覽器的自帶翻譯也能流暢閱讀。但我總覺得學(xué)習(xí)一項(xiàng)技能要買本書創(chuàng)造點(diǎn)儀式感。
有很多人推薦廖雪峰的Python入門教程,網(wǎng)上可以搜到網(wǎng)站,但我看了下目錄,總覺得學(xué)習(xí)過程過于漫長(zhǎng),離上手項(xiàng)目太遙遠(yuǎn),很容易促使新手放棄。
而《Python編程快速上手》這本書,只需要看基礎(chǔ)部分那110頁,然后看自動(dòng)化任務(wù)部分的兩個(gè)章節(jié),比如對(duì)我要做的爬蟲項(xiàng)目有用的是讀寫文件這個(gè)章節(jié)和從web抓取信息這個(gè)章節(jié)。其他內(nèi)容則是在項(xiàng)目實(shí)踐過程中,遇到了問題,再回頭查找書中的相關(guān)內(nèi)容補(bǔ)充。
這是我目前認(rèn)為的自學(xué)Python的最短路徑。
安裝各種第三方包
Python的妙處是有大量的第三方開發(fā)的包,用于各種功能,你在某個(gè)具體項(xiàng)目中,可能會(huì)用到其中的幾個(gè)包,這些包就節(jié)省了你大量的工作量。
進(jìn)入PyCharm,進(jìn)入File-Settings-Project-Project Interpreter,點(diǎn)擊右側(cè)的“+”號(hào),就可以搜索你需要的包,點(diǎn)擊Install安裝了。
有時(shí)會(huì)安裝失敗,但成功率高于其他方式。如果安裝失敗,你可以考慮1、等網(wǎng)絡(luò)狀況好了再試試;2、打開VPN再下載;3、在Pycharm界面底部選擇Terminal,然后輸入pip install +要安裝的包。
上GITHUB找相關(guān)項(xiàng)目代碼
我們初學(xué)者,最好的方式是找前人的項(xiàng)目代碼研究。通過改編借鑒別人的代碼或者思路,來實(shí)現(xiàn)自己的目的。
我遵循行業(yè)規(guī)矩,上GITHUB網(wǎng)站(https://github.com/)搜索相關(guān)項(xiàng)目,GITHUB的用法還需要學(xué)習(xí)下,B站上有一些視頻教程。我遵循規(guī)矩在GITHUB注冊(cè)了賬號(hào),然后安裝了GITHUB Desktop(就是桌面客戶端)。
這樣,我就可以
1、登陸GITHUB網(wǎng)站搜索相關(guān)項(xiàng)目。
2、點(diǎn)擊搜索結(jié)果查看可能相關(guān)的項(xiàng)目。
3、點(diǎn)擊綠色按鈕Clone or Download,再點(diǎn)擊Open in Desktop,將項(xiàng)目保存到本地。
4、在本地保存項(xiàng)目的文件夾里,打開py后綴的文件,查看和修改項(xiàng)目代碼。
這里GITHUB Desktop的作用似乎可有可無,但是當(dāng)我們跨過了初學(xué)者的階段,才會(huì)發(fā)現(xiàn)它的作用,作用是方便保管項(xiàng)目文件,并顯示項(xiàng)目更新,并同步到云上,以便其他人能夠同步改進(jìn)。
GITHUB的項(xiàng)目下載速度很慢,可以試試打開VPN加速。有人推薦國(guó)內(nèi)版的GITHUB“碼云”,說下載速度更快,說能把GITHUB上的代碼同步到碼云然后下載,我注冊(cè)了,但還沒正式用。
梳理項(xiàng)目邏輯
《Python編程快速上手》這本書的一個(gè)妙處在于,教給了我們簡(jiǎn)潔的工作方法。指導(dǎo)我們?cè)陂_始項(xiàng)目前先要梳理這個(gè)程序需要依次實(shí)現(xiàn)的動(dòng)作。
以我完成的爬取公眾號(hào)歷史文章這個(gè)項(xiàng)目為例。
第一步:我給自己樹立了一個(gè)任務(wù),就是要把某一個(gè)微信公眾號(hào)的歷史文章都整理到一個(gè)pdf文檔里。方便我存檔信息。
第二步:分解步驟,我認(rèn)為要完成我這個(gè)任務(wù),我需要做三件事。
1、找到獲得公眾號(hào)歷史文章url的方式。
2、抓去到這個(gè)公眾號(hào)所有歷史文章的url,并保存到一個(gè)文件中。
3、讀取每個(gè)文章的url鏈接里的文章內(nèi)容,生成pdf文件。
通過看書,我已經(jīng)知道了第三步用pdfkit這個(gè)包就可以完成,將url等數(shù)據(jù)保存到csv文件里也可以完成。所以任務(wù)變成了,如何抓取到一個(gè)公眾號(hào)所有歷史文章的url鏈接了。
第三步:去GITHUB里找相關(guān)項(xiàng)目。
由于微信的挺強(qiáng)的反爬蟲能力,很多相關(guān)項(xiàng)目都已經(jīng)不能順利運(yùn)行,我們需要尋找相似的項(xiàng)目,分析其邏輯是否可行。
我找到一個(gè)項(xiàng)目,里面討論了獲取url的幾種方法。根據(jù)爬蟲所見即所得的原則,你在前端能看到的東西,就一定能用爬蟲爬到。
這里就要插入一個(gè)知識(shí)點(diǎn)了。在chrome瀏覽器某個(gè)頁面,按F12鍵,可以打開瀏覽器的開發(fā)者模式,可以查看這個(gè)網(wǎng)頁的源代碼。只要你在某個(gè)頁面的源代碼中可以找到url,這個(gè) url就可以被爬到。
有一種方法是微信PC端查看公眾號(hào)的歷史文集時(shí)可以看到url,但以前我看一個(gè)爬蟲教程教這種方法時(shí),在手機(jī)與電腦連接同一個(gè)wifi的過程中,遇到了難處,可能是手機(jī)的問題,所以這次我就沒敢嘗試這種方法。
有一種方法是通過個(gè)人微信號(hào)登陸后臺(tái),搜索任意公眾號(hào),可以看到這個(gè)公眾號(hào)發(fā)的文章,可以查到文章的永久鏈接。于是我決定使用這種方法。
網(wǎng)上看到很多文章的方法是通過搜狗搜索引擎搜索公眾號(hào)文章,進(jìn)行篩選,然而問題是搜狗只顯示100頁搜索結(jié)果,并且不一定能夠做到搜索精確,所以幾乎不可能做到下載一個(gè) 公眾號(hào)的所有歷史文章,故排除這一思路。
在GITHUB上下載了運(yùn)用個(gè)人微信公眾號(hào)這個(gè)方法的python代碼,run了一下失敗了。然后就開始讀代碼,想弄明白這個(gè)代碼的邏輯是什么樣子的,在哪些問題上需要修改。
發(fā)現(xiàn)問題,解決問題
有了現(xiàn)成的代碼后,我的任務(wù)進(jìn)一步細(xì)化。在現(xiàn)有代碼的基礎(chǔ)上,梳理邏輯,尋找出錯(cuò)的地方,尋找已經(jīng)過時(shí)的地方。我只需要解決現(xiàn)有代碼中出現(xiàn)的bug,一個(gè)個(gè)解決掉,就應(yīng)該能夠爬到url。
我發(fā)現(xiàn)這個(gè)程序用到的是selenium包,于是從頭去了解了selenium這個(gè)包的特點(diǎn),工作原理,入門書里的相關(guān)章節(jié)。
selenium是一種Python可以用的爬蟲工具,特點(diǎn)是模擬人操作電腦完成各種動(dòng)作,比如自動(dòng)打開某些頁面,進(jìn)行翻頁,點(diǎn)擊,動(dòng)作等,比如解讀某個(gè)頁面的源代碼,提取出url等內(nèi)容。優(yōu)點(diǎn)是你只要人工能完成的動(dòng)作就能用selenium完成,缺點(diǎn)是速度慢,容易被反爬蟲檢測(cè)到。
經(jīng)過閱讀代碼,我發(fā)現(xiàn)這個(gè)程序的邏輯是這樣的:
1、通過import工具引入需要用到的包。
2、通過def語句,定義一些需要用到的動(dòng)作。
3、按順序排列這個(gè)程序依次需要執(zhí)行的動(dòng)作。
4、通過for循環(huán)實(shí)現(xiàn)依次完成抓取url的重復(fù)性動(dòng)作。
5、將抓取到的url保存到一個(gè)數(shù)組,再保存到一個(gè)數(shù)據(jù)庫中。
由于我還沒有學(xué)習(xí)python和數(shù)據(jù)庫是如何配合的,我想將數(shù)據(jù)保存到csv文件中,應(yīng)該也可以被調(diào)用,并且csv文件我可以直接打開查看效果。
于是我將步驟5的代碼從保存到數(shù)據(jù)庫改為保存到csv文件。為了怕我反悔,我在代碼前添加#號(hào)讓某些代碼不被執(zhí)行。
以下是原代碼中保存到數(shù)據(jù)庫的代碼,被我棄用。
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()這段代碼確實(shí)實(shí)現(xiàn)了將數(shù)據(jù)保存到csv文件,但是格式很有問題,之后放我后來發(fā)現(xiàn)問題并更改的代碼。
解決bug1:
原代碼作者有提醒,為了使用selenium,需要使用與chrome瀏覽器相對(duì)應(yīng)的chrome driver,為了滿足這個(gè)要求,也花了我不少功夫。最后百度搜索了一番,終于找到了適配的chrome driver,成功的標(biāo)志是運(yùn)行程序時(shí),chrome瀏覽器被自動(dòng)啟動(dòng)了。搜索關(guān)鍵詞“selenium chrome driver”
看到chrome瀏覽器自動(dòng)啟動(dòng)的時(shí)候,內(nèi)心開心,因?yàn)檫@個(gè)程序我已經(jīng)跑通了第一步。
解決bug2:
chrome瀏覽器自動(dòng)啟動(dòng),并打開了微信公眾平臺(tái)的登陸頁,然而程序停了。
于是我看代碼尋找原因。
def login(username, password):#打開微信公眾號(hào)登錄頁面driver.get('https://mp.weixin.qq.com/')driver.maximize_window()time.sleep(3)# 自動(dòng)填充帳號(hào)密碼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)#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[4]/a").click()# 拿手機(jī)掃二維碼!time.sleep(15)猜想是在自動(dòng)填充的過程中出bug了 。driver.find_element_by_xpath這個(gè)句子我似乎見過,翻入門書發(fā)現(xiàn),是selenium里的語句,意思是通過xpath這種方式來尋找元素。
后面的后綴很容易猜,clear()意思是清空內(nèi)容,sen_keys()意思是填入內(nèi)容,click()意思是點(diǎn)擊,time.sleep(1)意思是程序休息1秒鐘。
于是我猜想可能是程序里面定位的位置錯(cuò)了吧。于是百度搜索selenium的find_element_by語句的用法講解,并搜索xpath相關(guān)的內(nèi)容,xpath后面是什么意思。搜索關(guān)鍵詞“selenium find_element_by”
按F12打開開發(fā)者工具,點(diǎn)擊左側(cè)的箭頭按鈕,然后光標(biāo)移到頁面中你要定位的的區(qū)域,在下方就可以看到當(dāng)前區(qū)域的代碼塊。此時(shí)點(diǎn)擊右鍵,下方代碼就定位到這個(gè)代碼塊,在這個(gè)代碼塊再點(diǎn)擊右鍵,copy-xpath,我粘貼到其他地方,發(fā)現(xiàn)復(fù)制的代碼和原代碼里xpath()的內(nèi)容很相似。我猜想,只需要替換xpath()里的代碼就可以正確定位了。
替換了xpath里的內(nèi)容后,再運(yùn)行程序,自動(dòng)填充賬號(hào)密碼的動(dòng)作果真完成了。
注意,原代碼是進(jìn)入微信公眾平臺(tái)登陸頁面后就直接填寫賬號(hào)密碼了,而我登陸微信公眾平臺(tái)時(shí)發(fā)現(xiàn)優(yōu)先項(xiàng)是先掃二維碼,于是模仿原代碼用driver.find_element_by_xpath語句加了個(gè)點(diǎn)擊輸入賬號(hào)密碼的動(dòng)作。
def login(username, password):#打開微信公眾號(hào)登錄頁面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()# 自動(dòng)填充帳號(hào)密碼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)#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/div[1]/form/div[4]/a").click()# 拿手機(jī)掃二維碼!time.sleep(15)后來我想,既然之后還要掃二維碼,其實(shí)這段代碼可以簡(jiǎn)化,不用輸入賬號(hào)密碼,直接最開始就掃二維碼就行了吧。
解決bug3
掃碼登陸后,要點(diǎn)擊新建圖文素材打開一個(gè)新頁面,每次打開新頁面后程序就停止了,chrome瀏覽器地址欄提醒已攔截不被信任的flash,我猜想是瀏覽器的問題,于是去瀏覽器里設(shè)置信任,反復(fù)設(shè)置之后依然出現(xiàn)攔截,猜想這就是傳說中的反爬蟲機(jī)制生效了吧。
于是搜索selenium相關(guān)的反爬蟲策略如何解決。找了好久解決方案,都沒有合適的。后來頓悟,既然掃二維碼那一步可以手動(dòng)完成,那點(diǎn)擊鏈接跳到新頁面的這一個(gè)動(dòng)作也手動(dòng)完成是不是就能跳過反爬蟲機(jī)制呢。經(jīng)實(shí)驗(yàn),果然跳過了反爬蟲機(jī)制。這是個(gè)本辦法,因?yàn)閲L試其他辦法可能會(huì)增加不少工作量,對(duì)于初學(xué)而言,可以擱置在以后再嘗試。
解決bug4
在爬取url時(shí),本應(yīng)該不斷翻頁,爬取所有url的,結(jié)果程序沒有實(shí)現(xiàn)翻頁。為了解決這個(gè)問題,我加了個(gè)print數(shù)組的動(dòng)作,以便發(fā)現(xiàn)爬取url的動(dòng)作是否實(shí)現(xiàn),爬取的數(shù)據(jù)是什么樣子。
以及分析翻頁這個(gè)動(dòng)作,原代碼是怎么實(shí)現(xiàn)的。
page_num = int(driver.find_elements_by_class_name('weui-desktop-pagination__num__wrp')[-1].text.split('/')[-1]) # 點(diǎn)擊下一頁 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)于是去查找?guī)讉€(gè)代碼的含義,來解讀整句代碼的意思。了解了原理是提取頁碼的文本,當(dāng)當(dāng)前頁碼小于總頁碼數(shù)時(shí),就執(zhí)行翻頁動(dòng)作,當(dāng)當(dāng)前頁碼數(shù)等于總頁碼數(shù)時(shí),就停止執(zhí)行翻頁動(dòng)作。于是按照這個(gè)動(dòng)作邏輯,來查找現(xiàn)有代碼的錯(cuò)誤。嘗試了很多種語法可能,最終找到了跑通這段程序的方式,獲得了完整的url。
解決bug5
已經(jīng)獲得了數(shù)組,然后要把數(shù)據(jù)保存到csv文件,發(fā)現(xiàn)保存后的格式有問題。由于是數(shù)組里包含大量字典數(shù)據(jù),保存到csv里的形式是每個(gè)單元格保存一個(gè)字典,橫排保存。
而我們希望呈現(xiàn)的數(shù)據(jù)是每條數(shù)據(jù)呈現(xiàn)在一行單元格,豎向排列。
于是百度搜索“python 字典保存到csv文件”
最終完美解決問題。附解決問題后的代碼:
下面的url_title_1st是上面生成的url數(shù)組里包含字典的數(shù)據(jù)。
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
現(xiàn)在任務(wù)只剩下通過url地址生成pdf文檔了,看起來一步之遙。然而……
我看知乎上或者百度搜索的使用pdfkit生成pdf的代碼,要么是只將一個(gè)網(wǎng)頁轉(zhuǎn)換成pdf文件,要么是在代碼中列舉多個(gè)url。可是我有數(shù)百個(gè)url,寫進(jìn)代碼多麻煩啊。能否直接用python傳入csv文件里的所有url,生成pdf呢。
我閱讀pdfkit包的說明文檔,觀察pdfkit的傳入url的方法;猜想,只要我傳入的是url數(shù)組,那應(yīng)該就可以達(dá)到目的。
pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf') pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')于是我的任務(wù)現(xiàn)在轉(zhuǎn)化為,將之前生成的數(shù)組包含字典的數(shù)據(jù)格式,變?yōu)橹话瑄rl的數(shù)組格式。或者將本來包含多列數(shù)據(jù)的csv文件,提取其中url那一列生成只有url的數(shù)組。
于是百度搜索,關(guān)鍵詞“python 數(shù)組含字典”,搜索了一陣子,終于看到我想要的解決方案了。
我于是模仿著寫了以下代碼,果然打印出了url數(shù)組:
url_title=[] for i in url_title_lst:url_title.append(i['url']) print(url_title)如果是從csv文件中提取url數(shù)組,又該怎么做呢?
百度搜索“python csv文件中讀取數(shù)組”,試了網(wǎng)上的一些方式,都bug了,最后找到一種可行方式。
這個(gè)代碼的思路是,由于第一行是表頭,跳過不讀。一行行的讀,每讀一行,就把讀的這一行加到之前的數(shù)組里,這樣整個(gè)文件讀完了,數(shù)組也就產(chǎn)生了。
應(yīng)該還有其他可行方法,就留待以后開展別的項(xiàng)目時(shí)再學(xué)。
解決bug7
現(xiàn)在有了一個(gè)包含多列數(shù)據(jù)的數(shù)組。如何只提取url那一列生成新的數(shù)組呢。
再次百度搜索“python 讀取數(shù)組中某一列”,找到了方法:
>>> a=[[1,2,3],[4,5,6]] >>> a[0] #取一行 [1, 2, 3] >>> a[:,0] #嘗試用數(shù)組的方法讀取一列失敗 TypeError: list indices must be integers or slices, not tuple ? 我們需要用列表解析的方法讀取一列: >>> b=[x[0] for x in a] >>> print(b) [1, 4]所以我用以下代碼提取數(shù)組中的某一列:
url = [x[1] for x in csvrows] print(url)打印成功了。
代步車造出來了!
經(jīng)過一系列的解決bug后,代碼終于成功生成了pdf文檔。雖然仍然存在一些待解決的問題,但是我心中一種成就感油然而生,總算入門了,總算邁過了容易放棄的痛苦期了。這就是自學(xué)python死磕一周的成果。
仍然有一些待解決的問題,比如:
1、同一ip短時(shí)間頻繁訪問一個(gè)公眾號(hào)的歷史文章,有時(shí)服務(wù)器會(huì)拒絕訪問。
2、沒有生成目錄。看了pdfkit,似乎需要先有個(gè)目錄文件才能生成,如何生成這個(gè)目錄文件呢。
3、沒有導(dǎo)出圖片。網(wǎng)上看到一些人提出了同樣的問題。
4、我導(dǎo)出不到200篇文章的pdf時(shí),可行,但是導(dǎo)出一個(gè)有600多篇文章的pdf時(shí)失敗了,猜想可能是url數(shù)組太長(zhǎng)了,需要尋找解決方案。
學(xué)習(xí)一門技術(shù)的心得
學(xué)習(xí)一項(xiàng)技能,都有一條前期平緩后期陡峭的學(xué)習(xí)曲線,學(xué)習(xí)一項(xiàng)技能的初期,投入的精力成本雖然較高,但可見的進(jìn)步卻微小,讓人缺乏成就感,看不到希望,而一旦跨越了某個(gè)轉(zhuǎn)折點(diǎn),花費(fèi)同樣的精力,獲得的進(jìn)步卻變得非常明顯。只要能夠跨過這一拐點(diǎn),學(xué)習(xí)這項(xiàng)技能的成功率就會(huì)大幅提升,并且很容易走向精通。
推動(dòng)一個(gè)人行動(dòng)起來的策略,大體有兩個(gè)方向:1、給他足夠強(qiáng)的驅(qū)動(dòng)力,2、讓事情變得更容易辦到。
我吸取了前兩次學(xué)習(xí)失敗的教訓(xùn),做了一些改進(jìn)策略。
1、讓學(xué)習(xí)的啟動(dòng)更加簡(jiǎn)單。
從安裝各種軟件,學(xué)習(xí)復(fù)雜的安裝步驟。到選擇pycharm簡(jiǎn)化安裝步驟。
2、細(xì)分目標(biāo),將整個(gè)項(xiàng)目分解成多個(gè)階段目標(biāo),從而降低難度。
將一個(gè)項(xiàng)目任務(wù),分解為三個(gè)分階段目標(biāo),其中兩個(gè)階段我有信心完成,又將剩下的目標(biāo)分解為需要不斷克服的各種bug,每克服一個(gè)bug我都能感受到項(xiàng)目離成功更近了一步。
3、簡(jiǎn)化一些暫時(shí)不大需要的學(xué)習(xí)任務(wù),緊抓核心任務(wù)。
我在這個(gè)項(xiàng)目中放棄了補(bǔ)習(xí)數(shù)據(jù)庫的知識(shí),放棄了補(bǔ)習(xí)fidler抓包,以及如何提取json文件中信息的知識(shí),放棄了代理ip反爬蟲的知識(shí),放棄了尋找全自動(dòng)爬蟲的解決方法而選擇暫時(shí)用半自動(dòng)爬蟲。
4、尋找讓python學(xué)習(xí)變得更有價(jià)值得學(xué)習(xí)目標(biāo)。
我最開始從數(shù)據(jù)分析的角度學(xué)習(xí)python,然而少量數(shù)據(jù)分析可以用excel等工具迅速完成,大數(shù)據(jù)的分析暫時(shí)沒有施展機(jī)會(huì)。后來從爬蟲的角度入手python,爬蟲是每一個(gè)個(gè)體都可以學(xué)習(xí)并應(yīng)用的領(lǐng)域,起碼可以幫助自己備份一些信息資料,進(jìn)一步地可以通過網(wǎng)上爬到的數(shù)據(jù)進(jìn)行數(shù)據(jù)分析,做一些數(shù)據(jù)分析作品出來,再進(jìn)一步地,可以用來運(yùn)作商業(yè)項(xiàng)目。
只要方法對(duì)了,你也可以一周入門python,或短時(shí)間學(xué)會(huì)某種技術(shù)。
分享轉(zhuǎn)發(fā)這篇文章,為你的學(xué)習(xí)立下一個(gè)Flag吧!
在公眾號(hào)【江流】后臺(tái)回復(fù)關(guān)鍵詞“python”可以獲得文中提到的自學(xué)python用到的資源鏈接,如何找到可用的pycharm激活碼,并限量幫50個(gè)讀者導(dǎo)出pdf版公眾號(hào)歷史文集。
之后,我可能還會(huì)繼續(xù)在公眾號(hào)【江流】更新我學(xué)習(xí)python的進(jìn)展報(bào)告。也希望與更多學(xué)習(xí)者交流。歡迎后臺(tái)留言。
總結(jié)
以上是生活随笔為你收集整理的Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西门子三开接线图解_西门子三位单控开关怎
- 下一篇: websocket python爬虫_p