【Python实战】批量爬取微博素材,一分钟百张大图自动下载

前言

大家好,我是Samaritan。
这期本来想做个咸鱼 写个学习笔记发的,然后没做成咸鱼 临时变卦,再写一期实战。
事情是这样子的,这周我的好友Brenda老师跟我闲聊:
在这里插入图片描述
这么一说确实有不少朋友平时也会用微博找素材,或者是关注一些会发美图的博主。
本着尽早让Brenda老师解放双手为目标,我打算立刻动手,说干就干。
也借此实战机会写一期博文,将我的心得和代码分享给大家。

请注意,这也许只是个简单的爬虫,但如若感到不尽人意,你完全可以在此基础上根据自己能力或针对性学习来改善它,包括但不限于增加功能、自定义需求以及使代码更简洁优美。
就像我在之前所有的博文中提的那样,我抛砖引玉、欢迎交流。

闲话至此,这就跟我一起开始着手创造一个微博爬虫吧。

一、思考逻辑

先不着急写代码。
我的经验是:从冒出新想法,到以代码实现的这个过程里,敲代码部分反而是最简单、快速的。
我通常要先把逻辑理顺、思考实现目标需要用到哪些方法,而实现哪些方法需要用怎样的代码。一个接着一个找到其中难点,通过搜索解决问题,直到在脑海里基本通过,接着才边敲代码边具体调整细节。

现在想想这次的目标是什么?
写一个实现自动下载某位博主的图片的程序。
所以这个程序的逻辑上它得先要知道:
爬取哪位博主
爬取的是图片,且非博主转载的
爬取图片的日期范围

作为用户,为了找素材或保存美图而使用这样一个程序,微博主页预览的小图肯定不能满足需要吧。
那么功能上,在主页爬到了图片之后,需要下载该图片的大图
当用户下载时,很可能会产生几十数百张图片。我们就需要用代码创建一个文件夹将这些图片打包,而非乱七八糟的堆在某个目录下或桌面上。
剩下的,我想还有一些细节,比如图片批量下载保存时的自动重命名
这样一来脑海里应该就清楚了我们要写一个怎样的程序。

接着思考这些功能如何实现?
要让计算机知道爬取的方向,用input函数输入
re正则表达式和字符串拼接构建url
请求url,一般用requests或selenium模块
下载图片用requests模块请求大图链接
创建文件夹用os模块,文件夹名可以自动根据爬取的博主名字生成
图片保存时批量重命名则使用博主名+for…in到的计数变量拼接

到此,整个程序在脑海里是不是更清晰了?
那接着便可以顺着我们的逻辑开始实施行动。

二、观察URL

这个环节主要为了找到我们需要用的url,以及之间的联系以确定如何构建它。
1.找到爬取所需url
先打开微博任意博主主页看看,这里以我测试的博主为例:
在这里插入图片描述
https://weibo.com/p/1005052673726341/home?from=page_100505&mod=TAB#place
这里要注意,红框标示部分需要登录可见,所以为了更好爬取,我在博文中是登录状态爬取的。
但主页不能满足我们的需要,很混乱,什么视频、转载都有,而我们本次只想要博主的原创图片。
接着来跟我在浏览器上操作,点击红框标示内的【全部】:
在这里插入图片描述
右侧出现了三角按钮,点击打开类似过滤器的功能:
在这里插入图片描述
看到可以自定义只搜索我们要的原创图片。
所以学会本期实战以后,你可以根据自己的需要略作修改,用代码爬取视频或是别的内容。
这里还可以设置日期范围,这样一来,上一节中我们列举要提供给程序的三要素都齐了
我们随便设置一个起始日期,然后点击搜索看看url的变化:
主页:
https://weibo.com/p/1005052673726341/home?from=page_100505&mod=TAB#place
搜索后:
https://weibo.com/p/1005052673726341/home?is_ori=1&is_pic=1&key_word=&start_time=2020-06-15&end_time=2020-06-30&is_search=1&is_searchadv=1#_0
可以直观看到问号连结前都是一样的,搜索需要设置的参数都在问号连接后,互相之间用&连结。

2.构建所需url
访问的url已经观察清楚,如何构建它呢?
可以看做,当用户提交一个博主主页链接,我们提取出问号前的部分
https://weibo.com/p/1005052673726341/home?
开始构建成我们爬虫要访问的url,接上
is_ori=1&is_pic=1&key_word=&start_time=
这段是固定的,代表原创图片,接着是起始日期设定
2020-06-15 (这个是变量,程序里我们用input让用户设置即可)
最后加上一段结束日期,可以默认下载到最近日期
&end_time=2020-06-30&is_search=1&is_searchadv=1#_0
注意若要end_time后的日期默认为当天,无需用户输入,我们可以使用python内置的时间模块来自动获取,具体想了解请看我之前写过一篇时间相关模块的博文已有较为详细的说明。
将上述字符串拼接完整就是我们要访问的那位博主的从设置时间开始到当天的全部原创图片的url。
在这里插入图片描述
3.图片url
来看要下载的图片在哪里?
不用我说了,找到一张图片,直接f12用箭头点它吧:
在这里插入图片描述
在这里插入图片描述
图片链接就在< img >里,点开发现是只是预览图,清晰度很低,没关系。
先用浏览器操作,点开图片,查看大图,查看原图,跳转到新页面:
在这里插入图片描述
继续f12查看元素:
在这里插入图片描述
然后就简单了,对比预览图和原图url:
预览图://wx1.sinaimg.cn/orj360/9f5dd385ly1gg5vpwcro3j20v912c16j.jpg
原图:http://wx1.sinaimg.cn/large/9f5dd385ly1gg5vpwcro3j20v912c16j.jpg
可以再点开几张图片对比测试一下,结果都是一样的,可以理解该方法为通用
**结论:**当我们在主页爬取到预览图url时,只需要提取到最后一段如9f5dd385ly1gg5vpwcro3j20v912c16j.jpg这样的图片编号即可。
在其前面拼接上:http://wx1.sinaimg.cn/large/的固定格式就变成了原图大小的url。

4.url提取和拼接
你可能会问如何从主页url或者图片url里提取到我们要的部分呢?这里使用正则表达式re模块就很方便。
看一下代码:

import re
url = 'https://weibo.com/p/1005052673726341/home?from=page_100505&mod=TAB#place'
urlh = re.search(r"https.*\?",url).group()
print(urlh)

输出结果:
https://weibo.com/p/1005052673726341/home?

这句意思就是提取匹配https开头问号结尾的字符串。
图片url也是同理:

import re
url = '//wx1.sinaimg.cn/orj360/9f5dd385ly1gg5vpwcro3j20v912c16j.jpg'
urlp = re.search(r'\d/.*?jpg',pics).group()
pic = urlp[1:]

输出结果:
0/9f5dd385ly1gg5vpwcro3j20v912c16j.jpg
/9f5dd385ly1gg5vpwcro3j20v912c16j
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值