零基礎(chǔ)自學(xué)用Python 3開發(fā)網(wǎng)絡(luò)爬蟲

由于本學(xué)期好多神都選了Cisco網(wǎng)絡(luò)課, 而我這等弱渣沒選, 去蹭了一節(jié)發(fā)現(xiàn)講的內(nèi)容雖然我不懂但是還是無愛. 我想既然都本科就出來工作還是按照自己愛好來點技能吧, 于是我就不去了. 一個人在宿舍沒有點計劃好的事情做就會很容易虛度, 正好這個學(xué)期主打網(wǎng)絡(luò)與數(shù)據(jù)庫開發(fā), 那就先學(xué)學(xué)Python開發(fā)爬蟲吧. 我失散多年的好朋友Jay Loong突然說他會爬蟲了, 點擊鏈接加入群【我愛python大神】:https://jq.qq.com/?_wv=1027&k=47xNlOU我感到真棒, 我也要學(xué) :D 因為一個星期有兩節(jié)Cisco課, 所以本系列博文也就一周兩更.選擇一門語言爬蟲可以用各種語言寫, C++, Java都可以, 為什么要Python? 首先用C++搞網(wǎng)絡(luò)開發(fā)的例子不多(可能是我見得太少), 然后由于Oracle收購了Sun, Java目前雖然在Android開發(fā)上很重要, 但是如果Google官司進(jìn)展不順利, 那么很有可能用Go語言替代掉Java來做Android開發(fā). 在這計算機(jī)速度高速增長的年代里, 選語言都要看他爹的業(yè)績, 真是稍不注意就落后于時代. 隨著計算機(jī)速度的高速發(fā)展, 某種語言開發(fā)的軟件運(yùn)行的時間復(fù)雜度的常數(shù)系數(shù)已經(jīng)不像以前那么重要, 我們可以越來越偏愛為程序員打造的而不是為計算機(jī)打造的語言. 比如Ruby這種傳說中的純種而又飄逸的的OOP語言, 或者Python這種稍嚴(yán)謹(jǐn)而流行庫又非常多的語言, 都大大弱化了針對計算機(jī)運(yùn)行速度而打造的特性, 強(qiáng)化了為程序員容易思考而打造的特性. 所以我選擇Python. 選擇Python版本有2和3兩個版本, 3比較新, 聽說改動大. 根據(jù)我在知乎上搜集的觀點來看, 我還是傾向于使用"在趨勢中將會越來越火"的版本, 而非"目前已經(jīng)很穩(wěn)定而且很成熟"的版本. 這是個人喜好, 而且預(yù)測不一定準(zhǔn)確. 但是如果Python3無法像Python2那么火, 那么整個Python語言就不可避免的隨著時間的推移越來越落后, 因此我想其實選哪個的最壞風(fēng)險都一樣, 但是最好回報卻是Python3的大. 其實兩者區(qū)別也可以說大也可以說不大, 最終都不是什么大問題. 我選擇的是Python 3. 選擇參考資料由于我是一邊學(xué)一邊寫, 而不是我完全學(xué)會了之后才開始很有條理的寫, 所以參考資料就很重要(本來應(yīng)該是個人開發(fā)經(jīng)驗很重要, 但我是零基礎(chǔ)).Python官方文檔知乎相關(guān)資料(1) 這篇非常好, 通俗易懂的總覽整個Python學(xué)習(xí)框架.知乎相關(guān)資料(2)寫到這里的時候, 上面第二第三個鏈接的票數(shù)第一的回答已經(jīng)看完了, 點擊鏈接加入群【我愛python大神】:https://jq.qq.com/?_wv=1027&k=47xNlOU他們提到的有些部分(比如爬行的路線不能有回路)我就不寫了. 一個簡單的偽代碼以下這個簡單的偽代碼用到了set和queue這兩種經(jīng)典的數(shù)據(jù)結(jié)構(gòu), 集與隊列. 集的作用是記錄那些已經(jīng)訪問過的頁面, 隊列的作用是進(jìn)行廣度優(yōu)先搜索.queue Qset SStartPoint = "http://jecvay.com"Q.push(StartPoint)? # 經(jīng)典的BFS開頭S.insert(StartPoint)? # 訪問一個頁面之前先標(biāo)記他為已訪問while (Q.empty() == false)? # BFS循環(huán)體? T = Q.top()? # 并且pop? for point in PageUrl(T)? # PageUrl(T)是指頁面T中所有url的集合, point是這個集合中的一個元素.? ? if (point not in S)? ? ? Q.push(point)? ? ? S.insert(point)1234567891011queue Qset SStartPoint = "http://jecvay.com"Q.push(StartPoint)? # 經(jīng)典的BFS開頭S.insert(StartPoint)? # 訪問一個頁面之前先標(biāo)記他為已訪問while (Q.empty() == false)? # BFS循環(huán)體? T = Q.top()? # 并且pop? for point in PageUrl(T)? # PageUrl(T)是指頁面T中所有url的集合, point是這個集合中的一個元素.? ? if (point not in S)? ? ? Q.push(point)? ? ? S.insert(point)這個偽代碼不能執(zhí)行,? 我覺得我寫的有的不倫不類, 不類Python也不類C++.. 但是我相信看懂是沒問題的, 這就是個最簡單的BFS結(jié)構(gòu). 我是看了知乎里面的那個偽代碼之后, 自己用我的風(fēng)格寫了一遍. 你也需要用你的風(fēng)格寫一遍.這里用到的Set其內(nèi)部原理是采用了Hash表, 傳統(tǒng)的Hash對爬蟲來說占用空間太大, 因此有一種叫做Bloom Filter的數(shù)據(jù)結(jié)構(gòu)更適合用在這里替代Hash版本的set. 我打算以后再看這個數(shù)據(jù)結(jié)構(gòu)怎么使用, 現(xiàn)在先跳過, 因為對于零基礎(chǔ)的我來說, 這不是重點. 代碼實現(xiàn)(一): 用Python抓取指定頁面我使用的編輯器是Idle, 安裝好Python3后這個編輯器也安裝好了, 小巧輕便, 按一個F5就能運(yùn)行并顯示結(jié)果. 代碼如下:#encoding:UTF-8import urllib.requesturl = "http://www.baidu.com"data = urllib.request.urlopen(url).read()data = data.decode('UTF-8')print(data)1234567#encoding:UTF-8import urllib.request url = "http://www.baidu.com"data = urllib.request.urlopen(url).read()data = data.decode('UTF-8')print(data)b0ea9ff58c6ba7c21738257af9af92e3urllib.request是一個庫, 隸屬urllib. 點此打開官方相關(guān)文檔. 官方文檔應(yīng)該怎么使用呢? 首先點剛剛提到的這個鏈接進(jìn)去的頁面有urllib的幾個子庫, 我們暫時用到了request, 所以我們先看urllib.request部分. 首先看到的是一句話介紹這個庫是干什么用的:The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.然后把我們代碼中用到的urlopen()函數(shù)部分閱讀完.urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)重點部分是返回值, 這個函數(shù)返回一個 http.client.HTTPResponse 對象, 這個對象又有各種方法, 比如我們用到的read()方法, 這些方法都可以根據(jù)官方文檔的鏈接鏈過去. 根據(jù)官方文檔所寫, 我用控制臺運(yùn)行完畢上面這個程序后, 又繼續(xù)運(yùn)行如下代碼, 以更熟悉這些亂七八糟的方法是干什么的.>>> a = urllib.request.urlopen(full_url)>>> type(a)>>> a.geturl()'http://www.baidu.com/s?word=Jecvay'>>> a.info()>>> a.getcode()
點擊鏈接加入群【+學(xué)習(xí)交流】:https://jq.qq.com/?_wv=1027&k=47xRw91

