必应壁纸爬虫(基于bs4/re/lxml)

news/2024/10/30 15:30:56/

文章目录

  • 1.查看网站结构
    • 1.1 获取网站response信息
    • 1.2 观察规律
  • 2.提取目标图片链接
    • 2.1 图片url提取思路
    • 2.2 基于正则表达式提取
    • 2.3 基于xpath提取
    • 2.4 使用beautifulshop提取
  • 3.写入文件
  • 4.形成爬虫

可能需要导入的包

import time
import os
import re
import requests
from fake_useragent import UserAgent
from lxml import html as lxml_html
from urllib import parse
from bs4 import BeautifulSoup

1.查看网站结构



1.1 获取网站response信息

必应壁纸的网站应该是把用f12打开工作台,右键这类的操作通过js禁止了,不过依旧可以通过各种方式来查看网页结构。

img

img

img

现在确定了,能够获取图片信息的请求地址为https://bing.ioliu.cn/?p=1,最好把html下来,以此方便之后解析的测试。

# 得到response中的html文件代码
def get_html():ua = UserAgent()url = f"https://bing.ioliu.cn/?p=1"# 请求头headers = {"User-Agent": ua.random,"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Cache-Control": "max-age=0","Host": "bing.ioliu.cn",}response = requests.get(url=url, headers=headers)rs_content = response.content.decode('utf8')print(rs_content)with open('./bing_wallpaper.html', 'w+', encoding='utf-8') as fp:fp.write(rs_content)print('ok')get_html()



1.2 观察规律

img

图片地址的示例如下:

http://h1.ioliu.cn/bing/AlgonquinGrouse_ZH-CN2514966091_1920x1080.jpg

http://h1.ioliu.cn/bing/LastJedi_ZH-CN8789881870_1920x1080.jpg

img

"""
请求地址
https://bing.ioliu.cn/
https://bing.ioliu.cn/?p=1"
https://bing.ioliu.cn/?p=2"
https://bing.ioliu.cn/?p=3"壁纸详情地址
https://bing.ioliu.cn/photo/LastJedi_ZH-CN8789881870?force=home_1图片地址
http://h1.ioliu.cn/bing/AlgonquinGrouse_ZH-CN2514966091_1920x1080.jpg
http://h1.ioliu.cn/bing/LastJedi_ZH-CN8789881870_1920x1080.jpg"""

结论: 每个图片都有一个id(img_id),例如,LastJedi_ZH-CN8789881870,然后其壁纸1920x1080的拼接规律为:

http://h1.ioliu.cn/bing/LastJedi_ZH-CN8789881870_1920x1080.jpghttp://h1.ioliu.cn/bing/<img_id>_1920x1080.jpg

由于图片地址没有固定规律,应该通过有规律的请求地址获取html代码,再清洗提炼出图片地址



2.提取目标图片链接



2.1 图片url提取思路

经过观察,目前至少有两种方式来提取到:

① 先获取图片的img_id,然后拼接

② 直接在html中提取完整的图片url

img

img



2.2 基于正则表达式提取

def extract01(html):'''方式: 用xpath提取壁纸链接:param html: str  需要清洗的html:return: dict {图片名:图片url}'''img_url_list = re.findall('pic=(.*?)\\.jpg', html)img_title_list = re.findall('<div class="description"><h3>(.*?)</h3>', html)treated_img_url_list = []for img_url in img_url_list:treated_img_url_list.append(img_url + '.jpg')treated_img_title_list = []for img_title in img_title_list:treated_img_title_list.append(img_title.split(' ')[0])img_dict = dict(zip(treated_img_title_list, treated_img_url_list))print(img_dict)return img_dict

结果:

