1. 程式人生 > >用python寫一個簡單的爬蟲功能

用python寫一個簡單的爬蟲功能

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

1.語法簡單

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

3.語法優美,不信?你去看看python超過兩千行的程式碼再回頭看看用oc寫的超過兩千行的程式碼,oc寫的簡直醜到極致(沒名稱空間,點語法呼叫和括號呼叫混用).

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

廢話不多說.開始寫.

我先假設你用的是Mac,然後Mac都預裝了python2.x,然後呢,你有了python沒用,你得有庫.沒庫怎麼幹活?怎麼安裝庫呢?

python界也有個類似於我們iOS開發裡cocoapods的東西,這個東西叫做pip.

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

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

Beautifulsoup幹什麼的呢?你用urllib2把網頁down下來了之後,裡面都是html+css什麼的,你想要從亂七八糟的一堆html裡面找到正確的圖片連結那可不是件簡單的事,據我這幾天的學習,做法無非兩個,一個是自己寫正則表示式然後用一個叫re的python庫,另一個是使用lxml

解析xpath.這兩個說實話都不太好用,一個正則就夠你吃一壺的.後來我搜索了很久,發現了一個庫叫做Beautifulsoup,用這個庫解析html超級好用.

首先配置python環境,安裝pip:

curl -O http://python-distribute.org/distribute_setup.py
udo python distribute_setup.py 回車然後輸入密碼
sudo easy_install pip

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

pip install BeautifulSoup

然後就會自動幫你安裝BeautifulSoup這個東西了.urllib2

因為是自帶的,所以不用你下載了.

好的我們隨意開啟網頁http://www.pcpop.com/doc/1/1279/1279531.shtml,直接右鍵開啟原始檔.

你看到的是這些東西.

圖片連結就在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.pcpop.com/doc/1/1279/1279531.shtml').read()
    soup = BeautifulSoup(html)
    liResult = soup.findAll('img',attrs={"width":"175"})
    #print liResult 方便除錯

    count = 0;
    for image in liResult:
        count += 1
        link = image.get('src')
        imageName = count
        filesavepath = '/Users/justinjing/Desktop/testpython/%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.pcpop.com/doc/1/1279/1279531.shtml').read()

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

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

liResult = soup.findAll('img',attrs={"width":"175"})

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

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

for image in liResult:

這句話基本和oc裡的遍歷陣列語法完全一樣.就是遍歷liResult裡的每一個變數.那麼每一個變數就是一個標籤.

link = image.get('src')

這句的意思就是,獲取img標籤裡的src屬性,src就是我們最想要的圖片連結了.

這裡定義了一個變數count = 0,然後在 for 迴圈裡面做遞加 count += 1,最終把這個值

賦給我們的變數imageName = count,以便後面使用。

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

urllib.urlretrieve(link,filesavepath)

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

好了,萬事具備了,我們現在跑一下我們的指令碼

python test_python.py

icon1

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

然後在看看下載的內容:

icon2