https://wallhaven.cc/ 上有很多優秀壁紙圖片,網站訪問速度有點慢,還是抓下來看比較方便。
1、安裝python3
2、pip安裝requests、lxml
3、運行代碼
# -*- coding: utf-8 -*- #wallhaven爬取 import os from urllib.parse import urlencode import time from requests import codes import random import requests from lxml import etree #定義創建文件路徑函數,將下載的文件存儲到該路徑 def CreatePath(filepath): if not os.path.exists(filepath): os.makedirs(filepath) #定義獲取url函數,這里是通過urlencode方法把url的各個部分拼接起來的,拼接起來的url #像是這樣的:https://wallhaven.cc/search?q=girls&categories=111&purity=110&sorting=toplist&order=desc def GetUrl(keyword,category): params = { 'q': keyword, 'categories': category, 'purity': '110',#100\010\110 'sorting': 'favorites', #relevance\random\date_added\views\favorites\toplist\toplist-beta 'topRange':'1y', #1y\6M\3M\1w\3d\1d 'order':'desc' } base_url='https://wallhaven.cc/search?' url=base_url + urlencode(params) print(url) return url #獲取查找到的圖片數 def GetPictureNum(url): allpic=" " try: html = requests.get(url) if codes.ok == html.status_code: selector = etree.HTML(html.text) pageInfo = selector.xpath('//header[@class="listing-header"]/h1[1]/text()')#提取出文本 string = str(pageInfo[0])#圖片數是文本中的第一個 numlist = list(filter(str.isdigit,string)) #有些數字是這樣的,11,123,所以需要整理。 for item in numlist: allpic+=item totalPicNum=int(allpic) #把拼接起來的字符串進行整數化 return totalPicNum except requests.ConnectionError: return None #獲取圖片鏈接 def GetLinks(url,number): urls=url+'&page='+str(number) try: html=requests.get(urls) selector=etree.HTML(html.text) PicLink=selector.xpath('//a[@class="preview"]/@href')#這里尋找圖片的鏈接地址,以求得到圖片編號 except Exception as e: print('Error',e.args) return PicLink #下載函數 def Download(filepath,keyword,url,count,headers):#其中count是你要下載的圖片數 #此函數用於圖片下載。其中參數url是形如:https://wallhaven.cc/w/eyyoj8 的網址 #因為wallheaven上只有兩種格式的圖片,分別是png和jpg,所以設置兩種最終地址HtmlJpg和HtmlPng,通過status_code來進行判斷,狀態碼為200時請求成功。 string=url.replace('https://wallhaven.cc/w/','') #python3 replace #print(string) HtmlJpg='https://w.wallhaven.cc/full/'+ string[0:2] +'/wallhaven-' + string +'.jpg' HtmlPng='https://w.wallhaven.cc/full/'+ string[0:2] +'/wallhaven-' + string +'.png' try: pic=requests.get(HtmlJpg,headers=headers) if codes.ok==pic.status_code: pic_path=filepath+'wallhaven-'+string+'.jpg' else: pic=requests.get(HtmlPng,headers=headers) if codes.ok==pic.status_code: pic_path=filepath+'wallhaven-'+string+'.png' else: print("Downloaded error:",string) return with open(pic_path,'wb') as f: f.write(pic.content) f.close() print("Downloaded image:",string) time.sleep(random.uniform(0,3))#這里是讓爬蟲在下載完一張圖片后休息一下,防被偵查到是爬蟲從而引發反爬蟲機制。 except Exception as e: print(repr(e)) #主函數 def main(): headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5)\ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36",#請求頭,這個可以通過查看你自己的瀏覽器得到。 } filepath = ('/wallpaper/Pictures/')#存儲路徑。 keyword=input('請輸入關鍵詞:') category=input('請輸入圖片分類,共有三種,分別為Gneral,Anime,People三種\ ,如果你想要只想選擇Anime,就鍵入010,如果全選就鍵入111,以此類推:') CreatePath(filepath) #創建保存路徑 url=GetUrl(keyword,category) #獲取url PicNum=GetPictureNum(url)#總圖片數 pageNum=int(PicNum/24+1) #求出總頁面數 print("We found:{} images.".format(PicNum)) j=1 Arr = input("請輸入你想要爬的圖片數,不能超過已找到的圖片數:【若要設定其實頁碼用|分割,如:50|10(即從第10頁開始,取50個)】").split('|') Num = int(Arr[0]) pageStart=0 if(len(Arr) == 2): pageStart = int(Arr[1]) for i in range(pageStart,pageNum): PicUrl=GetLinks(url,i+1) for item in PicUrl: #print(item) Download(filepath,keyword,item,j,headers) j+=1 if(j>Num):#如果你下載的圖片夠用了,那就直接退出循環,結束程序。 return if __name__ == '__main__': main()
參考地址:https://www.jianshu.com/p/90f734cb895d