Python 爬取網頁圖片詳解流程

簡介

快樂在滿足中求,煩惱多從欲中來

記錄程序的點點滴滴。
輸入一個網址從這個網址中解析出圖片,並將它保存在本地

流程圖

在這裡插入圖片描述

程序分析

解析主網址

def get_urls():
    url = 'http://www.nipic.com/show/35350678.html' # 主網址
    pattern = "(http.*?jpg)"
    header = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'
    }
    r = requests.get(url,headers=header)
    r.encoding = r.apparent_encoding
    html = r.text
    urls = re.findall(pattern,html)
    return urls

url 為需要爬的主網址
pattern 為正則匹配
header 設置請求頭
r = requests.get(url,headers=header) 發送請求
r.encoding = r.apparent_encoding 設置編碼格式,防止出現亂碼

屬性 說明
r.encoding 從http header中提取響應內容編碼
r.apparent_encoding 從內容中分析出的響應內容編碼

urls = re.findall(pattern,html) 進行正則匹配
re.findall(pattern, string, flags=0)
正則 re.findall 的簡單用法(返回string中所有與pattern相匹配的全部字串,返回形式為數組)

下載圖片並存儲

def download(url_queue: queue.Queue()):
    while True:
        url = url_queue.get()
        root_path = 'F:\\1\\' # 圖片存放的文件夾位置
        file_path = root_path + url.split('/')[-1] #圖片存放的具體位置
        try:
            if not os.path.exists(root_path): # 判斷文件夾是是否存在,不存在則創建一個
                os.makedirs(root_path)
            if not os.path.exists(file_path): # 判斷文件是否已存在
                r = requests.get(url)
                with open(file_path,'wb') as f:
                    f.write(r.content)
                    f.close()
                    print('圖片保存成功')
            else:
                print('圖片已經存在')
        except Exception as e:
            print(e)
        print('線程名: ', threading.current_thread().name,"url_queue.size=", url_queue.qsize())

此函數需要傳一個參數為隊列
queue模塊中提供瞭同步的、線程安全的隊列類,queue.Queue()為一種先入先出的數據類型,隊列實現瞭鎖原語,能夠在多線程中直接使用。可以使用隊列來實現線程間的同步。
url_queue: queue.Queue() 這是一個隊列類型的數據,是用來存儲圖片URL
url = url_queue.get() 從隊列中取出一個url
url_queue.qsize() 返回隊形內元素個數

全部代碼

import requests
import re
import os
import threading
import queue
def get_urls():
    url = 'http://www.nipic.com/show/35350678.html' # 主網址
    pattern = "(http.*?jpg)"
    header = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'
    }
    r = requests.get(url,headers=header)
    r.encoding = r.apparent_encoding
    html = r.text
    urls = re.findall(pattern,html)
    return urls
def download(url_queue: queue.Queue()):
    while True:
        url = url_queue.get()
        root_path = 'F:\\1\\' # 圖片存放的文件夾位置
        file_path = root_path + url.split('/')[-1] #圖片存放的具體位置
        try:
            if not os.path.exists(root_path):
                os.makedirs(root_path)
            if not os.path.exists(file_path):
                r = requests.get(url)
                with open(file_path,'wb') as f:
                    f.write(r.content)
                    f.close()
                    print('圖片保存成功')
            else:
                print('圖片已經存在')
        except Exception as e:
            print(e)
        print('線程名:', threading.current_thread().name,"圖片剩餘:", url_queue.qsize())

if __name__ == "__main__":
	url_queue = queue.Queue()
	urls = tuple(get_urls())
	for i in urls:
	    url_queue.put(i)
	t1 = threading.Thread(target=download,args=(url_queue,),name="craw{}".format('1'))
	t2 = threading.Thread(target=download,args=(url_queue,),name="craw{}".format('2'))
	
	t1.start()
	t2.start()

到此這篇關於Python 爬取網頁圖片詳解流程的文章就介紹到這瞭,更多相關Python 爬取網頁圖片內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: