真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

多線程爬取wallhaven

前言

最近整理自己的項(xiàng)目時(shí),發(fā)現(xiàn)之前自己寫(xiě)的爬取wallhaven網(wǎng)站頓時(shí)有來(lái)的興趣決定再寫(xiě)一遍來(lái)回顧自己以前學(xué)的知識(shí)
網(wǎng)站地址:"https://wallhaven.cc/"

10年積累的網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有愛(ài)民免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

1. url參數(shù)結(jié)構(gòu)

從url地址我們發(fā)現(xiàn)為"https://wallhaven.cc/search?categories=111&purity=110&sorting=date_added&order=desc&page=2",這段url里面代用幾個(gè)參數(shù)分別為,categories,purit,sorting。而這幾個(gè)參數(shù)分別對(duì)應(yīng)界面的這幾個(gè)按鈕

2. 查看網(wǎng)頁(yè)結(jié)構(gòu)

按f12鍵查找到要爬取的圖片目錄

通過(guò)查看代碼發(fā)現(xiàn)該圖片只是一張預(yù)覽圖片,分辨率僅為300*200,明顯不符合要求。
觀察下方a標(biāo)簽

發(fā)現(xiàn)這個(gè)class為preview的標(biāo)簽中存在個(gè)href地址鏈接到該高清圖片的正確地址,點(diǎn)擊該地址跳轉(zhuǎn)


通過(guò)查看代碼發(fā)現(xiàn)這才是我們需要的圖片,找到了我們要的圖片鏈接,在img標(biāo)簽中。

通過(guò)以上觀察我們可以知道,我們的代碼編寫(xiě)思路

  1. 獲取到這一頁(yè)所有圖片的url地址
  2. 通過(guò)解析獲取到詳情頁(yè)網(wǎng)頁(yè)的圖片
  3. 請(qǐng)求到詳情頁(yè)網(wǎng)頁(yè)圖片進(jìn)行下載

3. 開(kāi)始爬取圖片

3.1 初始化

import requests
url = "https://wallhaven.cc/search?categories=011&purity=010&sorting=date_added&order=desc&page=2"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56',
}

class Spider:
	# 初始化數(shù)據(jù)
	def __init__(self, url, header, cookie):
		self.user_url = url
		self.header = header
		self.img_list_url = [] # 存放一頁(yè)的所有圖片地址
		self.num = 0  # 計(jì)數(shù)爬取了多少?gòu)垐D片

3.2 獲取到這一頁(yè)所有圖片的url地址

我們?cè)?code>Spider類(lèi)中定義一個(gè)res方法來(lái)爬取這一頁(yè)的所有url地址,并且利用列表推導(dǎo)式將所有的url地址存放到list_img列表中以便我們后續(xù)使用

# 獲取某一頁(yè)要下載的圖片所有鏈接
def res(self):
	response = requests.get(self.user_url, headers=self.header).text
	soup = BeautifulSoup(response, "html.parser")
	img_href = soup.select(".thumb-listing-page > ul > li  a[href]")
	list_img = [i.get("href") for i in img_href]  # 所有的圖片的href
	print(list_img)
	print("一共", len(list_img), "圖片")
	return list_img

3.3 通過(guò)解析獲取到詳情頁(yè)網(wǎng)頁(yè)的圖片

通過(guò)res方法我們得到了一頁(yè)的所有圖片鏈接,這時(shí)我們獲取詳情頁(yè)的圖片地址并把它存放到img_list_url列表中以便我們后續(xù)開(kāi)啟多進(jìn)程進(jìn)行下載。但是我們這些書(shū)寫(xiě)會(huì)出現(xiàn)拿不到詳細(xì)頁(yè)的圖片地址從而導(dǎo)致下標(biāo)越界從而報(bào)錯(cuò),所以可以?xún)?yōu)化一下代碼

# 獲取詳情頁(yè)圖片地址
def detail_page(self, list_img):
	# 遍歷獲取詳情頁(yè)圖片地址
	for item in list_img:
		detail_page = requests.get(item, headers=self.header, cookies=self.cookie).text
		soup = BeautifulSoup(detail_page, "html.parser")
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "添加成功")
		self.error_img_url(item)
		return self.img_list_url

可以寫(xiě)出這樣

# 獲取詳情頁(yè)圖片地址
def detail_page(self, list_img):
# 遍歷獲取詳情頁(yè)圖片地址
for item in list_img:
	detail_page = requests.get(item, headers=self.header, cookies=self.cookie).text
	soup = BeautifulSoup(detail_page, "html.parser")
	try:  # 訪問(wèn)過(guò)快會(huì)爬取不到詳情頁(yè)圖片地址,則出現(xiàn)一個(gè)空列表從而導(dǎo)致下標(biāo)越界
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "添加成功")
	except IndexError:  # 出現(xiàn)下標(biāo)越界調(diào)用error_img_url方法
		self.error_img_url(item)
		return self.img_list_url

# 處理獲取失敗的圖片地址
def error_img_url(self, url):
	print(url, "沒(méi)有獲取到現(xiàn)在重新獲取")
	# 休眠2秒重新發(fā)送請(qǐng)求
	time.sleep(2)
	detail_page = requests.get(url, headers=self.header, cookies=self.cookie).text
	soup = BeautifulSoup(detail_page, "html.parser")
	try:
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "獲取成功")
	except IndexError:  # 如果還沒(méi)有獲取到圖片地址那么遞歸調(diào)用
		self.error_img_url(url)

