寫(xiě)在前面
我們?cè)趯W(xué)習(xí)任何一門(mén)技術(shù)的時(shí)候,往往都會(huì)看很多技術(shù)博客叠荠,很多程序員也會(huì)寫(xiě)自己的技術(shù)博客匿沛。但是我想寫(xiě)的這些不是純技術(shù)博客,我暫時(shí)也沒(méi)有這個(gè)能力寫(xiě)出 Python 或者爬蟲(chóng)相關(guān)的技術(shù)博客來(lái)榛鼎。我只是作為一個(gè)初學(xué) Python 和爬蟲(chóng)的產(chǎn)品逃呼,把我學(xué)習(xí)的過(guò)程和心得記錄下來(lái),供大家參考者娱。
我會(huì)給到我在學(xué)習(xí)過(guò)程中參考的技術(shù)博客鏈接抡笼,在此也對(duì)他們的無(wú)私奉獻(xiàn)表示感謝。
Python 基礎(chǔ)
先來(lái)點(diǎn)開(kāi)胃菜
可能對(duì)于很多人來(lái)說(shuō)黄鳍, Python 最大的特點(diǎn)就是“簡(jiǎn)短”蔫缸。那么用Python 寫(xiě)程序到底有多短呢?舉個(gè)栗子~
我有兩個(gè)室友际起,一個(gè)前端,一個(gè)后臺(tái)吐葱。他們分別用 JavaScript 和 C# 實(shí)現(xiàn)下面這個(gè)功能街望,需要多少行代碼呢?
輸出 (0:100)之間的弟跑,【1X1, 2X2 ··· 100X100】中 2 的倍數(shù)
JavaScript 用了10行灾前,C# 用了5行 (當(dāng)然,這也跟他們當(dāng)時(shí)的技術(shù)水平有關(guān)孟辑。一般來(lái)說(shuō)哎甲,用任何語(yǔ)言實(shí)現(xiàn)這個(gè)功能應(yīng)該都不需要10行代碼)
那么用 Python 呢?只需要一行
print [x * x for x in range(1, 100) if x % 2 == 0]
Python 代碼簡(jiǎn)短明確饲嗽,相對(duì)來(lái)說(shuō)比較好入門(mén)炭玫,適合在課余和工作之余 的時(shí)間去學(xué)習(xí),所以大家不用擔(dān)心自己沒(méi)有時(shí)間貌虾。
PS. 我無(wú)意比較各語(yǔ)言的好壞吞加,我知道 C、C++ 的運(yùn)行效率比 Python 高很多,我也相信有大牛能夠通過(guò)其他語(yǔ)言只用一行代碼來(lái)實(shí)現(xiàn)衔憨。在此只是簡(jiǎn)述 Python 簡(jiǎn)短易入門(mén)叶圃。
Python 版本
如果你有百度過(guò) Python,那么你應(yīng)該知道践图,Python 目前有兩個(gè)主要的版本: Python 2.7.X 和 Python 3.3.X掺冠,而且這兩者是不完全兼容的。
目前來(lái)說(shuō)码党,Python 2.X 的教程和庫(kù)更多德崭,更好學(xué)。但 Python 3.X 更先進(jìn)闽瓢,而且解決了 Python 2.X 在使用中文的時(shí)候容易出現(xiàn)的編碼錯(cuò)誤問(wèn)題接癌。
這里不評(píng)價(jià)哪個(gè)版本更好,但是我目前用的是 Python 2.7扣讼,因此這里所說(shuō)的所有博客缺猛、教程、語(yǔ)法和庫(kù)···都是基于 Python 2.7
開(kāi)始學(xué)習(xí)吧
我在學(xué)習(xí) Python 基礎(chǔ)的時(shí)候主要參考了 廖雪峰的Python 教程 椭符,他的博客通俗易懂荔燎,在“技術(shù)博客界”也比較出名。
但是這個(gè)教程幾乎涵蓋了 Python 的所有知識(shí)教程销钝,如果只是需要用 Python 寫(xiě)一個(gè)爬蟲(chóng)或者其他小腳本的話(huà)有咨,實(shí)際上是不需要全部看完的(當(dāng)然如果你愿意也可以)。如果你有其他語(yǔ)言的基礎(chǔ)蒸健,那么可以只看個(gè)大概座享,了解一些基本的語(yǔ)法和特性就行了;如果你沒(méi)有其他語(yǔ)言的基礎(chǔ)似忧,甚至對(duì)編程一竅不通渣叛,那么建議你多學(xué)習(xí)一些,最好看到“錯(cuò)誤盯捌、調(diào)試和測(cè)試”那一章淳衙,并且一定要把其中每一篇的示例代碼放到自己的編譯器里跑一遍(不要復(fù)制,自己敲)饺著,這樣才能理解其中的一些原理箫攀。
我大學(xué)的專(zhuān)業(yè)是軟件工程,因此有一定的 C++ 基礎(chǔ)幼衰。我大概只看到“高級(jí)特性”那一章靴跛,然后就開(kāi)始學(xué)習(xí)爬蟲(chóng)了。
爬蟲(chóng)入門(mén)
網(wǎng)絡(luò)爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛塑顺,網(wǎng)絡(luò)機(jī)器人汤求,在 FOAF 社區(qū)中間俏险,更經(jīng)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則扬绪,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本竖独。另外一些不常使用的名字還有螞蟻、自動(dòng)索引挤牛、模擬程序或者蠕蟲(chóng)莹痢。——百度百科
網(wǎng)頁(yè)知識(shí)簡(jiǎn)介
一般來(lái)說(shuō)墓赴,爬蟲(chóng)獲取的是網(wǎng)頁(yè)上的內(nèi)容竞膳。我們通過(guò)瀏覽器上網(wǎng)時(shí),首先會(huì)對(duì)該網(wǎng)站的服務(wù)器發(fā)送一個(gè)訪(fǎng)問(wèn)請(qǐng)求诫硕,服務(wù)器收到請(qǐng)求后坦辟,把我們需要的數(shù)據(jù)傳回來(lái)給到瀏覽器,然后瀏覽器解析數(shù)據(jù)并展現(xiàn)給我們章办。
而這些數(shù)據(jù)在被瀏覽器解析之前锉走,其實(shí)就是一些代碼。我們?cè)跒g覽器頁(yè)面按一下F12藕届,就能看到該網(wǎng)址的源代碼挪蹭。
爬蟲(chóng)原理簡(jiǎn)介
如果沒(méi)有前端基礎(chǔ),那么我們可能完全看不懂這些源代碼休偶。但是梁厉,我們通過(guò)瀏覽器看到的文字、圖片等信息踏兜,其實(shí)也包含在源代碼里词顾。
比如這個(gè)頁(yè)面的部分文字和圖片:
其中包含文字和圖片的代碼是這樣的
<div class="d_post_content j_d_post_content clearfix" id="post_content_97130702595">
又要迎來(lái)活生生的小鮮肉們,又要注入新生命辣=-= 開(kāi)學(xué)季需要更多交易!!房源碱妆、廣告计技、兼職還有各色各樣的寢室利器快快交易起來(lái)!!為了方便大家進(jìn)行各種交易,請(qǐng)吧內(nèi)所有【劃重點(diǎn)】交易在此進(jìn)行!!!單發(fā)將被刪帖山橄,請(qǐng)廣大吧友注意注意注意∩崦酰———————————————————————————————————本貼原則上只接受校友交易航棱,禁止【劃重點(diǎn)】微信代購(gòu)淘寶鏈接等商業(yè)性質(zhì)廣告。允許租房信息發(fā)布萌衬、二手物品交易饮醇、正規(guī)兼職招聘(注意防范詐騙)以及正規(guī)廣告發(fā)布。如果發(fā)現(xiàn)虛假信息和重復(fù)信息將會(huì)被刪除秕豫。注意:請(qǐng)吧友自己鑒別真?zhèn)纹蛹瑁蓜?wù)組不為此貼信息負(fù)責(zé)观蓄。———————————————————————————————————
![](http://upload-images.jianshu.io/upload_images/1762791-9eac76b4bfaed0f1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</div>
也就是說(shuō)祠墅,只要我們爬到了網(wǎng)頁(yè)的源代碼侮穿,那么這個(gè)網(wǎng)頁(yè)展示出來(lái)的(甚至隱藏掉的)所有信息,我們只要從源碼中篩選就能夠獲取毁嗦。
所以一般爬蟲(chóng)的原理其實(shí)非常簡(jiǎn)單:
- 爬取源碼
- 篩選信息
如何獲取源代碼
我們?cè)L問(wèn)網(wǎng)頁(yè)一般都是通過(guò)瀏覽器亲茅,而瀏覽器其實(shí)也就是一個(gè)程序而已。相應(yīng)的狗准,爬蟲(chóng)其實(shí)也是一個(gè)程序克锣。
因此爬蟲(chóng)程序(腳本)其實(shí)就是把自己偽裝成一個(gè)瀏覽器,然后跟瀏覽器一樣向目標(biāo)網(wǎng)頁(yè)的服務(wù)器發(fā)送訪(fǎng)問(wèn)請(qǐng)求腔长,只要騙過(guò)了服務(wù)器袭祟,那么服務(wù)器就會(huì)把源碼返回給你,這樣你就獲得該網(wǎng)頁(yè)的源代碼了捞附。
PS. 上面指的網(wǎng)頁(yè)都是靜態(tài)網(wǎng)頁(yè)巾乳,不包括動(dòng)態(tài)內(nèi)容;源代碼也只是 HTML 代碼故俐,不包括 JS 代碼想鹰。爬取動(dòng)態(tài)內(nèi)容要更為復(fù)雜一些
API
如果你是一個(gè)互聯(lián)網(wǎng)從業(yè)者,那么應(yīng)該聽(tīng)過(guò) API 這個(gè)詞药版。
API(Application Programming Interface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù)辑舷,目的是提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件得以訪(fǎng)問(wèn)一組例程的能力,而又無(wú)需訪(fǎng)問(wèn)源碼槽片,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)何缓。——百度百科
簡(jiǎn)單來(lái)說(shuō)还栓,你可以把 API 當(dāng)做一個(gè)管道接口碌廓,當(dāng)你連接上這個(gè)管道接口后,你就能從中獲取一些數(shù)據(jù)信息(當(dāng)然剩盒,你能獲取哪些信息是它說(shuō)了算)谷婆。
很多企業(yè)都會(huì)對(duì)外開(kāi)放一些 API 接口,通過(guò)這些接口辽聊,我們能更為快速纪挎、高效、便捷地獲取天氣跟匆、航班异袄、股市等信息。(不只是這些公共信息玛臂,其實(shí)像 QQ烤蜕、微博封孙、facebook 等都會(huì)開(kāi)放一些 API 接口,這樣能讓公司的業(yè)務(wù)更好地滲透到市場(chǎng)中去讽营,也利于業(yè)務(wù)之間的合作)
顯然虎忌,我們也可以通過(guò)爬蟲(chóng)程序來(lái)連接這些 API 接口,以此來(lái)獲取數(shù)據(jù)信息斑匪。
開(kāi)始學(xué)習(xí)吧
我在學(xué)習(xí)爬蟲(chóng)的過(guò)程中主要參考的是 崔慶才的Python爬蟲(chóng)學(xué)習(xí)系列教程 呐籽,他主要分了4個(gè)學(xué)習(xí)階段。按照這個(gè)教程一步一步的實(shí)踐蚀瘸,很快你就能收獲一些成果了狡蝶。
系列目錄:
產(chǎn)品經(jīng)理學(xué)Python&爬蟲(chóng)(一):為什么我要學(xué)Python
產(chǎn)品經(jīng)理學(xué)Python&爬蟲(chóng)(三):競(jìng)品數(shù)據(jù)爬取實(shí)戰(zhàn)——在行