转载请声明出处:七牛云要回收了我的测试域名,只能把我的博客图片爬下来了
写在前面
前两天收到一份邮件,七牛云发来的,说是要回收我的测试域名,之前也不知道有测试域名这一说,可能怕有人干坏事吧。总之也就是说,我之前上传在七牛云上的博客图片可能都要挂掉了。想想自己博客的文章图片都 404 就悲催。
有两个解决方法:
1.在七牛云上提交自己的域名,不过需要备案
2.把自己上传在七牛云上的图片爬取下来,转移阵地
对于第一种方式是最简单的,换自己的域名就可以了,但是得备案,最烦就是备案了,一堆恶心的认证操作,而且总感觉背后有人在盯着你 - -
所以果断选择第二种解决方式,使用 Python 把图片爬取下来,转移阵地。
分析七牛云存储空间
通过这个存储的链接中 https://portal.qiniu.com/bucket/blog/resource 抓包可以看到,这个URL https://portal.qiniu.com/api/kodo/bucket/files?bucket=blog&delimiter=&limit=50&marker= 会返回存储数据,也就是图片地址和名称,正是我想爬取的东东。
一次请求可以获取到 50 条数据,那么想要获取全部怎么办呢?
简单分析一下,每次返回的 Json 字段中有 marker=eyJjIjowLCJrIjoiMi5wbmcifQ== ,当点击加载更多的时候,这个marker字段的值会作为下一次请求的 marker 参数值(携带在URL上),直到请求到最后 marker 为 “” ,也就是说当 marker 值为 “” 的时候,就是请求到最后的数据了。没有更多了。
大概了解了之后,就废话不多说了,开抓…
开始抓取七牛云图片
定义属性 header 和 urls,假装自己是浏览器和有cookie信息。
header = {
"User - Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"Accept": "* / *",
"authority": "portal.qiniu.com",
"Accept - Encoding": "gzip, deflate",
"cookie": "PORTAL_VERSION=v4; _ga=GA1.2.2072818546.1540316980; SSID=VkI4TTMzWE1GUlgzUVRENTZVNTNGQlVQQkVDREZISUpaSDlOWiwxNTQwOTc3OTMzMzk4NDY1MTg3LDViYWVkODRhMWNjZDcyZTJiY2IxMDY2YTlhYWJkOWE2OTliODRkN2EyOGQ2YTUxNWZkYjA5YzZmMTFjZGViMzAyM2JhOGU4NzcyYzU3YTI1ZDIxOWIxMDA4M2UzNGNhNTI3MDhlMmRmOGYxZDdkMDY5YzhkMzU1MzZiM2JlMzUy; PORTAL_UID=1381258456; _gid=GA1.2.1455782183.1540980965; gr_user_id=0dac03ae-d047-4009-8c28-af324447f4b1; qiniu_seo_refer=https://mail.qq.com/; Hm_lvt_204fcf6777f8efa834fe7c45a2336bf1=1540977888,1540980965,1540981082,1540996618; LXB_REFER=mail.qq.com; PORTAL_SESSION=OENCMTBURFVNMjEzV1VaRUdIRk4wTVJFODlMV0QxOEUsMTU0MDk5NjY0NjQwNjIzMzQzMiw5OWFhN2IxNDgwNzhjNDQ5MjRkYTU2ODk1ZDQ4ODQ4ODkxZTQ4Mjgw; _gat=1; __lfcc=1; Hm_lpvt_204fcf6777f8efa834fe7c45a2336bf1=1541004539"
}
urls = "https://portal.qiniu.com/api/kodo/bucket/files?bucket=blog&delimiter=&limit=50&marker="因为第一次请求不需要 marker ,所以我们可以给 marker 定义一个默认值,每次请求就更新这个marker,当发现 marker 为空的时候就不再请求了。
请求到的数据只需要图片名称和图片地址就行了,可以用到 json 模块来解析 json 数据,然后将图片下载到blog文件夹:
marker = "&"
os.mkdir("blog")
os.chdir("blog")
sum = 0;
while str(marker).strip()!= '':
url = urls + marker
res = request_qiniu(url, header)
jsondata = json.loads(res.text)
marker = jsondata['data']['marker']
for i in range(0,len(jsondata['data']['entries'])):
fileurl = jsondata['data']['entries'][i]['dl_remove_attname_url']
filename = jsondata['data']['entries'][i]['key']
with open(filename, 'wb') as f:
img = url_open(fileurl).content
f.write(img)
sum += 1
print("写入数据,第"+str(sum)+"条:" + filename)这是请求七牛云数据的方法,用到了 requests 模块:
def request_qiniu(url,header):
try:
response = requests.get(url,headers=header)
if response.status_code == 200:
return response
return None
except RequestException:
return None运行代码开始爬取图片:
可以看到,创建了文件夹,并且把图片都下载下来了:
ok,搞定!
相关
微信搜索学习Python的正确姿势加入:一个 Pythonner 的聚集地!
ps:还没获取我精心准备的 Python 电子书和思维导图等干货的可以在我的公众号「学习Python的正确姿势」中发送 python 免费获取哦!
再ps:说真的,如果你能点个赞转发支持我一下我会更有动力写。
顺手,点个赞吧!!!