3.4 請(qǐng)求到詳情頁(yè)網(wǎng)頁(yè)圖片進(jìn)行下載

通過(guò)前面我們已經(jīng)獲取下載圖片地址,我們發(fā)現(xiàn)地址為"https://w.wallhaven.cc/full/zy/wallhaven-zyg5kw.jpg "完全可以使用split('/')進(jìn)行切片獲取最后一段用來(lái)命名圖片名稱(chēng)

# 圖片下載
def download_images(self, img_url):
	if img_url is not None:
		img_name = img_url.split("/")[-1]  # 圖片名稱(chēng)
		img = requests.get(img_url, headers=self.header).content
		with open(img_path + "/" + img_name, "wb") as fp:
			fp.write(img)
			print(img_name, "download over~")
			self.num += 1

3.5 main方法

這時(shí)候我們編寫(xiě)主函數(shù)就可以下載了

if __name__ == '__main__':
    img_path = "./wall"
    if not os.path.exists(img_path):
        os.mkdir(img_path)
    # 開(kāi)始爬取
    start = time.time()
    spider = Spider(url, headers, cookie)
    list_img = spider.res()

    img_list_url = spider.detail_page(list_img)

    # 開(kāi)啟5個(gè)進(jìn)程下載圖片
    pool = Pool(5)
    pool.map(spider.download_images, img_list_url)

    end = time.time()
    print("下載圖片數(shù)量:", Spider.images_count)
    print(end - start)

4. 完整代碼

import os
import time
from multiprocessing.dummy import Pool
import requests
from bs4 import BeautifulSoup

url = "https://wallhaven.cc/search?categories=011&purity=010&sorting=date_added&order=desc&page=2"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56',
}


class Spider:
    # 初始化數(shù)據(jù)
    def __init__(self, url, header, cookie):
        self.user_url = url
        self.header = header
        self.cookie = cookie
        self.img_list_url = []  # 存放一頁(yè)的所有圖片地址
        self.num = 0  # 計(jì)數(shù)爬取了多少?gòu)垐D片

    # 獲取某一頁(yè)要下載的圖片所有鏈接
    def res(self):
        response = requests.get(self.user_url, headers=self.header).text
        soup = BeautifulSoup(response, "html.parser")
        img_href = soup.select(".thumb-listing-page > ul > li  a[href]")
        list_img = [i.get("href") for i in img_href]  # 所有的圖片的href
        print(list_img)
        print("一共", len(list_img), "圖片")
        return list_img

    # 獲取詳情頁(yè)圖片地址
    def detail_page(self, list_img):
        # 遍歷獲取詳情頁(yè)圖片地址
        for item in list_img:
            detail_page = requests.get(item, headers=self.header).text
            soup = BeautifulSoup(detail_page, "html.parser")
            try:  # 訪問(wèn)過(guò)快會(huì)爬取不到詳情頁(yè)圖片地址,則出現(xiàn)一個(gè)空列表從而導(dǎo)致下標(biāo)越界
                img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
                self.img_list_url.append(img_url)
                print(img_url, "添加成功")
            except IndexError:  # 出現(xiàn)下標(biāo)越界調(diào)用error_img_url方法
                self.error_img_url(item)
        return self.img_list_url

    # 處理獲取失敗的圖片地址
    def error_img_url(self, url):
        print(url, "沒(méi)有獲取到現(xiàn)在重新獲取")
        # 休眠2秒重新發(fā)送請(qǐng)求
        time.sleep(2)
        detail_page = requests.get(url, headers=self.header).text
        soup = BeautifulSoup(detail_page, "html.parser")
        try:
            img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
            self.img_list_url.append(img_url)
            print(img_url, "獲取成功")
        except IndexError:  # 如果還沒(méi)有獲取到圖片地址那么遞歸調(diào)用
            self.error_img_url(url)

    # 圖片下載
    def download_images(self, img_url):
        if img_url is not None:
            img_name = img_url.split("/")[-1]  # 圖片名字
            img = requests.get(img_url, headers=self.header).content
            with open(img_path + "/" + img_name, "wb") as fp:
                fp.write(img)
            print(img_name, "download over~")
            self.num += 1

    def images_count(self):
        print(self.num)


if __name__ == '__main__':
    img_path = "./wall"
    if not os.path.exists(img_path):
        os.mkdir(img_path)
    # 開(kāi)始爬取
    start = time.time()
    spider = Spider(url, headers, cookie)
    list_img = spider.res()

    img_list_url = spider.detail_page(list_img)

    # 開(kāi)啟5個(gè)進(jìn)程下載圖片
    pool = Pool(5)
    pool.map(spider.download_images, img_list_url)

    end = time.time()
    print("下載圖片數(shù)量:", Spider.images_count)
    print(end - start)

5. 添加Cookie

如果有wallhaven用戶(hù)的想爬取用戶(hù)能爬取的圖片需要添加Cookie

# 用戶(hù)cookie
cookie = {
    "_pk_id.1.01b8": "xxxx",
    "_pk_ses.1.01b8": "xxxx",
    "remember_web_59ba36addc2b2ff014c7f58ea4ed": "xxx",
    "XSRF-TOKEN": "xxxx",
    "wallhaven_session": "xxxx"
}

請(qǐng)求的時(shí)候帶上cookie即可


網(wǎng)站標(biāo)題:多線程爬取wallhaven
URL地址:http://weahome.cn/article/dsogscp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部