1. 程式人生 > >爬蟲系列(六)--爬取頁面上的影象

爬蟲系列(六)--爬取頁面上的影象

爬蟲系列(六)--爬取頁面上的影象

馬上國慶節了,要是再不寫,可能又要到了十一過後才能寫了。影象的爬取和普通頁面的爬取是一樣的,只是不需要進行轉碼,是二進位制資料,直接寫入檔案中就行了。要注意的地方就是副檔名,還有圖片檔案是否已經存在了。


1.目標簡介

下面的內容要實現的是爬取取某個指定頁面上的圖片。要是想要爬取指定區域內的圖片或者是全站圖片的話,需要結合前面的幾篇文章的內容,稍微組合一下即可。

任務分解

  • 單張圖片下載:給一個圖片url,下載下來
  • 提取出頁面上需要的圖片的url

2.圖片下載

這裡實現一個函式,函式需要一個url,和一個檔案路徑和名稱,把該圖片下載到本地。

from urllib import request
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }

def download_image(load_url,file_path_name,header=None):
    success=True
    try:
        req = request.Request(url=load_url,headers=header)#建立請求物件
        connect = request.urlopen(req)#開啟該請求
        byte_res = connect.read()#讀取所有資料,很暴力
        
        #寫入檔案
        f=open(file_path_name,"wb")
        f.write(byte_res)
        f.close()
    except Exception as e:
        print(e)
        success=False
    return success

#測試呼叫
url="https://bpic.588ku.com//ppt_face/20/18/09/3930044398d0f5fc45c520f6a663c39d.jpg"
fp="./bbb.jpg"
download_image(url, fp, header_dict)

3.獲取頁面上的所有圖片url

這個和前面某篇文章中的獲取其他頁面連結是一樣的。這裡也寫成一個函式。

from urllib import request
from lxml import etree
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }
def get_http(load_url,header=None):
    res=""
    try:
        req = request.Request(url=load_url,headers=header)#建立請求物件
        connect = request.urlopen(req)#開啟該請求
        byte_res = connect.read()#讀取所有資料,很暴力
        try:
            res=byte_res.decode(encoding='utf-8')
        except:
            try:
                res=byte_res.decode(encoding='gbk')
            except:
                res=""
    except Exception as e:
        print(e)
    return res

def get_page_images(url):
    html_text=get_http(url,header_dict)
    tree=etree.HTML(html_text)
    dir(tree)
    img_urls=tree.xpath("//img/@src")
    return img_urls
url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml"
urls=get_page_images(url)
print(urls)
#輸出:['//beacon.sina.com.cn/a.gif?noScript', '//i.sso.sina.com.cn/images/login/thumb_default.png'...]

4.組裝2和3

from urllib import request
from lxml import etree
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }

#影象下載
def download_image(load_url,file_path_name,header=None):
    success=True
    try:
        req = request.Request(url=load_url,headers=header)#建立請求物件
        connect = request.urlopen(req)#開啟該請求
        byte_res = connect.read()#讀取所有資料,很暴力
        
        #寫入檔案
        f=open(file_path_name,"wb")
        f.write(byte_res)
        f.close()
    except Exception as e:
        print(e)
        success=False
    return success

#頁面下載
def get_http(load_url,header=None):
    res=""
    try:
        req = request.Request(url=load_url,headers=header)#建立請求物件
        connect = request.urlopen(req)#開啟該請求
        byte_res = connect.read()#讀取所有資料,很暴力
        try:
            res=byte_res.decode(encoding='utf-8')
        except:
            try:
                res=byte_res.decode(encoding='gbk')
            except:
                res=""
    except Exception as e:
        print(e)
    return res

#獲取全部影象url
def get_page_images(url):
    html_text=get_http(url,header_dict)
    tree=etree.HTML(html_text)
    dir(tree)
    img_urls=tree.xpath("//img/@src")
    return img_urls


url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml"
urls=get_page_images(url)
namei=1001
for url in urls:
    url="http:"+url
    file_name="./img_"+str(namei)
    if url.find(".jpg")>=0:
        file_name+=".jpg"
    elif url.find(".png")>=0:
        file_name+=".png"
    elif url.find(".gif")>=0:
        file_name+=".gif"
    elif url.find(".jpeg")>=0:
        file_name+=".jpeg"
    else:
        print("未知圖片型別",url)
        continue
    state=download_image(url,file_name,header_dict)
    if state:
        namei+=1
    else:
        print("下載失敗",url)


下一篇爬蟲文章的內容暫時保密,18年國慶過後寫。