iOS程序員如何使用Python寫網路爬蟲
寫網路爬蟲,除了c/c++,第二門語言最好的選擇就是python.
原因就是
1.語法簡單
2.庫太多,隨便想要什麼功能的庫都找得到,簡直編程界的哆啦A夢.
3.語法優美,不信?你去看看python超過兩千行的代碼再回頭看看用oc寫的超過兩千行的代碼,oc寫的簡直丑到極致(沒命名空間,點語法調用和括弧調用混用).
為什麼要會寫爬蟲?
春節前有一件活無人認領,我就自告奮勇認領了,具體如下:
自己寫程序在豆瓣讀書上抓取人
熊節覺得一個好的程序員應該讀過那20本好書 ——《重構》《精益創業》《敏捷軟體開發》《測試驅動開發》等等。他在為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裡面找到正確的圖片鏈接那可不是件簡單的事,據我這幾天的學習,做法無非兩個,一個是自己寫正則表達式然後用一個叫re的python庫,另一個是使用lxml解析xpath.這兩個說實話都不太好用,一個正則就夠你吃一壺的.後來我搜索了很久,發現了一個庫叫做beautifulsoup,用這個庫解析html超級好用.
然後你們打開terminal敲入下面這個命令.
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標籤就可以找到所有的圖片鏈接了.
然後看代碼.
#!/usr/bin/python
#-*- coding: utf-8 -*-
#encoding=utf-8
import urllib2
import urllib
import os
from BeautifulSoup import BeautifulSoup
def getAllImageLink():
html = urllib2.urlopen("http://www.dbmeizi.com").read()
soup = BeautifulSoup(html)
liResult = soup.findAll("li",attrs={"class":"span3"})
for li in liResult:
imageEntityArray = li.findAll("img")
for image in imageEntityArray:
link = image.get("src")
imageName = image.get("data-id")
filesavepath = "/Users/weihua0618/Desktop/meizipicture/%s.jpg" % imageName
urllib.urlretrieve(link,filesavepath)
print filesavepath
if __name__ == "__main__":
getAllImageLink()
我們來一句一句分析下.其實python的語法超級簡單.
凡是#打頭的就是python裡面的注釋語句類似於oc里的//.
分別說明我們的環境是python,編碼是utf-8
然後import了四個庫,分別是urllib2,urllib,os,和beautifulsoup庫.
導入beautifulsoup庫的方式和其他三個不太一樣.我暫時也不清楚為什麼python用這種導入方式,不過照貓畫虎就行了.
然後def打頭的就是定義一個函數,python裡面是不用分號做句與句的分隔符的.他用縮進來表示.與def縮進一個tab的都是函數體.
html = urllib2.urlopen("http://www.dbmeizi.com").read()
這句很簡單,就是讀取網頁的html.然後把值賦給html這個變數.python里聲明變數前面不用加任何東西,不用加聲明語句和變數類型,就連javascript聲明變數還要加個var呢.
我們獲取了網頁的html之後呢,聲明了一個beautifulsoup變數soup,用來準備解析html.
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("src")
imageName = image.get("data-id")
這兩句的意思就是,獲取img標籤里的"src"屬性和"data-id"屬性,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和大數據分析" -_-!
作者:葉孤城___ - 簡書
https://github.com/zangqilong198812
鏈接:http://www.jianshu.com/p/b87413a9307e
程序員大咖整理髮布,轉載請聯繫作者獲得授權。
↙點擊「
閱讀原文
」,加入
『程序員大咖』
※【Python爬蟲實戰】爬取糗事百科段子
※我用 Python 和 Twilio 實現自動化選課
※可能是史上最全的機器學習和Python速查表
※各種相似性度量及Python實現
TAG:Python |
※使用PyTorch從零開始構建Elman循環神經網路
※使用Google Colaboratory訓練神經網路
※Python之Sklearn使用教程
※一文詳解如何使用Python和Keras構建屬於你的AlphaZero AI
※一文詳解如何使用Python和Keras構建屬於你的「AlphaZero AI」
※使用PrettyPrinter讓Python輸出更漂亮
※TwelveSouth發布AirFly轉接器 坐飛機使用AirPods更輕鬆
※TwelveSouth 發布 AirFly 轉接器,坐飛機使用 AirPods 更輕鬆
※Python爬蟲系列:使用selenium+Edge查詢指定城市天氣情況
※Python 標準庫之 collections 使用教程
※使用 Jira Software 搜索加速 DevOps 工作流程
※Apple停止使用AirPort WiFi路由器
※使用Tensorflow Object Detection API實現對象檢測
※使用CoreRT將.NET Core發布為Native應用程序
※如何使用TensorFlow中的Dataset API
※Steam現已支持使用Switch Pro手柄遊玩
※MPAndroidChart LineChart使用
※為什麼使用 Web Services?
※紐約警局開始棄用Windows Phone,使用iPhone
※macOS Sierra:在Mac 上使用 Touch ID Use Touch ID on your Mac