iOS程式員如何使用python寫網路爬蟲

來源:互聯網
上載者:User

iOS程式員如何使用python寫網路爬蟲

我上一篇blog說過,iOS開發如果之前沒接觸過除了c和c++(c++太難了,不花個十來年基本不可能精通)的語言,第二門語言最好的選擇就是python.

原因就是

1.文法簡單

2.庫太多,隨便想要什麼功能的庫都找得到,簡直編程界的哆啦A夢.

3.文法優美,不信?你去看看python超過兩千行的代碼再回頭看看用oc寫的超過兩千行的代碼,oc寫的簡直醜到極致(沒命名空間,點文法調用和括弧調用混用).

為什麼要會寫爬蟲?

春節前有一件活無人認領,我就自告奮勇認領了,具體如下:

自己寫程式在豆瓣讀書上抓取人

熊節覺得一個好的程式員應該讀過那20本好書 ——《重構》《精益創業》《敏捷式軟體開發 (Agile Software Development)》《測試驅動開發》等等。他在為ThoughtWorks組建成都分公司團隊的時候,發愁正統招聘方法太慢了。於是,他花了幾個晚上用自己高中自學的水貨代碼水平寫了一個程式,去抓取豆瓣上讀過這些技術書籍的人。然後不斷遞迴,再抓到這些人都讀過其它什麼書,再繼續抓讀過那些書的人。抓了幾萬人之後,他再用Hadoop來分析,篩選出了幾十個技術大牛。

他把這些大牛的豆瓣帳號扔給了公司女HR,讓HR去一個個發豆郵勾搭。

春節期間斷斷續續邊看邊學寫了個爬豆瓣上優秀iOS開發人員的爬蟲.所以感覺iOS開發人員有必要掌握這項技術.

再舉個例子,你如果想自己弄個app,例如每日精選美女之類的app,你服務端總得有圖吧,怎麼弄?自己用爬蟲爬啊,爬到連結了塞到資料庫裡,傳個json,app直接sdwebimage就好了.多爽!

廢話不多說.開始寫.

我先假設你用的是mac,然後mac都預裝了python2.x,然後呢,你有了python沒用,你得有庫.沒庫怎麼幹活?怎麼安裝庫呢?python界也有個類似於我們iOS開發裡cocoapods的東西,這個東西叫做pip.

pip和cocoapods用起來的命令都極其類似,我們只需要兩個庫,一個叫做urllib2,一個叫做beautifulsoup.

urllib2是幹什麼的呢?它的作用就是把網頁down下來,然後你就可以分析網頁了.

beautifulsoup幹什麼的呢?你用urllib2把網頁down下來了之後,裡面都是html+css什麼的,你想要從亂七八糟的一堆html裡面找到正確的圖片連結那可不是件簡單的事,據我這幾天的學習,做法無非兩個,一個是自己寫Regex然後用一個叫re的python庫,另一個是使用lxml解析xpath.這兩個說實話都不太好用,一個正則就夠你吃一壺的.後來我搜尋了很久,發現了一個庫叫做beautifulsoup,用這個庫解析html超級好用.

然後你們開啟terminal敲入下面這個命令.

1

pip install BeautifulSoup

然後就會自動幫你安裝BeautifulSoup這個東西了.urllib2因為是內建的,所以不用你下載了.

好的我們打www.dbmeizi.com,這個邪惡的網站,首頁都是軟妹子.直接右鍵開啟源檔案.

你看到的是這些東西.

看上去和亂碼沒什麼區別,但是我們需要仔細觀察.終於找到了圖片的連結.

圖片連結就在li這個標籤下地img標籤裡.現在我們需要做的就是嘗試著把這種類型的li從所有html中分離出來.我們可以看到li這個標籤有個屬性叫做class,這個屬性的值是class="span3",我們把這段話li class="span3"

搜尋一下,我們發現有20個結果.恰巧,我們這個頁面的圖片也只有20個,那麼可以確定的是我們找到了區別於其他標籤的唯一性.