200

代碼實現(xiàn)(二): 用Python簡單處理URL

如果要抓取百度上面搜索關(guān)鍵詞為Jecvay Notes的網(wǎng)頁, 則代碼如下

import urllib

import urllib.request

data={}

data['word']='Jecvay Notes'

url_values=urllib.parse.urlencode(data)

url="http://www.baidu.com/s?"

full_url=url+url_values

data=urllib.request.urlopen(full_url).read()

data=data.decode('UTF-8')

print(data)

1

2

3

4

5

6

7

8

9

10

11

12

13

import urllib

import urllib.request

data={}

data['word']='Jecvay Notes'

url_values=urllib.parse.urlencode(data)

url="http://www.baidu.com/s?"

full_url=url+url_values

data=urllib.request.urlopen(full_url).read()

data=data.decode('UTF-8')

print(data)

data是一個字典, 然后通過urllib.parse.urlencode()來將data轉(zhuǎn)換為 'word=Jecvay+Notes'的字符串, 最后和url合并為full_url, 其余和上面那個最簡單的例子相同. 關(guān)于urlencode(), 同樣通過官方文檔學(xué)習(xí)一下他是干什么的. 通過查看

urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)

大概知道他是把一個通俗的字符串, 轉(zhuǎn)化為url格式的字符串.點擊鏈接加入群【+學(xué)習(xí)交流】:https://jq.qq.com/?_wv=1027&k=47xRw91

