1. 程式人生 > >簡單爬蟲:re和urllib

簡單爬蟲:re和urllib

通過python 來實現一個簡單的爬蟲功能,把我們想要的圖片爬取到本地。

一,獲取整個頁面資料
首先我們可以先獲取要下載圖片的整個頁面資訊。

#spider1.py

#coding=utf-8
import urllib

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

html = getHtml("http://tieba.baidu.com/p/2460150866")

print html

  Urllib 模組提供了讀取web頁面資料的介面,我們可以像讀取本地檔案一樣讀取www和ftp上的資料。首先,我們定義了一個getHtml()函式:

  urllib.urlopen()方法用於開啟一個URL地址。

  read()方法用於讀取URL上的資料,向getHtml()函式傳遞一個網址,並把整個頁面下載下來。執行程式就會把整個網頁列印輸出。

二,篩選頁面中想要的資料

  Python 提供了非常強大的正則表示式,我們需要先要了解一點python 正則表示式的知識才行。

假如我們百度貼吧找到了幾張漂亮的圖片,通過到前端檢視工具。找到了圖片的地址,如:src=”http://imgsrc.baidu.com/forum……jpg” pic_ext=”jpeg”
這裡寫圖片描述
修改程式碼如下:

#spider2.py
import re
import
urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'src="(.+?\.jpg)" pic_ext' imgre = re.compile(reg) imglist = re.findall(imgre,html) return imglist html = getHtml("http://tieba.baidu.com/p/2460150866") print getImg(html)
上面正則表示式解釋:
src=r'"(.+?\.jpg)" pic_ext'

"           #匹配"

(.+?\.jpg)
# 括號表示分組,將括號的內容捕獲到分組當中
# .+表示匹配至少一個任意字元,問號?表示懶惰匹配,也就是匹配儘可能少的字串。
#  .+?\.jpg合起來表示儘可能少匹配字元的匹配到.jpg,避免匹配範圍超出src的範圍(其中\.中的\表示轉義字元)
#  這個括號也就可以匹配網頁中圖片的url了

"           #匹配"

pic_ext         #匹配 pic_ext

  我們又建立了getImg()函式,用於在獲取的整個頁面中篩選需要的圖片連線。re模組主要包含了正則表示式:

  re.compile() 可以把正則表示式編譯成一個正則表示式物件.

  re.findall() 方法讀取html 中包含 imgre(正則表示式)的資料。

   執行指令碼將得到整個頁面中包含圖片的URL地址。

三,將頁面篩選的資料儲存到本地
把篩選的圖片地址通過for迴圈遍歷並儲存到本地,程式碼如下:

#spider3.py
#conding:utf-8
import re
import urllib

def gethtml(url):
    page=urllib.urlopen(url)
    html=page.read()
    return html
def getimg(html):
    reg=r'src="(.+?\.jpg)" pic_ext'
    img=re.compile(reg)
    imglist=re.findall(img,html)
    return  imglist
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl,'E:\%s.jpg'% x)
        x+=1

if __name__=='__main__':
    html=gethtml("http://tieba.baidu.com/p/2460150866")
    img=getimg(html)
    print(img)

  這裡的核心是用到了urllib.urlretrieve()方法,直接將遠端資料下載到本地。

  通過一個for迴圈對獲取的圖片連線進行遍歷,為了使圖片的檔名看上去更規範,對其進行重新命名,命名規則通過x變數加1。儲存的位置預設為程式的存放目錄。

程式執行完成,將在目錄下看到下載到本地的檔案。