python爬虫爬取必应每日高清壁纸

本文介绍了一款Python爬虫,用于抓取必应每日高清壁纸网站上的所有图片。爬虫利用requests库发送HTTP请求,re库进行正则表达式匹配,以及bs4库解析网页结构。文章详细阐述了网页分析过程,包括URL结构、图片信息定位和最大页数获取,同时提供了代码实现细节。

一、简介

必应是微软推出的搜索引擎,相比于百度具有广告少的显著优点,比较良心。以下为必应的网址:https://cn.bing.com/

经常使用必应应该可以发现,其主页每天都会更新一张图片,博主发现这些图片非常符合博主的审美,希望每天能够下载收藏每张图片。幸运的是已经有人完成了这项工作,具体请看这个网站:必应每日高清壁纸(https://bing.ioliu.cn/)。

这个网站收录了必应每天的主页图片,并且提供直接下载(管理猿太良心了,祝愿少掉一些头发,少写一些bug🤭🤭🤭)。但是博主发现这个网站缺少一个一键全部下载功能,只能一张一张图片手动下载,如果要把所有图片都下载下来,非常麻烦,因此用python写了一个下载网站上所有图片的小爬虫,分享给大家。

二、使用的环境

  • python3.8.1(较新版本都可)
  • requests库(需要使用pip工具下载该库)
  • re库(python自带,不用下载,直接导入就行)
  • bs4库(需要使用pip工具下载该库)

三、网页分析

1、分析网页每一页url形式以及总页数

在主页的最后可以看到有下一页的信息,如下图,
在这里插入图片描述
在这里可以收集到网页的最大页数信息,用以后续生成每一页的url链接。点击下一页,可以看到url变成:
在这里插入图片描述
容易推理出来对于不同页面网页的url形式为:

url = 'https://bing.ioliu.cn/?p={}'.format(page_count)

2、网页重要信息收集

打开必应每日高清壁纸,鼠标悬停在任意一张图片上面可以看到出现以下信息:
在这里插入图片描述
这其中对于我们较为重要的信息是图片介绍信息以及网页下载按钮所对应的url链接,因为我们需要把图片介绍信息作为下载图片的文件名,这样容易预览和区分。

3、在源码中寻找所需信息的位置

打开网页调试工具,打开任意一页,通过调试可以发现,每一张图片的信息主要在body标签class属性为container的div标签中:
在这里插入图片描述
打开div标签可以看到子节点并列存放着class属性为item的div标签,每一个子标签存放的就是每一张图片的信息。如下图:
在这里插入图片描述
这其中description属性的div标签存放的就是关于图片的描述信息,而options属性的div标签存放的就有图片的下载链接。如下图:
在这里插入图片描述
在这里插入图片描述
最后我们还需要知道网页的最大页面数的标签的位置,通过调试发现位于span标签下,如图:
在这里插入图片描述
找到了这些重要信息的位置之后,就可以开始敲代码了!

四、代码实现

代码主要包括五个函数:

  • GetHtmlText(url):根据传入的url链接发送http请求,并返回获取的数据,后面很多函数都要用到,这里为了防止被服务器检测到是爬虫,建议尽量多写一些附加信息,尽量模拟浏览器的浏览操作。
def GetHtmlText(url):
    # 根据传入的url请求网站,并返回得到的数据
    try:
        user_agent = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
        rspon = requests.get(url, headers = user_agent)
        rspon.encoding = rspon.apparent_encoding
        rspon.raise_for_status()
    except:
        print('网页获取失败:', rspon.status_code)
        return None
    return rspon
  • GetMaxPageCount()根据主页信息获得网页的最大页数,利用BeautifulSoup解析网页结构。
def GetMaxPageCount():
    # 获取主页信息,并且获取网站的最大页数
    max_page_count = 0
    url = 'https://bing.ioliu.cn/'
    soup = BeautifulSoup(GetHtmlText(url).text, "html.parser")
    tag_page = soup.find('div', {'class':'page'})
    page_txt = None
    for tag_child in tag_page.children:
        if(tag_child.name == 'span'):
            page_txt = tag_child.string
            match = re.search(r'(?<=1 / )\d*', page_txt)
            max_page_count = int(match.group(0))
    return max_page_count
  • SavePictureInUrl(pic_url,pic_name,pic_path):根据传入的url链接请求并获得图片的数据,然后根据文件名文件路径将图片数据写入到对应的文件中,这里需要注意的是图片属于二进制文件,因此要以二进制文件的方式打开和写入。
def SavePictureInUrl(pic_url,pic_name,pic_path):
    # 根据传入的url链接获取图片的二进制数据,并且根据传入的路径和文件名将文件写入到对应的路径中。
    source = GetHtmlText(pic_url)
    if source == None:
        return
    file_name = '{}.jpg'.format(pic_name)
    file = open(pic_path+file_name, "wb")    #以二进制写的方式打开文件。
    file.write(source.content)
    file.close()
  • GetOnePageJpg(page_count, pic_path):根据当前传入的页码自动生成对应的url链接,然后请求并获得相应的数据,解析结构后获得图片的信息,拼接成文件的名称这里要注意windows规定某些特殊字符不能用作文件名,需要加以剔除,不然会出问题。然后获取图片的下载地址并拼接成完整的url地址,将这些信息传入以上函数就能获得图片。
def GetOnePageJpg(page_count, pic_path):
    # 从返回的网页数据中获取每张图片的相关信息以及图片下载的url,然后调用相关函数下载图片
    url = 'https://bing.ioliu.cn/?p={}'.format(page_count)
    suop = BeautifulSoup(GetHtmlText(url).text, 'html.parser')
    tag_container = suop.find_all('div', {'class':'container'})
    tag_item = tag_container[1]
    url_photo = 'https://bing.ioliu.cn'
    for tag_pic in tag_item.children:
        # 获取图片的标题和日期信息并且拼接成图片名
        tag_title = tag_pic.find('h3')
        text_title = tag_title.string
        a = re.findall(r'[^\*"/:?\\|<>]', text_title, re.S)      #剔除某些不能作为文件名的特殊字符
        text_title = ''.join(a)
        tag_calendar = tag_pic.find('p', {'class':'calendar'})
        tag_em = tag_calendar.find('em')
        text_calendar = tag_em.string
        text_pic_name = text_calendar + '__' + text_title
        # 获取图片的下载url
        tag_download = tag_pic.find('a', {'class':'ctrl download'})
        url_pic = url_photo + tag_download['href']
        #信息保存到图片中
        SavePictureInUrl(url_pic, text_pic_name, pic_path)
        print('.', end='', flush=True)        #输出进度信息
  • GetAllPageJpg(pic_path):传入文件的保存地址,然后获取所有网页的图片,主要是调用前面的函数。
def GetAllPageJpg(pic_path):
    # 爬取所有的图片,并保存在输入的路径参数下
    max_page_count = GetMaxPageCount()
    for page_index in range(1, max_page_count):
        GetOnePageJpg(page_index, pic_path)
        print('\r', '正在获取,已完成:{:.2f} %'.format(page_index/max_page_count*100), end = '', flush=True)      #输出进度信息
  • main():最后编写和调用main函数就能完成。
def main():
    # 程序执行
    pic_path = 'E://bing图片/'   #文件保存路径
    GetAllPageJpg(pic_path)
main()       #执行main函数

五、运行爬虫

windows运行该脚本首先win+R打开运行,然后输入cmd打开控制台,将工作文件夹切换到脚本所在文件夹,然后输入命令:

python bingjpg.py

即可运行该脚本(前提是电脑已经安装好了python环境)。

万万没想到,这个网站居然有反爬机制?!脚本运行一段时间,下载了21.21%出现403错误🤣🤣🤣,仅仅下载了部分图片。
在这里插入图片描述
在这里插入图片描述
此时在浏览器打开网页也被禁止访问,应该是ip被禁了!!!不过目前大多数宽带都是使用DHCP服务生成动态ip,一般2个小时之后ip会自动更换,或者直接重启路由器也可以立即更换ip,更换了ip地址之后又能访问该网站。
在这里插入图片描述
针对这一情况推测网站很有可能是根据下载请求的速度以及数量来判断爬虫,从而封禁ip,后面可以利用前面已经写好的函数从后续页开始爬取,稍微改动代码就行,不用又从头开始。

六、后续改进

后续该爬虫还有两个方面可以改进:

  1. 爬取一次中断之后重新爬取时,之前爬取的图片又要重新爬取,费时费力,后面可以加一个判断,如果当前文件夹中已经存在该图片,就不再爬取,直接跳过。
  2. 适当降低爬取速度,每爬取一张图片之后sleep一段时间,防止被反爬程序检测到。
内容概要:本文研究了基于CNN-BiGRU-Attention混合神经网络模型的风电功率预测方法,旨在提升风力发电功率预测的准确性。该模型融合卷积神经网络(CNN)以提取输入变量中的局部时空特征,结合双向门控循环单元(BiGRU)充分捕捉时间序列前后向的长期依赖关系,并引入注意力机制(Attention)动态加权关键时间步的特征信息,增强模型对重要时刻的敏感度。研究采用多变量输入进行单步预测,综合纳入风速、风向、温度等多种气象因素作为模型输入,全面反映环境变量对风电输出的影响。通过Matlab平台完成模型构建、训练仿真验证,实验结果表明该混合模型在预测精度稳定性方面优于传统单一模型,有效提升了风电功率预测性能。; 适合人群:具备一定机器学习深度学习理论基础,熟悉Matlab编程环境,从事新能源发电预测、电力系统调度、智能算法应用等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于风电场实际运行中的短期功率预测,提高电网调度的安全性可再生能源消纳效率;②为深度学习模型在复杂时序预测任务中的设计优化提供实践范例,推动AI技术在能源系统智能化中的深度融合;③支持学术研究复现、课程项目设计教学演示,帮助深入理解CNN、BiGRUAttention机制的协同建模范式实现细节。; 阅读建议:建议结合提供的Matlab代码进行动手实践,重点关注数据预处理流程、模型网络结构设计、超参数调优及训练收敛过程,鼓励尝试替换输入变量组合、调整网络层数或优化注意力结构,以进一步探究模型性能边界并提升预测鲁棒性。
内容概要:本文研究了基于Benders分解算法输电网-配电网运营商(TSO-DSO)协调机制的双层优化模型,旨在有效应对新能源出力波动、负荷不确定性等对现代电力系统运行带来的挑战。模型上层由输电网运营商(TSO)负责全局资源优化主网稳定性调控,下层由多个配电网运营商(DSO)实现本地分布式能源的灵活调度,通过Benders分解实现上下层之间的迭代协调信息交互,从而在保障系统安全的前提下提升整体运行的经济性鲁棒性。研究提供了完整的Matlab代码实现,涵盖数学建模、算法求解、收敛性分析及仿真结果可视化等环节,有助于深入理解双层优化架构在输配电网协同调度中的具体应用技术细节。; 适合人群:具备电力系统分析、优化理论基础及一定Matlab编程能力的研究生、科研人员,以及从事电网调度、能源系统规划等相关领域的工程技术人员。; 使用场景及目标:①掌握Benders分解在电力系统双层优化问题中的建模求解流程;②理解TSO-DSO协同机制下输配电网交互建模的核心思想实现方法;③复现并拓展高水平学术论文中的优化模型,服务于科研项目攻关或实际工程仿真需求。; 阅读建议:建议结合凸优化理论、电力系统经济调度Benders分解原理进行系统学习,优先运行并调试所提供的Matlab代码,调整关键参数以观察算法收敛行为模型性能变化,从而深化对协调机制优化机理的理解。
内容概要:本文档是一份关于经济学期刊论文复现的研究资料,聚焦核心议题“数字化转型能否促进企业的高质量发展”。文档构建了一个完整的量化分析框架,基于中国上市公司数据,实证探讨数字化转型对企业全要素生产率(TFP)及高质量发展的实际影响。内容涵盖数字化转型指标的构建、企业高质量发展评价体系的设计、计量经济模型的选择应用(如固定效应模型、GMM方法),并提供Matlab代码实现全过程,包括数据处理、模型估计稳健性检验。研究还系统梳理了OL、FE、LP、OP、GMM等多种全要素生产率的测算方法,为读者复现高水平经济学论文、深入理解数字经济时代的企业发展路径政策含义提供了详尽的技术支持理论指导。; 适合人群:具备扎实的经济学理论基础和较强的定量分析能力,熟悉Matlab或Python编程语言,正在从事经济管理、产业经济或数字经济等领域研究的研究生、高校教师及科研机构研究人员。; 使用场景及目标:①完整复现经济学顶刊论文的实证研究流程,掌握规范的学术研究范式;②学习并应用数字化转型企业绩效间的因果识别策略,提升独立开展实证研究的能力;③为撰写学位论文、申报科研课题或编制政策咨询报告中涉及数字经济效应的章节提供直接的方法论参考和代码支持; 阅读建议:建议读者务必结合文档提供的数据Matlab代码进行同步实操,重点钻研变量定义、模型设定、内生性处理和稳健性检验等关键环节,通过反复调试验证,深刻领会高水平实证研究的严谨逻辑技术细节,从而全面提升自身的科研素养论文写作水平。
内容概要:本文围绕“绿电直连型电氢氨园区优化运行”开展创新性未发表研究,提出一种集成绿色电力直接供给、电解水制氢合成氨工艺的多能耦合系统优化模型,旨在实现园区能源系统的低碳化、高效化经济化运行。研究采用MatlabPython编程语言,结合实际气象负荷数据,构建涵盖电-氢-氨能量转换、存储利用全过程的能量流、物质流及经济性协同优化框架,重点解决可再生能源出力波动导致的供需失衡问题,并通过优化电解槽、储氢罐、合成氨反应器等关键设备的运行策略容量配置,提升系统对风光能源的就地消纳能力。文中配套提供完整的仿真代码、原始数据及Word格式论文,支持结果复现模型拓展,具有较高的科研参考价值工程应用潜力。; 适合人群:具备电力系统、能源工程、优化建模或新能源技术背景,从事综合能源系统、氢能利用、碳中和园区等相关领域研究的研发人员及硕士、博士研究生。; 使用场景及目标:①研究绿电直供模式下电-氢-氨多能系统协同运行机制优化调度策略;②探索高比例可再生能源就地转化为高附加值化工产品的技术路径;③为工业园区实现深度脱碳能源自洽提供决策支持;④作为学术论文撰写、课题申报或科研复现的高质量参考资料。; 阅读建议:建议结合MatlabPython代码逐模块解析模型实现过程,重点关注目标函数构建、约束条件设定(如设备动态特性、能量平衡、安全边界)以及多场景仿真对比分析,宜在调试过程中调整权重系数参数设置,深入理解系统灵敏度优化机理,并尝试引入更多不确定性因素进行鲁棒性扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值