{'极北朱顶雀的巢,芬兰拉普兰': 'http://h1.ioliu.cn/bing/ArcticRedpoll_ZH-CN7968973967_1920x1080.jpg','普尔曼附近的帕卢斯一辆拖拉机在耕作时扬起尘土,华盛顿州': 'http://h1.ioliu.cn/bing/PalouseSpring_ZH-CN6803103328_1920x1080.jpg','索尔茲伯里大教堂与放牧的羊群,英格兰': 'http://h1.ioliu.cn/bing/SalisburyCathedral_ZH-CN6366350896_1920x1080.jpg','一只南美貘幼崽小跑着穿过草地': 'http://h1.ioliu.cn/bing/SouthAmericanTapir_ZH-CN6151058361_1920x1080.jpg','红宝石海滩的日落,华盛顿州奥林匹克国家公园': 'http://h1.ioliu.cn/bing/RubySunset_ZH-CN5544596519_1920x1080.jpg','福克兰群岛上的南跳岩企鹅': 'http://h1.ioliu.cn/bing/FalklandRockhoppers_ZH-CN5370686595_1920x1080.jpg','由哈勃太空望远镜拍摄的大麦哲伦星云': 'http://h1.ioliu.cn/bing/MegellanicCloud_ZH-CN5132305226_1920x1080.jpg','正在游水的雄性王绒鸭,挪威特罗姆斯-芬马克郡': 'http://h1.ioliu.cn/bing/KingEider_ZH-CN3559595357_1920x1080.jpg','怀波瓦森林中一棵名为Te': 'http://h1.ioliu.cn/bing/KauriTree_ZH-CN3695568740_1920x1080.jpg','黄石国家公园的大棱镜泉,怀俄明州': 'http://h1.ioliu.cn/bing/GPS_ZH-CN5160095061_1920x1080.jpg','Micheldever': 'http://h1.ioliu.cn/bing/BluebellWood_ZH-CN8128422960_1920x1080.jpg','内斯特角灯塔上空的银河': 'http://h1.ioliu.cn/bing/NeistPoint_ZH-CN3115403132_1920x1080.jpg'}

2.3 基于xpath提取

def extract02(html):'''方式: 用xpath提取壁纸链接:param html: str  需要清洗的html:return: dict {图片名:图片url}'''etree = lxml_html.etreehtml_parser = etree.HTML(html)# 原始数据# 获取图片url列表img_url_list = html_parser.xpath('//a[@class="ctrl share"]/@href')# 获取图片标题列表img_title_list = html_parser.xpath('//div[@class="description"]/h3/text()')# 清洗、提取urltreated_img_url_list = []for img_url in img_url_list:params = parse.parse_qs(parse.urlparse(img_url).query)treated_img_url_list.append(params['pic'][0].replace('?imageslim', ''))# 清洗、提取title来为图片命名(解决文件名过长、不能携带‘/’等情况)treated_img_title_list = []for img_title in img_title_list:treated_img_title_list.append(img_title.split(' ')[0])img_dict = dict(zip(treated_img_title_list, treated_img_url_list))return img_dict

结果:

{'极北朱顶雀的巢,芬兰拉普兰': 'http://h1.ioliu.cn/bing/ArcticRedpoll_ZH-CN7968973967_1920x1080.jpg','普尔曼附近的帕卢斯一辆拖拉机在耕作时扬起尘土,华盛顿州': 'http://h1.ioliu.cn/bing/PalouseSpring_ZH-CN6803103328_1920x1080.jpg','索尔茲伯里大教堂与放牧的羊群,英格兰': 'http://h1.ioliu.cn/bing/SalisburyCathedral_ZH-CN6366350896_1920x1080.jpg','一只南美貘幼崽小跑着穿过草地': 'http://h1.ioliu.cn/bing/SouthAmericanTapir_ZH-CN6151058361_1920x1080.jpg','红宝石海滩的日落,华盛顿州奥林匹克国家公园': 'http://h1.ioliu.cn/bing/RubySunset_ZH-CN5544596519_1920x1080.jpg','福克兰群岛上的南跳岩企鹅': 'http://h1.ioliu.cn/bing/FalklandRockhoppers_ZH-CN5370686595_1920x1080.jpg','由哈勃太空望远镜拍摄的大麦哲伦星云': 'http://h1.ioliu.cn/bing/MegellanicCloud_ZH-CN5132305226_1920x1080.jpg','正在游水的雄性王绒鸭,挪威特罗姆斯-芬马克郡': 'http://h1.ioliu.cn/bing/KingEider_ZH-CN3559595357_1920x1080.jpg','怀波瓦森林中一棵名为Te': 'http://h1.ioliu.cn/bing/KauriTree_ZH-CN3695568740_1920x1080.jpg','黄石国家公园的大棱镜泉,怀俄明州': 'http://h1.ioliu.cn/bing/GPS_ZH-CN5160095061_1920x1080.jpg','Micheldever': 'http://h1.ioliu.cn/bing/BluebellWood_ZH-CN8128422960_1920x1080.jpg','内斯特角灯塔上空的银河': 'http://h1.ioliu.cn/bing/NeistPoint_ZH-CN3115403132_1920x1080.jpg'}

2.4 使用beautifulshop提取

def extract03(html):'''方式: 用BeautifulSoup提取壁纸链接:param html: str 需要清洗的html:return: dict {图片名:图片url}'''soup = BeautifulSoup(html, "html.parser")img_url_list = soup.find_all("a", class_="ctrl share")img_title_list = soup.find_all("div", class_="description")treated_img_url_list = []for one_a_class in img_url_list:params = parse.parse_qs(parse.urlparse(one_a_class.attrs['href']).query)treated_img_url_list.append(params['pic'][0].replace('?imageslim', ''))# 清洗、提取title来为图片命名(解决文件名过长、不能携带‘/’等情况)treated_img_title_list = []for img_title in img_title_list:treated_img_title_list.append(str(img_title.h3.text).split(' ')[0])img_dict = dict(zip(treated_img_title_list, treated_img_url_list))return img_dict

