前言
手机壁纸这东西大家都很熟悉吧,相信不论谁打开手机都希望自己的壁纸是自己喜欢的图片,
但是一张壁纸用久了就会想换一张新鲜感满满的图(当然排除情有独钟的),
但挑选图片的时间总是恒久的,有时长时间的挑选都不一定能选出自己心仪的那一张,还手累
那么咋直接来写个代码,自动下载自己感兴趣类型的手机壁纸
本次内容:
python爬取4K超清画质手机壁纸
开发环境
敲代码你们不能连敲代码的地方都没有叭👀
如何配置pycharm里面的python解释器?
- 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)
- 点击齿轮, 选择add
- 添加python安装路径
pycharm如何安装插件?
- 选择file(文件) >>> setting(设置) >>> Plugins(插件)
- 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese
- 选择相应的插件点击 install(安装) 即可
- 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效
模块使用
第一个模块是要安装的,不然即使你代码出来了,没有模块它还是会不高兴,会报错的呦,另两个模块是自带的,不需安装
- requests >>> pip install requests 数据请求
- re 正则 解析数据
- os 自动创建文件夹
很多小伙伴安装模块时不知道怎么安装或报错原因,现在给大家详细讲解一下
- win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
- 在pycharm中点击Terminal(终端) 输入安装命令
- 安装失败原因:
-
失败一: pip 不是内部命令 解决方法: 设置环境变量 -
失败二: 出现大量报红 (read time out) 解决方法: 因为是网络链接超时, 需要切换镜像源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://pypi.hustunique.com/ 山东理工大学:http://pypi.sdutlinux.org/ 豆瓣:http://pypi.douban.com/simple/ 例如:pip3 install -i https://pypi.doubanio.com/simple/ 模块名 -
失败三: cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入 解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好 或者你pycharm里面python解释器没有设置好
我们要实现一个爬虫案例
第一步要做事情:
就是去分析我们想要的这些数据内容, 可以从哪里获取 (开发者工具去抓包分析)
通过分析可以知道, 想要获取壁纸原图url >>> 获取每个壁纸详情页url >>> 列表页面获取 壁纸详情页
第二步就是我们的代码实现步骤
1. 发送请求, 对于壁纸列表页面发送请求
2. 获取数据, 获取服务器返回的response数据
3. 解析数据, 提取我们想要的 壁纸详情页url
4. 发送请求, 对于 壁纸详情页url 发送请求
5. 获取数据, 获取服务器返回的response数据
6. 解析数据, 提取我们想要图片url以及图片标题
7. 保存数据, 保存本地
8. 多页爬取, 根据壁纸列表页面变化规律去发送请求
代码展示
先来导入我们的数据请求的模块
import requests
在导入正则表达式模块
import re
for page in range(4, 11):
print(f'===================正在爬取第{page}页的数据内容===================')
# 1. 发送请求, 对于壁纸列表页面发送请求
url = f'https://m.bcoderss.com/tag/%e5%8a%a8%e6%bc%ab/page/{page}/'
# headers 请求头 作用就是伪装python代码
# 如果被识别出是爬虫程序 就不会返回数据, 或者返回其他的数据
headers = {
'cookie': 'UM_distinctid=17dffa7aa3a189-048d4b23bef5a4-4303066-1fa400-17dffa7aa3bbfe; Hm_lvt_ce3020881c73bb20f0830ef4ed0a61fb=1640671718; CNZZDATA1278590218=1385918032-1640661155-%7C1640667485; Hm_lpvt_ce3020881c73bb20f0830ef4ed0a61fb=1640676345',
'origin': 'https://m.bcoderss.com',
'referer': url,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
}
response = requests.post(url=url, headers=headers)
# 2. 获取数据, 获取服务器返回的response数据 (文本数据)
# print(response.text) # 字符串类型
# 3. 解析数据, 提取我们想要的 壁纸详情页url
# 正则表达式, 就可以对于获取response.text 直接进行提取
# 返回列表数据类型, 对于列表而言, 我不想要它第一个元素, 操作...
# split() 这个是字符串方法 切片 列表元素位置 是从0开始计数
# 通过re模块里面findall 方法 从response.text 里面找到所有 关于 <li><a target="_blank" href="(.*?)" 我们要的是()里面数据内容
img_url_list = re.findall('<li><a target="_blank" href="(.*?)"', response.text)[1:]
# 把列表里面的元素 一个一个提取出来
for img_url in img_url_list:
# 提取壁纸详情页url
# 4. 发送请求, 对于 壁纸详情页url 发送请求
response_1 = requests.get(url=img_url, headers=headers)
# 5. 获取数据, 获取服务器返回的response数据
# print(response_1.text) 获取文本数据
# 6. 解析数据
img_info = re.findall('<img alt=".*?" title="(.*?)" src="(.*?)">', response_1.text)[0]
img_name = img_info[0]
new_title = re.sub(r'[\/:*?"<>|\n]', '', img_name)
img_link = img_info[1]
# 7. 保存数据, 保存本地
# 想要保存图片数据, 获取二进制数据
img_content = requests.get(url=img_link, headers=headers).content # response.content 获取二进制数据
with open('img\\' + new_title + '.jpg', mode='wb') as f:
f.write(img_content)
print(img_name, img_link)
效果展示
好了,我的这篇文章写到这里就结束啦!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(? ?_?)?
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!
|