使用python批量爬取wallhaven.cc壁紙站壁紙

偶然發現https://wallhaven.cc/這個壁紙站的壁紙還不錯,尤其是更新比較頻繁,用python寫個腳本爬取

點latest,按照更新先後排序,獲得新地址,發現地址是分頁展示的,每一頁24張

 

 

 本案例使用xpath爬蟲爬取數據,先分析網頁,使用瀏覽器查看元素工具,快速定位到圖片元素所在位置,且存在規律性

 

 首先爬取一級頁面獲取圖片頁面地址(點了上圖箭頭的地址會打開圖片詳細頁,並非圖片真實地址),xpath提取數據的代碼如下

html = requests.get(url=url1, headers=headers, timeout=5.0).text
data = etree.HTML(html)
li_list = data.xpath('.//div[@id="thumbs"]//@href')

執行後爬取出一連串的地址信息

 

 對裏面包含“latest”的地址進行剔除,這個地址非圖片地址,然後再循環請求圖片地址,獲取真實圖片地址

        for li in li_list:
            if 'latest' in li:
                continue
            else:
                html_li = requests.get(url=li, headers=headers, timeout=5.0).text
                data = etree.HTML(html_li)
                li_add = data.xpath('//*[@id="wallpaper"]//@src')
                li_add = li_add[0]
                print(li_add)

執行後輸出真實圖片地址

 

 把這些地址寫到一個txt文本內,然後通過迅雷去下載,效率會高一些,當然也可以爬取後執行使用python下載,單線程下蠻久的。先上保存到txt內的全部代碼

# -*- codeing = utf-8 -*-

import requests
from lxml import etree
import time
import random
import time

def getBZ():

    url='https://wallhaven.cc/latest?page={}'

    # 翻頁10頁
    for page in range(1, 10):

        headers = {
            # 'referer': 'https://wallhaven.cc/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
        }
        print(time.strftime("%H:%M:%S"))

        print("第{}頁".format(page))

        url1 = url.format(page)
        print(url1)
        # 一級頁面請求
        html = requests.get(url=url1, headers=headers).text
        data = etree.HTML(html)
        li_list = data.xpath('.//div[@id="thumbs"]//@href')
        for li in li_list:
            if 'latest' in li or 'top'in li:
                continue
            else:
                print(li)
                html_li = requests.get(url=li, headers=headers)
                print(html_li.status_code)
                if html_li.status_code == 404 or html_li.status_code == 429:#判斷,如果響應失敗跳過這次數據抓取
                    continue
                else:
                    data = etree.HTML(html_li.text)
                    li_add = data.xpath('//*[@id="wallpaper"]//@src')
                    li_add = li_add[0]
                    with open('1538.txt', 'a',encoding='utf-8') as w:
                        w.write(li_add+'\n')
                        w.close()
                    b = random.randint(1,2)#隨機從1到2內取一個整數值
                    print("等待"+str(b)+"")
                    time.sleep(b)#把隨機取出的整數值傳到等待函數中
getBZ()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章