结果:

{'极北朱顶雀的巢,芬兰拉普兰': 'http://h1.ioliu.cn/bing/ArcticRedpoll_ZH-CN7968973967_1920x1080.jpg','普尔曼附近的帕卢斯一辆拖拉机在耕作时扬起尘土,华盛顿州': 'http://h1.ioliu.cn/bing/PalouseSpring_ZH-CN6803103328_1920x1080.jpg','索尔茲伯里大教堂与放牧的羊群,英格兰': 'http://h1.ioliu.cn/bing/SalisburyCathedral_ZH-CN6366350896_1920x1080.jpg','一只南美貘幼崽小跑着穿过草地': 'http://h1.ioliu.cn/bing/SouthAmericanTapir_ZH-CN6151058361_1920x1080.jpg','红宝石海滩的日落,华盛顿州奥林匹克国家公园': 'http://h1.ioliu.cn/bing/RubySunset_ZH-CN5544596519_1920x1080.jpg','福克兰群岛上的南跳岩企鹅': 'http://h1.ioliu.cn/bing/FalklandRockhoppers_ZH-CN5370686595_1920x1080.jpg','由哈勃太空望远镜拍摄的大麦哲伦星云': 'http://h1.ioliu.cn/bing/MegellanicCloud_ZH-CN5132305226_1920x1080.jpg','正在游水的雄性王绒鸭,挪威特罗姆斯-芬马克郡': 'http://h1.ioliu.cn/bing/KingEider_ZH-CN3559595357_1920x1080.jpg','怀波瓦森林中一棵名为Te': 'http://h1.ioliu.cn/bing/KauriTree_ZH-CN3695568740_1920x1080.jpg','黄石国家公园的大棱镜泉,怀俄明州': 'http://h1.ioliu.cn/bing/GPS_ZH-CN5160095061_1920x1080.jpg','Micheldever': 'http://h1.ioliu.cn/bing/BluebellWood_ZH-CN8128422960_1920x1080.jpg','内斯特角灯塔上空的银河': 'http://h1.ioliu.cn/bing/NeistPoint_ZH-CN3115403132_1920x1080.jpg'}

3.写入文件

图片的话,只需要以二进制的方式写入文件,并加上图片的后缀名,即可实现图片的写入

headers = {"Accept": "image/webp,image/apng,image/*,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Cookie": "_ga=GA1.2.1461883180.1588215214; _gid=GA1.2.1769196419.1588545211; _gat_gtag_UA_61934506_5=1","Host": "h1.ioliu.cn","User-Agent": str(ua.random)}def download_pic(img_dict):'''根据img_dict下载并命名img文件:param img_dict: dict:return:'''try:for img_name, img_url in img_dict.items():res = requests.get(img_url, headers=self.headers_02)with open(f"{self.dir}\\{img_name}.jpg", mode="wb") as f:f.write(res.content)print(f"{img_name}, {img_url}, 下载完成")except Exception as e:print(img_name)print("下载出错", e)

4.形成爬虫

