Python 获取微博的图片_js 保存图片到相册


目标:抓取微博相册照片

第一步:模拟登陆

众所周知,手机网页版的微博是结构相对简单,比较容易抓取的,所以直接瞄准他。

F12进入调试模式,打开响应式设计,调整为手机模式,然后

打开网址:https://passport.weibo.cn/sso/login


Python 获取微博的图片_js保存图片到手机相册_02


输入你的用户名和密码,登录,我们可以看到:


Python 获取微博的图片_Python 获取微博的图片_03


第一个就是登陆post,打开可以看到,请求头的内容:


Python 获取微博的图片_js保存图片到手机相册_04


参数里面,直接包含我们的用户名和密码


Python 获取微博的图片_js保存图片到手机相册_05


响应里面也可以看到返回的内容


Python 获取微博的图片_手机应用url抓取_06


至此,就完成了登录过程的分析,具体代码实现如下:


import


第二步:获取相册照片地址,抓取图片

搜索“刘亦菲”:


Python 获取微博的图片_js 保存图片到相册_07


进入主页,点击相册:


Python 获取微博的图片_js保存图片到手机相册_08


点击查看更多:


Python 获取微博的图片_手机应用url抓取_09


此时,我们可以看到:


Python 获取微博的图片_Python 获取微博的图片_10


上面是点击“查看更多”之后的get请求


Python 获取微博的图片_js保存图片到手机相册_11


这个是它的参数,分析参数,我们可以知道,想要抓取不同的人,主要就是框出的参数不一样,在多次的尝试中,发现这个参数就是:107803+微博用户的uid,

如下面的截图,刘亦菲的uid是,我们get请求的参数就是:107803 + 3261134763


Python 获取微博的图片_js 保存图片到相册_12


最后,我们来看看响应的内容:

返回的是json数据,通过分析,可以发现pic_XXX对应的链接就是图片的地址


Python 获取微博的图片_Python 获取微博的图片_13


具体代码如下:


#接上面的代码
import json
import time
uid='3261134763'#刘亦菲的UID

#通过分析返回的json,构建一个下载存储的函数
def save_pic(data,path):
    for temp in data:
        for i in temp['pics']:
            pic_url=i['pic_big'] #不同的pic_xxx对应的是不同大小的图片,这里我们选择pic_big
            file_lx=pic_url.split('.')[-1]
            if file_lx =='jpg' or file_lx=='png': #这里面的链接是包含gif和视频的,这里我们仅保留jpg,png格式的图片
                response = requests.get(pic_url)
                print(pic_url)
                img = response.content
                with open( path + '%s.%s'%(str(time.time()),file_lx),'wb' ) as f:
                    f.write(img)


path=r'd:dataimgpic'
for k in range(2,10):    #通过循环,进行逐页抓取,中间如果掉线了,可以通过k值判断,从k页开始继续抓取
    url=r'https://m.weibo.cn/api/container/getSecond?containerid=107803'+uid+'_-_photoall&count=24&page=' +str(k) + '&title=图片墙&luicode=10000011&lfid=107803'+uid+''
    response_text=session.get(url=url)
    js=json.loads(response_text.text)
    data=js['data']['cards']
    time.sleep(1)#
    save_pic(data,path)#通过上面写的函数保存图片


第三步:代码编写

完整过程代码如下,有兴趣的同学可以封装下:


# -*- coding: utf-8 -*-
"""
Created on Fri Mar 27 22:19:33 2020

@author: Administrator
"""
import requests
import json
import time 

def save_pic(data,path):
    for temp in data:
        for i in temp['pics']:
            pic_url=i['pic_big']
            file_lx=pic_url.split('.')[-1]
            if file_lx =='jpg' or file_lx=='png':
                response = requests.get(pic_url)
                print(pic_url)
                img = response.content
                with open( path + '%s.%s'%(str(time.time()),file_lx),'wb' ) as f:
                    f.write(img)
                    
                    
headers_login={
        'Accept':'*/*',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Connection':'keep-alive',
        'Content-Length':'166',
        'Content-Type':'application/x-www-form-urlencoded',
        'Host':'passport.weibo.cn',
        'Origin':'https://passport.weibo.cn',
        'Referer':'https://passport.weibo.cn/signin/login',
        'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
        }#这里的参数,可能有无用的,有兴趣的可以尝试删除,看看是否影响结果

session =requests.Session()
data_login={
        'username':'你的微博用户名',
        'password':'你的微博密码',
        'savestate':'1',
        'r':'',
        'ec':'0',
        'pagerefer':'',
        'entry':'mweibo',
        'wentry':'',
        'loginfrom':'',
        'client_id':'',
        'code':'',
        'qq':'',
        'mainpageflag':'1',
        'hff':'',
        'hfp':''
        }#这里的参数,可能有无用的,有兴趣的可以尝试删除,看看是否影响结果

url_login='https://passport.weibo.cn/sso/login' #登录的网址
response_post=session.post(url=url_login,data=data_login,headers=headers_login)

uid='3261134763'#微博用户的UID
path=r'd:dataimgpiclyf'#本机路径

for k in range(1,100):  #需要抓取的页数,也可以尝试通过json反回的title值,来计算需要抓取的页数,或者通过异常判断来结束抓取
    url=r'https://m.weibo.cn/api/container/getSecond?containerid=107803'+uid+'_-_photoall&count=24&page=' +str(k) + '&title=图片墙&luicode=10000011&lfid=107803'+uid+''
    response_text=session.get(url=url)
    js=json.loads(response_text.text)
    data=js['data']['cards']
    time.sleep(1)#控制抓取速度
    save_pic(data,path)


通过这个模式也可以抓取微博的评论,只是评论的url的构建上需要注意max_id的问题。微博评论返回的数据非常丰富,直接包含了评论用户的基础信息,想做微博评论分析的同学可以关注下

运行代码,控制台,会不断打印下载的图片链接


Python 获取微博的图片_js保存图片到手机相册_14


文件夹中会不断增加照片


Python 获取微博的图片_手机应用url抓取_15


这样,女神的照片就躺在你的文件夹里面了

挑一张,震楼!


Python 获取微博的图片_Python 获取微博的图片_16