溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python怎么爬蟲網(wǎng)頁(yè)圖片

發(fā)布時(shí)間:2021-11-25 11:35:16 來(lái)源:億速云 閱讀:180 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Python怎么爬蟲網(wǎng)頁(yè)圖片”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

回車桌面圖片爬取

今天我們就來(lái)爬爬這個(gè)網(wǎng)站

https://tu.enterdesk.com/

這個(gè)網(wǎng)站能爬的資源還是很多的,但我就寫一個(gè)例子,其他的可以根據(jù)思路去寫。

首先還是先來(lái)分析下這個(gè)網(wǎng)站的圖片獲取過(guò)程

Python怎么爬蟲網(wǎng)頁(yè)圖片

我選擇的是圖庫(kù),先隨便選擇一個(gè)標(biāo)簽,我這選寵物吧

Python怎么爬蟲網(wǎng)頁(yè)圖片

那么就訪問(wèn)看看?隨便選取一個(gè)訪問(wèn)看看是不是能出圖片 https://tu.enterdesk.com/chongwu/6.html

結(jié)果肯定是可以的啦

問(wèn)題來(lái)了,現(xiàn)在怎么查看最后一頁(yè)的頁(yè)碼是什么?一種是無(wú)限循環(huán)下去 直到 沒(méi)有圖片標(biāo)簽的時(shí)候報(bào)錯(cuò),還有一種就是從源碼中找出頁(yè)碼 那就得看有沒(méi)有頁(yè)碼按鈕 剛才滾輪比較快 現(xiàn)在慢一點(diǎn) 看有沒(méi)有頁(yè)碼這些東西

Python怎么爬蟲網(wǎng)頁(yè)圖片

Ctrl+U走一波 源代碼直接搜索

Python怎么爬蟲網(wǎng)頁(yè)圖片

選擇目標(biāo)圖片看看是不是源地址 原圖 打開(kāi)一看其實(shí)不是

import requests
all_urls = []  # 我們拼接好的每一頁(yè)鏈接

class Spider():
    # 構(gòu)造函數(shù),初始化數(shù)據(jù)使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 獲取所有的想要抓取的URL
    def getUrls(self):
        #獲取末頁(yè)
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末頁(yè)的標(biāo)簽提取末頁(yè)的鏈接
        page_num = int(re.findall('(\d+)',res)[0])  #正則匹配 頁(yè)碼數(shù)
        global all_urls
        # 循環(huán)得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)

現(xiàn)在再點(diǎn)擊進(jìn)去圖片里面 發(fā)現(xiàn)是原圖了 這時(shí)再選擇圖片查看標(biāo)簽的圖片鏈接

Python怎么爬蟲網(wǎng)頁(yè)圖片

對(duì)比下兩個(gè)鏈接

import requests
all_urls = []  # 我們拼接好的每一頁(yè)鏈接

class Spider():
    # 構(gòu)造函數(shù),初始化數(shù)據(jù)使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 獲取所有的想要抓取的URL
    def getUrls(self):
        #獲取末頁(yè)
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末頁(yè)的標(biāo)簽提取末頁(yè)的鏈接
        page_num = int(re.findall('(\d+)',res)[0])  #正則匹配 頁(yè)碼數(shù)
        global all_urls
        # 循環(huán)得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)

略縮圖 edpic_360_360 原圖 edpic_source

這下整體思路就有啦,我們可以獲取略縮圖的鏈接將url進(jìn)行重構(gòu),形成原圖鏈接,然后再批量下載就好啦!

開(kāi)始擼代碼了!?。?/p>

第一個(gè)是 class Spider(): 我們聲明了一個(gè)類,然后我們使用 def __init__去聲明一個(gè)構(gòu)造函數(shù)

import requests
all_urls = []  # 我們拼接好的每一頁(yè)鏈接

class Spider():
    # 構(gòu)造函數(shù),初始化數(shù)據(jù)使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 獲取所有的想要抓取的URL
    def getUrls(self):
        #獲取末頁(yè)
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末頁(yè)的標(biāo)簽提取末頁(yè)的鏈接
        page_num = int(re.findall('(\d+)',res)[0])  #正則匹配 頁(yè)碼數(shù)
        global all_urls
        # 循環(huán)得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)

分析怎么提取末頁(yè)鏈接如下圖:

這里我們采用多線程的方式爬取,引入下面幾個(gè)模塊

from bs4 import BeautifulSoup #解析html
import threading #多線程
import re #正則匹配
import time #時(shí)間

新增加一個(gè)全局的變量,而且是多線程操作,我們需要引入線程鎖,避免資源同時(shí)寫入出錯(cuò)。

all_img_urls = []       #所有圖片鏈接
g_lock = threading.Lock()  #初始化一個(gè)鎖

聲明一個(gè)Producer的類,負(fù)責(zé)提取圖片鏈接,然后添加到 all_img_urls 這個(gè)全局變量中