再仔細分析下,img這個標籤在li這個標籤裡有且只有一個.那麼,也就是說,我們先搜尋出所有合格li標籤,然後找到裡面的img標籤就可以找到所有的圖片連結了.

然後看代碼.

 
  1. #!/usr/bin/python 
  2. #-*- coding: utf-8 -*- 
  3. #encoding=utf-8 
  4. import urllib2 
  5. import urllib 
  6. import os 
  7. from BeautifulSoup import BeautifulSoup 
  8. def getAllImageLink(): 
  9.     html = urllib2.urlopen('http://www.dbmeizi.com').read() 
  10.     soup = BeautifulSoup(html) 
  11.     liResult = soup.findAll('li',attrs={"class":"span3"}) 
  12.     for li in liResult: 
  13.         imageEntityArray = li.findAll('img') 
  14.         for image in imageEntityArray: 
  15.             link = image.get('data-src') 
  16.             imageName = image.get('data-id') 
  17.             filesavepath = '/Users/weihua0618/Desktop/meizipicture/%s.jpg' % imageName  
  18.             urllib.urlretrieve(link,filesavepath) 
  19.             print filesavepath  
  20. if __name__ == '__main__': 
  21.     getAllImageLink() 

我們來一句一句分析下.其實python的文法超級簡單.

凡是#打頭的就是python裡面的備註陳述式類似於oc裡的//.

分別說明我們的環境是python,編碼是utf-8

然後import了四個庫,分別是urllib2,urllib,os,和beautifulsoup庫.

匯入beautifulsoup庫的方式和其他三個不太一樣.我暫時也不清楚為什麼python用這種匯入方式,不過照貓畫虎就行了.

然後def打頭的就是定義一個函數,python裡面是不用分號做句與句的分隔字元的.他用縮排來表示.與def縮排一個tab的都是函數體.

1

html = urllib2.urlopen('http://www.dbmeizi.com').read()

這句很簡單,就是讀取網頁的html.然後把值賦給html這個變數.python裡聲明變數前面不用加任何東西,不用加聲明語句和變數類型,就連javascript聲明變數還要加個var呢.

我們擷取了網頁的html之後呢,聲明了一個beautifulsoup變數soup,用來準備解析html.

1

liResult = soup.findAll('li',attrs={"class":"span3"})

這句話的意思就是,尋找html中所有li標籤,並且這個li標籤有個屬性class,class的值是span3.

注意這個findAll函數,有點常識的話你應該清楚,凡是帶all的函數基本上返回的都是一個數組,所以我們liResult這個變數實際上是一個數組.

for li in liResult:

這句話基本和oc裡的遍曆數組文法完全一樣.就是遍曆liResult裡的每一個變數.那麼每一個變數就是一個\

標籤.

imageEntityArray = li.findAll('img')

獲得了li標籤,我們再找出所有的img標籤.

一樣的道理,遍曆所有img標籤(實際上只有一個).

link = image.get('data-src')

imageName = image.get('data-id')

這兩句的意思就是,擷取img標籤裡的'data-src'屬性和'data-id'屬性,data-src就是我們最想要的圖片連結了.data-id我們會用來當做下載圖片之後的名字.

filesavepath = '/Users/weihua0618/Desktop/meizipicture/%s.jpg' % imageName

urllib.urlretrieve(link,filesavepath)

這兩句,第一句是設定一個檔案存放地址,第二句用urllib這個庫的urlretrieve這個方法下載我們的圖片,並且把圖片放到剛才的路徑裡.

好了,我們的圖片就下載完了.

說說我是怎麼爬蟲所有豆瓣iOS開發的,我先找到所有標籤為ios開發的書籍,然後把所有書的id抓到,然後用id找到所有閱讀過書的使用者id,把所有使用者id抓下來之後用hadoop分析,哪些使用者id讀過的書最多,列出前一百個.然後,你們懂得...(昨天我的ip還是mac地址已經被豆瓣封了)

我感覺,我可以在簡曆上鄭重的寫下"精通python和大資料分析" -_-!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.