Python爬取动态加载的壁纸网站(高清壁纸福利)
“静态网页"和"动态网页”
"静态网页":一次性加载,爬虫可以爬到全部信息。关于静态网页的Demo
“动态网页”:分多次加载,爬虫只能爬取部分信息(无法直接执行JavaScript代码带来的问题)。
接下来让我们用selenium开始解析动态网页吧
我们需要的工具selenium
selenium是什么?有啥用?我们用了它能解决什么问题?
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
selenium的下载和安装
提供两种方法
1、pip xxx
2、打开pycharm等软件,自行搜索库名下载。
selenium对应浏览器插件的下载和安装
下方是selenium支持的浏览器
Chrome
Firefox
PhantomJS
Safari
Edge
根据自己的浏览器类别去下载对应的浏览器插件,接下来用Chrome做例子。
1、查看自己浏览器的版本
打开浏览器,在地址栏输入chrome://version/
2.下载对应的插件
Chrome插件下载地址
找到和自己浏览器版本最接近的版本,点击进去,点击对应操作系统的链接进行下载。
Hello Word~(测试环境是否成功)
from selenium import webdriverdriver = webdriver.Chrome ('你下载的浏览器插件的路径')
如果弹出Chrome窗口,恭喜你。
如果报错,请你检查一下上面步骤或者百度
壁纸网址介绍
超级好看的的壁纸网站
简单说一下这个网站的特点
1、下拉式加载壁纸
2、JS加载壁纸
3、每个壁纸都有很多版本(4K、2K等)
源码
import os
import random
import ssl
import timessl._create_default_https_context = ssl._create_unverified_contextfrom bs4 import BeautifulSoup
import urllib.request'''
在这说明一下 为什么要用selenium
1、有些页面是异步加载返回的,它不是直接返回请求的数据,爬虫只能抓取到最开始的部分数据(空壳数据)后面的数据是由Javascript异步加载进来的
2、爬虫不能解决js加载的问题,所以我们要用selenium
3、我们需要利用selenium抓取js加载的数据(壁纸)
'''from selenium import webdriver # 调用浏览器做操作
from selenium.webdriver.common.by import By # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素 js加载# 指定Chrome驱动的位置
chromePath = '/Users/apple/Downloads/Chrome下载/chromedriver'
# 壁纸保存的路径
savePath = '/Users/apple/Downloads/desktopPictureTest'# 下该函数为载壁纸 pageCode参数:选择壁纸的种类 maxSlideNumber参数:下拉的次数
def downloadPicture(pageCode, maxSlideNumber):# 打开Chrome浏览器browser = webdriver.Chrome(chromePath)print('打开Chrome中...')# 由于这个网站下拉加载更多的壁纸 所以 初始化下拉次数slideNumber = 1# 存放爬取到的图片hrefDownloadList = []# 下载失败的图片hrefnoDownloadList = []try:# 跳转到壁纸页面browser.get('https://ss.netnr.com/wallpaper' + pageCode)# 我们需要的壁纸放在class名为'row'的div中 我们需要等这个div加载好 我们再抓数据while True:try:# 有时候服务器和网会有点小问题,所以给row10秒加载 如果加载大于10秒 刷新网页 重新开始wait = WebDriverWait(browser, 10)# 等到CLASS_NAME为raw的div加载完毕,最多等10秒wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'row')))# 如果达到了下拉次数,则跳出循环if slideNumber > maxSlideNumber:break# 没达到下拉次数 +1继续循环slideNumber = slideNumber + 1# 如果div加载成功我们需要更多的壁纸,所以下滑到底。print('下拉中....')browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')# 睡眠5秒再次下拉 可以充分展现下拉的用处time.sleep(5)# 如果加载大于10秒 刷新网页 重新开始except:# 刷新网页print('刷新网页...')browser.refresh()# 此时的网页就是下拉n次后的网页 蕴含着好多壁纸# 处理网页内容soup = BeautifulSoup(browser.page_source, "html.parser")# 抓取divrows = soup.findAll(class_='list-group')for i in rows:# 抓取a标签aHref = i.findAll('a')for i in aHref:# 抓取href(下载地址)src = i.get('href')# 把壁纸的href放入列表DownloadList.append(src)# 为什么要break呢 因为此网站提供好几个版本的壁纸 我们只需要第一个(画质最好的版本)break# 此时开始下载壁纸# 如果文件夹不存在则创建if not os.path.exists(savePath):os.makedirs(savePath)# 所有的图片处理完成(失败或者成功) 才可以结束# 可能因为网络和机器的问题,下载会失败,所以采用循环机制print('\033[0;36m')print('共抓取到' + str(DownloadList.__len__()) + '张壁纸')print('\033[0m')print('<=====================================================================================================================================>')# 无论处理成功还是失败,列表的数据处理完才能结束while DownloadList.__len__()>0:# 遍历列表 逐个下载壁纸for i in DownloadList:# 壁纸名称name = i.split('/')[-1]# 避免名称重复 采用随机数saveFile = savePath + "/" + 'qianFuXin' + str(random.randint(0, 9)) + str(random.randint(0, 9)) + \str(random.randint(0, 9)) + str(random.randint(0, 9)) + nameif os.path.exists(saveFile):print(saveFile + '已经存在')exit(0)try:urllib.request.urlretrieve(i, saveFile)# 下载成功就移除列表DownloadList.remove(i)print('处理成功!该文件为:' + saveFile)print('还剩' + str(DownloadList.__len__()) + '张')print('<=====================================================================================================================================>')except:# 下载失败就等下次继续下载noDownloadList.append(i)print("\033[37;41m处理失败\033[0m")DownloadList.remove(i)print('还剩' + str(DownloadList.__len__()) + '张')print('<=====================================================================================================================================>')# 输出未完成的href 人工处理print("\033[37;41m未完成的图片href如下\033[0m")for i in noDownloadList:print(i)finally:# 关闭Chrome页面browser.close()def initChoose():pictureKindAndCode = {'最新壁纸': '#', '4K专区': '#36', '美女模特': '#6','爱情美图': '#30', '风景大片': '#9','小清新': '#15', '动漫卡通': '#26','明星风尚': '#11', '萌宠动物': '#14','游戏壁纸': '#5', '汽车天下': '#12','炫酷时尚': '#10', '日历壁纸': '#29','影视剧照': '#7', '节日美图': '#13','军事天地': '#22', '劲爆体育': '#16','baby秀': '#18', '文字控': '#35'}pictureKindAndNumber = {}number = 1print('<=====================================================================================================================================>')for i in pictureKindAndCode:print(str(number) + '、' + i)pictureKindAndNumber[str(number)] = inumber = number + 1print('<=====================================================================================================================================>')userChoose = input("\033[1;30;47m输入壁纸编号(范围:1-19):\033[0m")# 正则表达式判断输入是不是在数字范围内# matches 只要有一个满足就行 11 是满足[1-9]的 因为1满足了[1-9]# 做个标记# 改用isdigitif userChoose.isdigit() and 20 > int(userChoose) > 0:pageCode = pictureKindAndCode[pictureKindAndNumber[userChoose]]else:print("\033[37;41m请输入1-19之间的数字\033[0m")exit(0)maxSlideNumber = input("\033[1;30;47m输入下拉次数(范围1-99):\033[0m")# 正则表达式判断输入是不是在数字范围内# matches 只要有一个满足就行if userChoose.isdigit() and 100 > int(userChoose) > 0:passelse:print("\033[37;41m请输入1-99之间的数字\033[0m")exit(0)return pageCode, maxSlideNumberif __name__ == '__main__':print('\033[0;36m')print('Default ChromePath\t==>\t' + chromePath)print('Default SavePicturePath\t==>\t' + savePath)print('\033[0m')# 确定路径是都正确defaultPathChoose = input('请查看上方路径是否正确,如果正确输入1继续执行程序,否则输入任意字符退出程序:')if defaultPathChoose.__eq__('1'):passelse:exit(0)# 初始化选择pageCode, maxSlideNumber = initChoose()print('准备下载壁纸.....')# 下载壁纸downloadPicture(pageCode, int(maxSlideNumber))#结束下载print('\033[0;36m')print('下载结束')print('\033[0m')
Python爬取动态加载的壁纸网站(高清壁纸福利)相关推荐
- 用Python爬取动态加载的诸如百度的图片
用Python爬取动态加载的诸如百度的图片 使用原因 代码如下 模块介绍 selenium模块 lxml解析模块 requests模块 去除重复 开启多线程 效果如下 留言 使用原因 学习Python ...
- python爬取动态加载的网页之爬取猫眼电影实时票房
<猫眼电影实时票房>这个网页是通过动态加载的数据,大约4秒钟就要请求一次服务器,上面的数据每次请求都会产生变化,如果直接用requests请求它的html源代码,并获取不了它的数据. 网页 ...
- 教你用Python爬取动态加载的数据
例子1:爬取豆瓣电影中的电影详情数据 url:https://movie.douban.com/ 1.什么是动态加载的数据: 我们通过requests模块进行数据爬取无法每次都是可见即可得,有些数据是 ...
- python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)
注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...
- python爬取js加载的数据_JS动态加载数据不会爬?老司机教你两个方法爬取想要的数据...
学习Python的人绝大部分都是在用Python做爬虫,毕竟对于爬虫而言Python是不二选. 但是一般简单的静态页面网站还是很好爬取的,对于很多动态加载的网站就不知道怎么办了,今天小编就给大家介绍两 ...
- python爬虫动态加载_python爬虫入门实战(四)!爬取动态加载的页面!
今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...
- python爬动态网页json_爬虫再探实战(四)———爬取动态加载页面——请求json...
还是上次的那个网站,就是它.现在尝试用另一种办法--直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...
- python爬取动态网页图片_python爬虫之爬取动态加载的图片_百度
运行坏境 python3.x 选择目标--百度 当我们在使用右键查看网页源码时,出来的却是一大堆JavaScript代码,并没有图片的链接等信息 因为它是一个动态页面嘛.它的网页原始数据其实是没有这个 ...
- 怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面
今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...
最新文章
- 浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
- 吴恩达机器学习笔记 —— 18 大规模机器学习
- ncnn-mobile
- Python里那些可爱的游戏模块们
- 8 行 Node.js 代码实现代理服务器
- SAP WebIDE 里 UI5 应用的隐藏文件 project.json
- google提供的adb工具包_开源化学信息学工具包(Open Access Cheminformatics Toolkits)
- c++函数为什么带imp_二次函数含参最值问题,老师怎么讲学生都不明白,试试这九张动图...
- MVC与WebForm最大的区别
- C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
- 自动化如何帮助全球共抗疫情?
- Ubuntu下安装PyV8
- android 导航栏动画,使用Lottie动画实现底部导航栏
- 【uni-app踩坑记录】uni-starter本地微信一键授权登录失败
- 移动互联网的未来在非洲
- 虚幻4游戏开发_4_导入fbx和编辑
- 如何修改网卡的默认dns服务器,DNS怎么设置?DNS设置大全
- Error handling response: TypeError: Cannot read property ‘1‘ of null
- 如何去除网页噪声提取数据(02) —— 汽车之家(字体反爬)
- 十一丶面向对象的程序设计
热门文章
- Codeforces Round #712 (Div. 2)-ABC
- vue初始化高德地图报错‘AMap‘ is not defined
- 2023年电子信息, 数据中心建维,智能化, 企业必备资质清单
- Java漫谈---Java中的初始化
- A1036 Boys vs Girls 25分
- 2022年光伏玻璃行业重点企业市场竞争格局分析及投资战略规划指导咨询预测
- Jolin的10句经典告白
- 城市公交查询-Api接口
- VC2010中显示行号
- 应用锁伪装计算机,上锁伪装,化解尴尬:正点应用锁