class Producer(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        global all_urls
        while len(all_urls) > 0:
            g_lock.acquire()  # 在訪問(wèn)all_urls的時(shí)候,需要使用鎖機(jī)制
            page_url = all_urls.pop(0)  # 通過(guò)pop方法移除第一個(gè)元素,并且返回該值
            g_lock.release()  # 使用完成之后及時(shí)把鎖給釋放,方便其他線程使用
            try:
                print("分析" + page_url)
                response = requests.get(page_url, headers=headers, timeout=3).text
                html = BeautifulSoup(response,'html.parser')
                pic_link = html.find_all(class_='egeli_pic_li')[:-1]
                global all_img_urls
                g_lock.acquire()  # 這里還有一個(gè)鎖
                for i in pic_link:
                    link = i.find('img')['src'].replace('edpic_360_360','edpic_source')
                    all_img_urls.append(link)
                g_lock.release()  # 釋放鎖
                # time.sleep(0.1)
            except:
                pass

線程鎖,在上面的代碼中,當(dāng)我們操作all_urls.pop(0)的時(shí)候,我們是不希望其他線程對(duì)它進(jìn)行同時(shí)操作的,否則會(huì)出現(xiàn)意外,所以我們使用g_lock.acquire()鎖定資源,然后使用完成之后,記住一定要立馬釋放g_lock.release(),否則這個(gè)資源就一直被占用著,程序無(wú)法進(jìn)行下去了。

if __name__ == "__main__":

    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
    }

    target_url = 'https://tu.enterdesk.com/chongwu/%d.html'  # 圖片集和列表規(guī)則

    print('開(kāi)始獲取所有圖片頁(yè)鏈接!?。?#39;)
    spider = Spider(target_url, headers)
    spider.getUrls()
    print('完成獲取所有圖片頁(yè),開(kāi)始分析圖片鏈接?。?!')

    threads = []
    for x in range(10):
        gain_link = Producer()
        gain_link.start()
        threads.append(gain_link)

    # join 線程同步 主線程任務(wù)結(jié)束之后 進(jìn)入阻塞狀態(tài) 等待其他的子線程執(zhí)行結(jié)束之后 主線程在終止
    for tt in threads:
        tt.join()

下面再定義一個(gè)DownPic類 用于下載圖片

class DownPic(threading.Thread):
    
    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        while True:
            global all_img_urls
            # 上鎖
            g_lock.acquire()
            if len(all_img_urls) == 0:  # 如果沒(méi)有圖片了,就解鎖
                # 不管什么情況,都要釋放鎖
                g_lock.release()
                break
            else:
                t = time.time()
                down_time = str(round(t * 1000))  # 毫秒級(jí)時(shí)間戳
                pic_name = 'D:\\test\\'+ down_time + '.jpg'
                pic = all_img_urls.pop(0)
                g_lock.release()
                response = requests.get(pic, headers=headers)
                with open(pic_name, 'wb') as f:
                    f.write(response.content)
                    f.close()
                print(pic_name + '   已下載完成!?。?#39;)

可以看到利用了down_time = str(round(t * 1000)) 來(lái)生成毫秒級(jí)時(shí)間戳來(lái)命名圖片 其實(shí)也可以獲取圖片的名稱來(lái)命名 那就靠自己去寫一個(gè)了

再?gòu)膇f __name__ == "__main__": 添加下面代碼 用于開(kāi)啟多線程下載

 print('分析圖片鏈接完成,開(kāi)始多線程下載!?。?#39;)
    for x in range(20):
        download = DownPic()
        download.start()

整體流程就這么寫完啦!run下代碼

Python怎么爬蟲網(wǎng)頁(yè)圖片

Tips:跑這個(gè)代碼需要在D盤創(chuàng)建test文件夾 或者自己修改代碼實(shí)現(xiàn)其他功能

附出完整代碼:

import requests
from bs4 import BeautifulSoup #解析html
import threading #多線程
import re #正則匹配
import time #時(shí)間


all_urls = []  # 我們拼接好的每一頁(yè)鏈接
all_img_urls = []       #所有圖片鏈接
g_lock = threading.Lock()  #初始化一個(gè)鎖

class Spider():
    # 構(gòu)造函數(shù),初始化數(shù)據(jù)使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 獲取所有的想要抓取的URL
    def getUrls(self):
        #獲取末頁(yè)
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末頁(yè)的標(biāo)簽提取末頁(yè)的鏈接
        page_num = int(re.findall('(\d+)',res)[0])  #正則匹配 頁(yè)碼數(shù)
        global all_urls
        # 循環(huán)得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)


#負(fù)責(zé)提取圖片鏈接
class Producer(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        global all_urls
        while len(all_urls) > 0:
            g_lock.acquire()  # 在訪問(wèn)all_urls的時(shí)候,需要使用鎖機(jī)制
            page_url = all_urls.pop(0)  # 通過(guò)pop方法移除第一個(gè)元素,并且返回該值
            g_lock.release()  # 使用完成之后及時(shí)把鎖給釋放,方便其他線程使用
            try:
                print("分析">

“Python怎么爬蟲網(wǎng)頁(yè)圖片”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI