Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >爬虫简单实践之 wallhaven

爬虫简单实践之 wallhaven

作者头像
EmoryHuang
发布于 2022-10-31 07:43:13
发布于 2022-10-31 07:43:13
63800
代码可运行
举报
文章被收录于专栏:EmoryHuang's BlogEmoryHuang's Blog
运行总次数:0
代码可运行

爬虫简单实践之 wallhaven

前言

闲来无事,简单写了一个爬虫,功能也很简单,就是爬取 wallhaven 上的图片。

阅读之前,如果你对爬虫感到陌生,你也可以点击 这里 在我的另一篇文章中快速、了解掌握爬虫。

爬虫思路

根据 url 的规律指定爬取页面

简单观察 url 便可以发现,规律很简单,只需要指定页面即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://wallhaven.cc/toplist?page=

解析 html 获得当前页面所有图片 url

接下来我们观察 html 结构

很显然,我们需要的链接在一个 a 标签中,且 class=preview,那么,我们便可以通过 find_all('a', class_='preview') 命令找到所有的 url。

注意上面的另一个 url 是小图,如果你不关心图片尺寸,那么可以直接使用它。

进入图片之后,再次解析 html 获得原始图片的 url

得到图片的 url 之后,我们再次 get ,进入图片页面,再次解析 html,观察结构

同样的,我们发现原始图片的链接在一个 img 标签中,且 id=wallpaper,链接在 src 之中,用类似的方法使用 BeautifulSoup 进行解析,这样,我们就得到了图片的 url。

另外,我们可以用 data-wallpaper-id 作为标识符,或者给图片命令。

get 原始图片的 url 并保存到本地

得到了原始图片的 url 后,我们便可以再次 get 得到图片数据,然后写入文件即可,类似这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = requests.get(url, headers=headers)
with open(img_name, 'wb') as f:
    f.write(data.content)

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
Descroption: wallhaven 爬虫
Author: EmoryHuang
Date: 2021-08-25 11:10:33
Method:
1. 根据 url 的规律指定爬取页面
2. 解析 html 获得当前页面所有图片 url
3. 进入图片之后,再次解析 html 获得原始图片的 url
4. get 原始图片的 url 并保存到本地
'''

import os
import sys
import time
import requests
from typing import List
from bs4 import BeautifulSoup


# 获得当前页面所有图片 url
def get_page_url(page: str) -> List[str]:
    '''
    :description: 获得当前页面所有图片 url
    :param {str} page 指定页号
    :return {List[str]} 返回当前页面的图片 url 列表
    '''
    headers = {
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Connection': 'keep-alive'
    }
    url = 'https://wallhaven.cc/toplist?page=' + str(page)
    r = requests.get(url, headers=headers, timeout=5)
    soup = BeautifulSoup(r.text, 'lxml')
    page_url = []
    for link in soup.find_all('a', class_='preview'):
        page_url.append(link.get('href'))
    return page_url


# 图片下载到本地
def download(path: str, start: int = 1, cnt: int = 5) -> None:
    '''
    :description: 图片下载到本地
    :param {str} path 文件存储路径
    :param {int} start 起始页号,默认为1
    :param {int} cnt 爬取页数,默认为5
    :return {*}
    '''
    print('开始爬取 wallhaven/toplist 图片第' + str(start) + '-' + str(start + cnt - 1) + '页')
    # 建立会话
    session = requests.Session()
    session.encoding = 'utf-8'
    headers = {
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Connection': 'keep-alive'
    }

    for page in range(start, start + cnt):
        print('开始下载第' + str(page) + '页图片')
        # 获得当前页上所有图片的 url
        page_url = get_page_url(page)

        for i, pic_url in enumerate(page_url, 1):
            # 检查文件是否存在,避免重复下载
            if os.path.exists(path + pic_url.split('/')[-1] + '.png'):
                print('第' + str(page) + '页, 第' + str(i) + '张图片已存在')
                continue

            try:
                r = session.get(pic_url, headers=headers, timeout=5)
                soup = BeautifulSoup(r.text, 'lxml')
            except:
                print('第' + str(page) + '页, 第' + str(i) + '张图片请求失败')
                continue

            # 解析得到图片原路径以及图片id
            img_tag = soup.find('img', id='wallpaper')
            img_id = img_tag.get('data-wallpaper-id')
            img_raw_url = img_tag.get('src')
            # 存储图片名
            img_name = path + img_id + '.png'

            try:
                data = session.get(img_raw_url, headers=headers, timeout=5)
                with open(img_name, 'wb') as f:
                    f.write(data.content)
                    f.flush()
                print('第' + str(page) + '页, 第' + str(i) + '张图片下载成功')
            except:
                print('第' + str(page) + '页, 第' + str(i) + '张图片下载失败')
            else:
                time.sleep(1)

        print('第' + str(page) + '页图片下载完成')
    print('第' + str(start) + '-' + str(start + cnt - 1) + '页图片下载完成')


if __name__ == '__main__':
    cur_dir = os.path.dirname(sys.argv[0])
    databse_dir = cur_dir + '\\wallhaven_download\\'
    if not os.path.exists(databse_dir):
        os.makedirs(databse_dir)
    download(databse_dir)

结语

对于其他的图片网站,我们也可以采取类似的方法下载图片,当然也可能遇到各种各样的问题,比如图片大小,网站验证等问题,这时候就要具体情况具体分析了吧。

练习之作,如有问题请指出。

相关文章

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
妹子图爬虫
* 网站名称:obaby@mars * 网址:https://h4ck.org.cn/ * 本文标题: 《妹子图爬虫》 * 本文链接:https://h4ck.org.cn/2021/05/%e5%a6%b9%e5%ad%90%e5%9b%be%e7%88%ac%e8%99%ab/ * 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。
obaby
2023/02/22
4970
使用Python爬虫爬取妹子图图片
        最近在学习Python的爬虫部分。看到有网友在分享使用爬虫爬取各种网站的图片的代码,也想自己写个玩玩。今天花时间分析了一下妹子图网站的结构和HTML代码,使用urllib2和BeautifulSoup写出了一个自动下载妹子图网站图片的脚本。
py3study
2020/01/06
1.8K0
[Python 爬虫]煎蛋网 OOXX 妹子图爬虫(2)——多线程+多进程下载图片
上一篇文章全面解析了煎蛋网的妹子图的图片链接解密的方式,已经可以通过 Python 爬虫代码批量获取每个页面中的图片地址。但是上一篇文章中并没有写图片下载的函数,这一篇文章就来使用 Python 的多线程和多进程来批量下载图片。
Hopetree
2022/09/26
7630
[Python 爬虫]煎蛋网 OOXX 妹子图爬虫(2)——多线程+多进程下载图片
python爬取4k小姐姐图片 人生苦短 我用python
今天打开电脑看见自己用了好久的壁纸是时候换一个了,但苦于无良心的壁纸网站,然后我打开了知乎,搜素壁纸推荐,让我发现了这个宝藏壁纸网站wallhaven
小王不头秃
2024/06/19
1720
python爬取4k小姐姐图片 人生苦短 我用python
Python爬虫之女神网图片(三)
作为一个爬虫新手,分析网站思路的学习是我之前学习过程中花费时间精力最大的部分。这次要爬取的网站,来自于百度搜索,宅男女神的第一个结果网站。首先打开F12,观察界面中各个图集的入口信息,发现href标签中带有信息/g/24699/,而后面这个五位数是决定图集不同的主要因素。而且,越是最新的图片,数字越大。网站是通过时间差异来给图集编号,那么只要我遍历所有编号,就能获得所有图片集地址信息了。通过手动测试发现,按顺序编号,不一定存在图集,所有需要一个函数来筛选出有效的详情图片集网址。
全栈程序员站长
2022/06/27
1.8K0
Python爬虫之女神网图片(三)
Python 爬虫新手教程:抓取中国顶级编程网站上的优质文章
首先浏览器输入 https://www.oschina.net/ 进入开源中国官网,点击顶部导航栏的 “博客” 选项进入博客列表页面,之后点击左侧 “服务端开发与管理” 选项,我们要爬取的是服务端相关的文章
一墨编程学习
2019/08/06
6920
Python 爬虫新手教程:抓取中国顶级编程网站上的优质文章
爬虫的结构是什么样的呢?
在软件工程中,有着这么几个字“高内聚低耦合”,意思就是说:大模块分割成一个个小模块实现,每一个模块之间的独立性较高,修改某个模块,对其他模块或整个项目影响较小。
用户6825444
2019/12/18
9220
元气壁纸壁纸下载爬虫
网址:元气壁纸 - 电脑壁纸,手机壁纸,桌面壁纸,高级质感壁纸大全 (cheetahfun.com)
Andromeda
2022/10/27
1.5K0
元气壁纸壁纸下载爬虫
Python爬虫学习 煎蛋网全站妹子图爬虫
通过上一篇文章的爬取过程,我们基本上理解了抓取一个网站的大致流程。因为一个网站虽然有很多页,但是大部分网站每一页的HTML标签内容都是相同的。我们只要获取到一页的内容,就可以获得所有页的内容了。那么开始之前,我们来分析一下煎蛋网妹子图页面的URL。
python学习教程
2020/06/09
1.5K0
python用BeautifulSoup库简单爬虫入门+案例(爬取妹子图)
(adsbygoogle = window.adsbygoogle || []).push({});
双面人
2019/04/10
1.5K0
Python爬虫 - 抓取divnil动漫妹子图
这链接还是比较好获取的,直接 F12 审核元素,或者右键查看代码,手机上chrome和firefox在url前面加上 "view-source"
sergiojune
2018/12/27
7200
Python爬虫 - 抓取divnil动漫妹子图
python多线程爬虫-下载wallhaven超清壁纸
我们可以看到这个网站总共分为六个大的模块:Latest,Hot,Toplist,Random,Upload,Forums 我爬取的主要是latest,hot,toplist,random这四个模块的图片. 这四个模块对应的url网址分别为:
用户6297767
2023/11/21
4350
python多线程爬虫-下载wallhaven超清壁纸
使用python多进程爬取高清美图
当我们打开一个网页,在上面发现一些了有用的信息之后,于是通过人工的方式从网页上一顿操作将信息记录起来,而通过爬虫,则可以利用一些设定好的规则以及方法来自动的从该网页上获取信息,总而言之就是解放双手,释放天性。
dogfei
2021/08/08
1K0
使用python多进程爬取高清美图
First python spider
刚刚开始学习 python 写了一个小爬虫来爬取 豆瓣失败了,于是转而爬取 wallhaven 它拥有大量的超清壁纸资源 并且只要注册就可以开启 NSFW 选项 浏览,下载皆无限制.
BORBER
2019/08/06
7300
First python spider
「玩转Python」打造十万博文爬虫篇
使用到的第三方类库:BeautifulSoup、html2text、PooledDB
小柒2012
2019/12/09
3310
Python爬虫架构5模板 | 你真的会写爬虫吗?
咱们直接进入今天的主题---你真的会写爬虫吗?为啥标题是这样,因为我们日常写小爬虫都是一个py文件加上几个请求,但是如果你去写一个正式的项目时,你必须考虑到很多种情况,所以我们需要把这些功能全部模块化,这样也使我们的爬虫更加的健全。
Python数据科学
2019/05/10
2K0
Python爬虫架构5模板 | 你真的会写爬虫吗?
python爬虫超清桌面壁纸
先说思路,把获取到的18种类型的缩略图遍历,先遍历类型再遍历类型里面的缩略图。获取图片详情里面的图片的src地址即可,然后调用写好的图片下载方法就可以把图片下载到本地了
用户6297767
2023/11/21
3070
python爬虫超清桌面壁纸
50 行 Python 代码抓取 divnil 动漫妹子图!
这链接还是比较好获取的,直接 F12 审核元素,或者右键查看代码,手机上chrome和firefox在url前面加上 "view-source"
昱良
2019/05/13
6780
50 行 Python 代码抓取 divnil 动漫妹子图!
奇怪的知识增加了
可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。
全栈程序员站长
2022/09/13
2990
奇怪的知识增加了
爬取wallhaven壁纸网站图片
^夜猫^
2023/08/22
4231
相关推荐
妹子图爬虫
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验