學(xué)好python你需要一個良好的環(huán)境患久,一個優(yōu)質(zhì)的開發(fā)交流群剩辟,群里都是那種相互幫助的人才是可以的,我有建立一個python學(xué)習(xí)交流群歉秫,在群里我們相互幫助兰珍,相互關(guān)心捶牢,相互分享內(nèi)容崖叫,這樣出問題幫助你的人就比較多欣范,群號是304加上050最後799变泄,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你恼琼,不愿意分享或者幫助別人妨蛹,那就請不要加了,你把你會的告訴別人這是一種分享晴竞。

感覺寫的好蛙卤,對你有幫助,就點個贊唄噩死,別光只收藏哈.~( ̄▽ ̄)~

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颤难,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子已维,更是在濱河造成了極大的恐慌乐严,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衣摩,死亡現(xiàn)場離奇詭異昂验,居然都是意外死亡捂敌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門既琴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來占婉,“玉大人,你說我怎么就攤上這事甫恩∧婕茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵磺箕,是天一觀的道長奖慌。 經(jīng)常有香客問我,道長松靡,這世上最難降的妖魔是什么简僧? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雕欺,結(jié)果婚禮上岛马,老公的妹妹穿的比我還像新娘。我一直安慰自己屠列,他們只是感情好啦逆,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笛洛,像睡著了一般夏志。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苛让,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天盲镶,我揣著相機(jī)與錄音,去河邊找鬼蝌诡。 笑死,一個胖子當(dāng)著我的面吹牛枫吧,可吹牛的內(nèi)容都是我干的浦旱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼九杂,長吁一口氣:“原來是場噩夢啊……” “哼颁湖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起例隆,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甥捺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镀层,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镰禾,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吴侦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋休。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖备韧,靈堂內(nèi)的尸體忽然破棺而出劫樟,到底是詐尸還是另有隱情,我是刑警寧澤织堂,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布叠艳,位于F島的核電站,受9級特大地震影響易阳,放射性物質(zhì)發(fā)生泄漏附较。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一闽烙、第九天 我趴在偏房一處隱蔽的房頂上張望翅睛。 院中可真熱鬧,春花似錦黑竞、人聲如沸捕发。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎酷。三九已至,卻和暖如春遏匆,著一層夾襖步出監(jiān)牢的瞬間法挨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工幅聘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凡纳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓帝蒿,卻偏偏與公主長得像荐糜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子葛超,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1 前言 作為一名合格的數(shù)據(jù)分析師暴氏,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲绣张、數(shù)據(jù)提取答渔、數(shù)據(jù)分析、數(shù)據(jù)挖掘侥涵、...
    whenif閱讀 18,064評論 45 523
  • 一沼撕、概述 urllib2是Python的一個針對URLs的庫宋雏。他以urlopen函數(shù)的形式提供了一個非常簡單的...
    MiracleJQ閱讀 1,482評論 0 5
  • 那么接下來,小伙伴們就一起和我真正邁向我們的爬蟲之路吧端朵。 1.分分鐘扒一個網(wǎng)頁下來 怎樣扒網(wǎng)頁呢好芭?其實就是根據(jù)UR...
    xmsumi閱讀 447評論 0 0
  • 白色的巨塔 從地下慢慢升起 平靜一如古井 歡騰如激浪 悠揚(yáng)的笛聲 從塔身的窗戶輕快跳出 塔尖的水晶閃耀著光輝 覆蓋...
    月光與墓碑閱讀 511評論 0 0
  • 這周因為特別忙,看書的進(jìn)展比較慢冲呢,一直跟著群里的話題討論舍败,看著媽媽們一起分享交流,收獲還是蠻多的敬拓。正面管教中和善而...
    andezhongzi閱讀 161評論 0 0