1. 程式人生 > >[8]個人學習python:爬取豆瓣首頁所有圖片

[8]個人學習python:爬取豆瓣首頁所有圖片

程式碼如下:

# -*- coding: utf-8 -*
import urllib.request,socket,re,sys,os
savepath=r'C:\\Users\\Administrator\\PycharmProjects\\untitled\\venv1\\image\\'
def saveimage(url):
    if not os.path.isdir(savepath):       
        os.mkdir(savepath)                
    begin=url.rindex('/')                 #獲取圖片名字的位置的前一位作為索引,最後一個'\'號的位置
    imagepath=os.path.join(savepath,url[begin+1:])   #path[begin+1:]擷取圖片名字',並加其加入到檔案路徑
    return imagepath
url='https://www.douban.com/'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
req=urllib.request.Request(url=url,headers=headers)
page=urllib.request.urlopen(req)
html=page.read()
reg=r'(https:[^\s]*?(png|gif|jpg))'
imag=re.compile(reg)                            
imageurls=re.findall(imag,str(html))            
#print (imageurls)          #此處可以發現imageurls是一個包含圖片連結和圖片格式的列表,所以for要用兩個引數
for imageurl,p in imageurls:
    try:
        urllib.request.urlretrieve(imageurl,saveimage(imageurl))
        print(imageurl, '\n下載成功')
    except:
        print (imageurl,'\n下載失敗')

結果如下:


分析:

    分析下圖片地址https://img1.doubanio.com/dae/niffler/niffler/images/3a845768-5da8-11e8-b5f8-0242ac110008.jpg
    rindex('/')獲取圖片地址的名字前一位位置作為索引,不要忘了圖片地址是字串!rindex()返回指定tr在字串中最後出現的位置,如果沒有匹配的字串會報異常。
1、正則表示式:
     '.'匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元;
     '*'匹配前一個字元零次到多次, '+'則是一次或多次,'?'匹配一次或零次,'[^\s]'匹配一個非空字元,'*?'常用搭配,匹配前一個或多個字元(可以重複匹配);
     '\'+'字元'構成轉義字元,'\'+'元字元或轉義字元'使其無效化,r只是使轉義字元失效。
2、在儲存到某目錄之前,要先檢查一下目錄是否存在,不存在則建立;
     os.path.isdir()判斷某一路徑是否為目錄;os.mkdir()建立目錄。
3、re.compile()函式用於編譯正則表示式,生成一個'正則表示式物件';
     re.findall()在字串中找到‘正則表示式物件’所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
4、urllib.urlopen()方法用於開啟一個URL地址,通常還要加read()獲取資料;urllib.urlretrieve()將指定的網址檔案下載到本地。