最近整理自己的項目時,發現之前自己寫的爬取wallhaven網站頓時有來的興趣決定再寫一遍來回顧自己以前學的知識
網站地址:"https://wallhaven.cc/"
10年積累的網站設計、成都做網站經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有愛民免費網站建設讓你可以放心的選擇與我們合作。
從url地址我們發現為"https://wallhaven.cc/search?categories=111&purity=110&sorting=date_added&order=desc&page=2",這段url里面代用幾個參數分別為,categories,purit,sorting。而這幾個參數分別對應界面的這幾個按鈕
按f12鍵查找到要爬取的圖片目錄
通過查看代碼發現該圖片只是一張預覽圖片,分辨率僅為300*200,明顯不符合要求。
觀察下方a標簽
發現這個class為preview的標簽中存在個href地址鏈接到該高清圖片的正確地址,點擊該地址跳轉
通過查看代碼發現這才是我們需要的圖片,找到了我們要的圖片鏈接,在img標簽中。
通過以上觀察我們可以知道,我們的代碼編寫思路
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:
# 初始化數據
def __init__(self, url, header, cookie):
self.user_url = url
self.header = header
self.img_list_url = [] # 存放一頁的所有圖片地址
self.num = 0 # 計數爬取了多少張圖片
我們在Spider
類中定義一個res
方法來爬取這一頁的所有url地址,并且利用列表推導式將所有的url地址存放到list_img
列表中以便我們后續使用
# 獲取某一頁要下載的圖片所有鏈接
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
通過res
方法我們得到了一頁的所有圖片鏈接,這時我們獲取詳情頁的圖片地址并把它存放到img_list_url
列表中以便我們后續開啟多進程進行下載。但是我們這些書寫會出現拿不到詳細頁的圖片地址從而導致下標越界從而報錯,所以可以優化一下代碼
# 獲取詳情頁圖片地址
def detail_page(self, list_img):
# 遍歷獲取詳情頁圖片地址
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
可以寫出這樣
# 獲取詳情頁圖片地址
def detail_page(self, list_img):
# 遍歷獲取詳情頁圖片地址
for item in list_img:
detail_page = requests.get(item, 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: # 出現下標越界調用error_img_url方法
self.error_img_url(item)
return self.img_list_url
# 處理獲取失敗的圖片地址
def error_img_url(self, url):
print(url, "沒有獲取到現在重新獲取")
# 休眠2秒重新發送請求
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: # 如果還沒有獲取到圖片地址那么遞歸調用
self.error_img_url(url)
通過前面我們已經獲取下載圖片地址,我們發現地址為"https://w.wallhaven.cc/full/zy/wallhaven-zyg5kw.jpg "
完全可以使用split('/')
進行切片獲取最后一段用來命名圖片名稱
# 圖片下載
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
這時候我們編寫主函數就可以下載了
if __name__ == '__main__':
img_path = "./wall"
if not os.path.exists(img_path):
os.mkdir(img_path)
# 開始爬取
start = time.time()
spider = Spider(url, headers, cookie)
list_img = spider.res()
img_list_url = spider.detail_page(list_img)
# 開啟5個進程下載圖片
pool = Pool(5)
pool.map(spider.download_images, img_list_url)
end = time.time()
print("下載圖片數量:", Spider.images_count)
print(end - start)
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:
# 初始化數據
def __init__(self, url, header, cookie):
self.user_url = url
self.header = header
self.cookie = cookie
self.img_list_url = [] # 存放一頁的所有圖片地址
self.num = 0 # 計數爬取了多少張圖片
# 獲取某一頁要下載的圖片所有鏈接
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
# 獲取詳情頁圖片地址
def detail_page(self, list_img):
# 遍歷獲取詳情頁圖片地址
for item in list_img:
detail_page = requests.get(item, 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: # 出現下標越界調用error_img_url方法
self.error_img_url(item)
return self.img_list_url
# 處理獲取失敗的圖片地址
def error_img_url(self, url):
print(url, "沒有獲取到現在重新獲取")
# 休眠2秒重新發送請求
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: # 如果還沒有獲取到圖片地址那么遞歸調用
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)
# 開始爬取
start = time.time()
spider = Spider(url, headers, cookie)
list_img = spider.res()
img_list_url = spider.detail_page(list_img)
# 開啟5個進程下載圖片
pool = Pool(5)
pool.map(spider.download_images, img_list_url)
end = time.time()
print("下載圖片數量:", Spider.images_count)
print(end - start)
如果有wallhaven用戶的想爬取用戶能爬取的圖片需要添加Cookie
# 用戶cookie
cookie = {
"_pk_id.1.01b8": "xxxx",
"_pk_ses.1.01b8": "xxxx",
"remember_web_59ba36addc2b2ff014c7f58ea4ed": "xxx",
"XSRF-TOKEN": "xxxx",
"wallhaven_session": "xxxx"
}
請求的時候帶上cookie
即可
當前文章:多線程爬取wallhaven
當前鏈接:http://m.kartarina.com/article28/dsogscp.html
成都網站建設公司_創新互聯,為您提供ChatGPT、全網營銷推廣、微信公眾號、微信小程序、手機網站建設、商城網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