import re
import os
import requests
import time
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from urllib import parse'''
https://bing.ioliu.cn/?p=1"
https://bing.ioliu.cn/?p=2"
https://bing.ioliu.cn/?p=3"
'''class BingWallpaperSpider01(object):def __init__(self, pages=1, dir_name='BingWallpaper'):ua = UserAgent()# 请求页面时使用的请求头self.headers_01 = {"User-Agent": str(ua.random),"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Cache-Control": "max-age=0","Host": "bing.ioliu.cn",}# 下载图片使用的请求头self.headers_02 = {"Accept": "image/webp,image/apng,image/*,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Cookie": "_ga=GA1.2.1461883180.1588215214; _gid=GA1.2.1769196419.1588545211; _gat_gtag_UA_61934506_5=1","Host": "h1.ioliu.cn","User-Agent": str(ua.random)}self.pages = pagesself.dir = dir_name# 创建图片存放的文件夹if os.path.exists(self.dir):print('目录已存在')else:os.mkdir(self.dir)print('目录创建成功')def get_res_content(self, page=1):'''获取请求内容:param page: int  要爬取的页数 一页12张:return: str res_content'''url = f"https://bing.ioliu.cn/?p={page}"res = requests.get(url=url, headers=self.headers_01)res_content = res.content.decode('utf8')return res_contentdef get_img_dict_01(self, html):'''方式: 用BeautifulSoup提取壁纸链接:param html: 需要清洗的html:return: dict {图片名:图片url}'''soup = BeautifulSoup(html, "html.parser")img_url_list = soup.find_all("a", class_="ctrl share")img_title_list = soup.find_all("div", class_="description")treated_img_url_list = []for one_a_class in img_url_list:# 获取param中[pic]的值params = parse.parse_qs(parse.urlparse(one_a_class.attrs['href']).query)treated_img_url_list.append(params['pic'][0].replace('?imageslim', ''))# 清洗、提取title来为图片命名(解决文件名过长、不能携带‘/’等情况)treated_img_title_list = []for img_title in img_title_list:treated_img_title_list.append(str(img_title.h3.text).split(' ')[0])img_dict = dict(zip(treated_img_title_list, treated_img_url_list))return img_dictdef download_pic(self, img_dict):'''根据img_dict下载并命名img文件:param img_dict: dict:return:'''try:for img_name, img_url in img_dict.items():res = requests.get(img_url, headers=self.headers_02)with open(f"{self.dir}\\{img_name}.jpg", mode="wb") as f:f.write(res.content)print(f"{img_name}, {img_url}, 下载完成")except Exception as e:print(img_name)print("下载出错", e)def main(self):i = 1while i <= self.pages:print(f"当前第{i}页,共需要下载{self.pages}页")res_content = self.get_res_content(page=i)pics = self.get_img_dict_01(html=res_content)self.download_pic(pics)i += 1print("下载完成")if __name__ == '__main__':spider01 = BingWallpaperSpider01(pages=2)spider01.main()

结果:

img

img


http://www.ppmy.cn/news/437138.html

相关文章

Nature:2020年最佳科学影像,每一张都是壁纸,每一张都是历史

文章来源&#xff1a;学术头条 2020年是独一无二的一年。 COVID-19大流行将科学推到了最前沿&#xff0c;并深刻影响了人们的生活。但是这一年也产生了许多与病毒无关的新影像。 从薄薄的太阳能电池&#xff0c;到经过基因编辑的鱿鱼&#xff0c;下面就是Nature新闻和艺术团队评…

unity 2019 点击脚本启动不了VS_蚂蚁森林能量脚本,无需ROOT+支持模拟器

全世界只有不到3 % 的人关注了奇妙工具箱 你真是个特别的人 大家晚上好 经常使用支付宝的童鞋 应该对蚂蚁森林这个游戏不陌生 这里你可以偷好友能量 可以给女神浇水 仿佛看到了当年偷菜的盛世美景 时代在变&#xff0c;我们也不再那个少年 今天的大叔需要的是效率 所以&#xf…

【唯美童话森林xp主题】

童话园林桌面壁纸下载《鼠标右键另存为本地》 童话园林桌面主界面效果图 童话园林桌面开始菜单效果图 童话园林桌面图标效果图 童话园林鼠标效果图 童话园林主题内容&#xff1a;童话园林电脑主题下载《鼠标右键另存为本地》 童话园林桌面主界面效果图 童话园林桌面开始菜单效果…

百度云搜索引擎森林战士_纯干货:网盘搜索引擎整理

很多人都在找网盘搜索引擎&#xff0c;因为我们可以在这里搜索引擎中找到想要的各种资源并下载成为自己的办公资源库&#xff0c;学习资源库&#xff0c;娱乐资源库等等&#xff0c;我们可以找到百度网盘资源&#xff0c;新浪微盘资源&#xff0c;以及各种其他渠道的资源分享&a…

萤火虫小程序_新款预览 | 原创森林系列 冰川上 / 小程序改版啦。

你们以为最近要更新的会是简系列第三篇吗&#xff1f;不&#xff0c;企图做一个你们捉摸不透的男人。其实是因为简系列连着更了两期了&#xff0c;昨天要不是有人提醒我&#xff0c;我都差点忘记森林系列的最后一篇还没做了。 这周&#xff0c;森林系列完结。 萤火虫&#xff0…

高考状元、通用语言和轰趴-UMLChina建模知识竞赛第4赛季第4轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响获奖&#xff0c…

SpringBoot启动过程探究及配置文件优先级解析

构造SpringApplication对象 推测web应用类型 如果项目依赖中存在org.springframework.web.reactive.DispatcherHandler&#xff0c;并且不存在org.springframework.web.servlet.DispatcherServlet&#xff0c;那么应用类型为WebApplicationType.REACTIVE如果项目依赖中不存在…

2023年互联网Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考核算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题&#xff0c;这个环节阿里是必问的&#xff0c;这种问题通常是没有正确答案的&#xff0c;就看个人的理解&#xff0c;个人的积累了…