閑來(lái)無(wú)事,想要學(xué)習(xí)一下Python,十月初的時(shí)候搭好了ubuntu的環(huán)境,用的是Ubuntu 16.04 32位+sublime Text3,輕量級(jí)的編程環(huán)境,感覺(jué)用起來(lái)還是比較舒服的。也陸陸續(xù)續(xù)地學(xué)習(xí)了一下python的語(yǔ)法和相關(guān)的知識(shí)點(diǎn),并沒(méi)有感覺(jué)到python有什么特別的地方,數(shù)據(jù)結(jié)構(gòu)中的列表,元組和字典,還沒(méi)有感到其特點(diǎn)在哪里比較明顯,只是一個(gè)數(shù)據(jù)結(jié)構(gòu)而已。恰好學(xué)院老師讓搜集就業(yè)相關(guān)信息,所以就想嘗試去先寫(xiě)一個(gè)爬蟲(chóng),爬一下相關(guān)網(wǎng)站的相關(guān)鏈接。先提起興趣,再去學(xué)習(xí)枯燥的知識(shí)點(diǎn)。
一開(kāi)始以為會(huì)是很大的工程量,周五下午回到宿舍就開(kāi)始查相關(guān)資料,看了一下鏈接,先Mark一下:汪海的實(shí)驗(yàn)室,很多筆記,感覺(jué)應(yīng)該專業(yè)人士,而且很巧也是山大畢業(yè)的??吹搅艘粋€(gè)比較簡(jiǎn)單的教程,利用審查元素和一個(gè)python的requests模塊發(fā)送請(qǐng)求,然后利用pyquery模塊來(lái)解析數(shù)據(jù)。當(dāng)然,具體的jquery語(yǔ)法是什么樣的我還是不清楚的=,=。教程中大體的思路就是在審查元素中,先定位自己想要爬取信息的位置,找到div的id,再找到具體的標(biāo)簽,然后就獲取到了標(biāo)題。當(dāng)然獲取的是一個(gè)列表數(shù)據(jù),不僅僅可以找出標(biāo)題,也可以提取出來(lái)鏈接。具體代碼和效果如下圖所示:
當(dāng)然,和教程還是有一點(diǎn)不一樣的,教程中是先定位了模塊的id,但是我們學(xué)校的就業(yè)信息網(wǎng)列表那里并沒(méi)有模塊的id,所以嘗試直接取獲取鏈接文本所在模塊的信息。獲取得到的內(nèi)容除了我想要的東西意外還有奇奇怪怪的東西,后來(lái)查了一下模塊的id是唯一的,但是模塊下的子名字是可以重復(fù)的,因?yàn)楂@取的是列表,并且信息的格式基本上是固定的,所以直接獲取列表的一個(gè)子表就可以了,當(dāng)然=,=不懂html的我是不了解具體原因的。。
這樣就是靜態(tài)的抓取了一個(gè)網(wǎng)頁(yè)里面的部分文章標(biāo)題及鏈接,但是想實(shí)現(xiàn)的是提醒更新的功能。很自然地一個(gè)想法就是拿爬下來(lái)的內(nèi)容和之前的內(nèi)容進(jìn)行比較,沒(méi)有更新的就直接忽略,有更新的話就把更新內(nèi)容保存下來(lái),最后只提醒更新內(nèi)容就好了。正好python處理字符串還是比較人性化的,文件操作里面有f.readline(),同時(shí)可以直接進(jìn)行字符串的比較,所以就拿爬下來(lái)的第一行數(shù)據(jù)和之前文件里的第一行數(shù)據(jù)進(jìn)行比較,如果相同的話忽略本次爬取,不同的話循環(huán)比較,直到遇到相同的數(shù)據(jù),把之前的數(shù)據(jù)存到本地,實(shí)現(xiàn)更新內(nèi)容的動(dòng)態(tài)提醒。最終實(shí)現(xiàn)了對(duì)三個(gè)網(wǎng)頁(yè),山東大學(xué)(威海)就業(yè)信息網(wǎng)的兩個(gè)模塊和哈爾濱工業(yè)大學(xué)(威海)的一個(gè)模塊的數(shù)據(jù)提取。代碼如下:
因?yàn)閷?duì)python語(yǔ)言不太熟悉,所以可能很多語(yǔ)法的寫(xiě)法并不像python工程師的寫(xiě)法,之后會(huì)系統(tǒng)地學(xué)習(xí)然后改過(guò)。
到這里還算比較順利的,代碼量不大,直接調(diào)庫(kù)就實(shí)現(xiàn)了我想要的功能,一共用了三四個(gè)小時(shí)的樣子,但是這樣明顯不能夠滿足我的需求,畢竟python是一個(gè)腳本文件,如果我想把它發(fā)給別人,那對(duì)方也必須要配置好pyt