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!
推薦閱讀:
- Python基於百度AI實現抓取表情包
- Python爬蟲Requests庫的使用詳情
- 用python批量下載apk
- 使用python刷訪問量的示例代碼
- python利用多線程+隊列技術爬取中介網互聯網網站排行榜