吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2451|回复: 23
收起左侧

[Python 原创] 爬取wallhaven壁纸网站图片

[复制链接]
18691616928 发表于 2023-8-20 23:14
1.第一次发帖如果违规,麻烦管理告知以便改之2.以下代码仅供学习交流,主要功能wallhaven壁纸网站图片3.程序运行后会在当前目录下生成bizhi的文件夹存储爬取到的图片4.图片较大,建议爬取页数选取小一点5.需要第三方库​        requests​        bs44.如遇到什么问题和报错请在评论区详细列出
[Python] 纯文本查看 复制代码
import requests,os
from bs4 import BeautifulSoup
ab = 1
url = 'https://wallhaven.cc/search'
# 如果不存在bizhi文件夹,创建壁纸文件夹
if  not os.path.exists('bizhi'):
    os.mkdir('bizhi')
keyword = input('请输入你要爬取的壁纸关键词:')
start_page = int(input("起始页码:"))
end_page = int(int(input("结束页码:"))+1)

for i in range(start_page, end_page):
    data = {
        'q': keyword,
        'sorting': 'random',
        'ref': 'fp',
        'seed': 'pDRjMC',
        'page': i,
    }
    # 请求搜索链接
    resp = requests.get(url=url,params=data)
    # 解析搜索页面
    page = BeautifulSoup(resp.text,'html.parser')
    # 查找图片链接
    urls = page.find_all("a",attrs={'class':'preview'})
    for n_url in urls:
        href = n_url.get('href')
        # 请求图片链接
        resp1 = requests.get(url=href)
        # 解析图片页面
        page1 = BeautifulSoup(resp1.text,'html.parser')
        img = page1.find('img',attrs={"id":"wallpaper"})
        # 查找图片下载链接
        img_url = img.get('src')
        # 下载图片#
        resp2 = requests.get(url=img_url).content
        # 保存图片
        with open(f'./bizhi/{ab}.jpg','wb') as f:
                f.write(resp2)
        ab += 1

print('爬取完毕')

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
kol + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

龍魂小白 发表于 2023-8-24 01:06
建议加User-Agent给他一个最起码得尊重
barnett2016 发表于 2023-9-7 16:30
本帖最后由 barnett2016 于 2023-9-7 16:31 编辑

修改了一下
增加了下载进度提示。不改文件名。避免重复下载。
[Python] 纯文本查看 复制代码
import requests
import os
from bs4 import BeautifulSoup

url = 'https://wallhaven.cc/search'

# 如果不存在bizhi文件夹,创建壁纸文件夹
if not os.path.exists('bizhi'):
    os.mkdir('bizhi')

keyword = input('请输入你要爬取的壁纸关键词:')
start_page = int(input("起始页码:"))
end_page = int(int(input("结束页码:")) + 1)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/58.0.3029.110 Safari/537.3'
}

# 检查文件是否已下载
def check_file_downloaded(filename):
    if not os.path.exists('log.txt'):
        return False
    with open('log.txt', 'r') as log_file:
        downloaded_files = log_file.read().splitlines()
        if filename in downloaded_files:
            return True
        else:
            return False

# 将已下载的文件名写入log.txt
def write_to_log(filename):
    with open('log.txt', 'a') as log_file:
        log_file.write(filename+'\n')

for i in range(start_page, end_page):
    data = {
        'q': keyword,
        'sorting': 'random',
        'ref': 'fp',
        'seed': 'pDRjMC',
        'page': i,
    }
    # 请求搜索链接
    resp = requests.get(url=url, params=data, headers=headers)
    # 解析搜索页面
    page = BeautifulSoup(resp.text, 'html.parser')
    # 查找图片链接
    urls = page.find_all("a", attrs={'class': 'preview'})
    
    for n_url in urls:
        href = n_url.get('href')
        # 请求图片链接
        resp1 = requests.get(url=href, headers=headers)
        # 解析图片页面
        page1 = BeautifulSoup(resp1.text, 'html.parser')
        img = page1.find('img', attrs={"id": "wallpaper"})
        # 查找图片下载链接
        img_url = img.get('src')
        # 获取文件名
        file_name = img_url.split('/')[-1]
        
        if check_file_downloaded(file_name):
            print(f'文件 {file_name} 已经下载过,跳过下载')
            continue
        
        # 下载文件
        resp2 = requests.get(url=img_url, headers=headers, stream=True)
        # 获取文件大小
        file_size = int(resp2.headers.get('Content-Length', 0))
        # 下载进度和速度的初始值
        download_progress = 0
        download_speed = 0
        
        # 下载文件
        with open(f'./bizhi/{file_name}', 'wb') as f:
            for chunk in resp2.iter_content(chunk_size=1024):
                if chunk:
                    # 写入文件
                    f.write(chunk)
                    # 更新下载进度
                    download_progress += len(chunk)
                    # 更新下载速度
                    download_speed = len(chunk)
                    print(f'文件名: {file_name},下载速度: {download_speed} bytes/s,下载进度: {download_progress}/{file_size} bytes', end='\r')
        
        # 将文件名写入log.txt
        write_to_log(file_name)
        
        print()

print('爬取完毕')
2023-09-07-162943.jpg
逐雅斋 发表于 2023-8-20 23:18
手心听雨轩 发表于 2023-8-20 23:38
第10行代码多写了个int
 楼主| 18691616928 发表于 2023-8-20 23:44
手心听雨轩 发表于 2023-8-20 23:38
第10行代码多写了个int

感谢大佬指导!
wqf02 发表于 2023-8-21 07:20
学习了,感谢大佬
yyds6 发表于 2023-8-21 07:38
学习了,感谢大佬分享!
yu520 发表于 2023-8-21 08:34
这个怎么定义我爬取的图片
jfaboy 发表于 2023-8-21 08:36
代码很简洁
zhufangqing 发表于 2023-8-21 08:56
这个可以有
roy325 发表于 2023-8-21 09:30
每个都认识,放一块不知,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 17:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表