第一隻python小爬蟲

九茶發表於2015-03-24

前言:

網際網路就像一張無形的蜘蛛網,網站就相當於在這張網的交叉結點。而網路爬蟲就是這張網上的蜘蛛,它是一種程式,能夠利用url連結在各網站之間自動穿梭並抓取所需資料。

學了python的正規表示式之後,我便迫不及待的想要找個應用玩一下,而網路爬蟲就是個不二的選擇。下面記錄一下我寫的第一隻小爬蟲,用來自動下載網頁上的圖片。

(操作環境:32位Win8系統,執行工具:python2.7.9+Eclipse.)


正文:

1、首先,每個網站都有一個URL地址,通過這個URL可以進入各個相應的網站。我們在瀏覽網頁 點選進入其他網頁的時候,其實就是開啟其他網頁的跳轉連結URL。我們所看到的每個網頁“背後”都有著很多其他網頁的跳轉連結,我們只需滑鼠右鍵開啟網頁原始碼即可檢視到。

2、首先,我們用到的是python的urllib模組。其中有幾個方法是比較重要的:

url.urlopen(url,data=None,proxies=None,context=None)  根據URL開啟網頁,返回一個控制程式碼

url.urlopen()的物件有個方法:read()  用於讀取網頁原始碼

url.urlretrieve(url,filename=None,reporthook=None,data=None,context=None)  用於從網頁上下載資料到本地


我們首先用urlopen()開啟一個網頁,獲得一個控制程式碼;然後用控制程式碼.read()獲取網頁原始碼;再用正規表示式從網頁原始碼中找出各個圖片的URL;最後用urlretrieve(URL,'XXX.jpg')下載圖片。

程式碼如下:

import re
import urllib

def getHtml(url):
    page = urllib.urlopen(url)
    html1 = page.read()
    return html1

def getImg(html1):
    reg = 'src="(http://img.{,110}?\.jpg)"'
    imglist = re.findall(reg,html1)
    urllib.urlretrieve(imglist[1],'1.jpg')

str2 = raw_input('Please input URL:')
html1 = getHtml(str2)
getImg(html1)
print 'Finish!'
示例網頁:http://mm.taobao.com/689744369.htm

以上程式碼只下載了一張圖片,但網頁上所有圖片的URL都已經找到 放在imglist裡面,我們只要加上個迴圈就可以下載全部圖片了。


程式碼很簡單,主要是要獲取到圖片的URL。而圖片URL的獲取 是從網頁原始碼上用正規表示式匹配出來的。

每一個網頁對應的原始碼格式都會有點差異,所以我們從不同網頁上下載圖片,最重要的就是檢視網頁原始碼,分析圖片URL的位置,然後編寫恰當的正規表示式把圖片URL拿下來。


分享兩個視訊教程,一個是智普教育的淘女郎圖片爬蟲(http://pan.baidu.com/s/1ntj2AX7),另一個是中谷教育的小爬蟲教學視訊(http://pan.baidu.com/s/1nt63lR7)

我最初看的是中谷教學視訊,初識網路小爬蟲。後來看到智普的視訊,最大的收穫就是不小心知道了淘女郎的網址(http://mm.taobao.com/689744369.htm)裡面一大片MM的照片,正愁沒個好網址來練手呢。然後智普在獲取圖片URL的時候用的是切片,這也是一種方法,但相對於正規表示式而言就顯得太繁雜了。


總結:

感覺這個小爬蟲挺好玩的,就是現在下載來的圖片沒什麼用,下完了看兩眼就都刪了。在知乎、部落格裡面搜了python爬蟲的相關資料,其實我這個小爬蟲也太小了,根本微不足道,只是下載幾張圖片而已。爬蟲的真正應用是在搜尋引擎和爬一些供資料探勘的源資料,稍微大隻一點的爬蟲應該是執行在分散式機器上的,而且能夠熟練、有效地在各個網頁中穿梭、抓取資料。任重道遠,繼續努力!


以下是我抓取整一個頁面10個淘女郎的圖片(將近兩千張),首先獲取10個淘女郎的主頁連結,進入各個淘女郎的主頁,然後再獲取圖片的URL進行下載:

import re
import urllib
global a
a = 1

def getHtml(url):
    page = urllib.urlopen(url)
    html1 = page.read()
    return html1
     
def getImg(html1):
    global a
    reg = 'src="(http://img.{,110}?\.jpg)"'
    imgre = re.compile(reg)
    imglist = imgre.findall(html1)
    for imgurl in imglist:
        urllib.urlretrieve(imgurl,'%d.jpg'%a)
        print a,imgurl
        a += 1

strMain = raw_input('Please input URL:')
htmlMain = getHtml(strMain)
regMain = 'a href="(http://mm.taobao.com/\d+?\.htm)'
urlSon = re.compile(regMain)
htmlList = urlSon.findall(htmlMain)
for html in htmlList:
    html0 = getHtml(html)
    getImg(html0)
    
print 'Finish!'
示例網頁:http://mm.taobao.com/json/request_top_list.htm?type=0&page=8

轉載請註明出處,謝謝!(原文連結:http://blog.csdn.net/bone_ace/article/details/44598527

相關文章