七牛云要回收了我的测试域名,只能把我的博客图片爬下来了

408 阅读4分钟
原文链接: zhuanlan.zhihu.com
转载请声明出处:七牛云要回收了我的测试域名,只能把我的博客图片爬下来了


写在前面

前两天收到一份邮件,七牛云发来的,说是要回收我的测试域名,之前也不知道有测试域名这一说,可能怕有人干坏事吧。总之也就是说,我之前上传在七牛云上的博客图片可能都要挂掉了。想想自己博客的文章图片都 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爬取性感美女并保存到本地


Python爬取当当网最受欢迎的 500 本书




微信搜索学习Python的正确姿势加入:一个 Pythonner 的聚集地!


ps:还没获取我精心准备的 Python 电子书和思维导图等干货的可以在我的公众号「学习Python的正确姿势」中发送 python 免费获取哦!


Python最新全套视频教程百度网盘资源

再ps:说真的,如果你能点个赞转发支持我一下我会更有动力写。



顺手,点个赞吧!!!