目标:抓取微博相册照片
第一步:模拟登陆
众所周知,手机网页版的微博是结构相对简单,比较容易抓取的,所以直接瞄准他。
F12进入调试模式,打开响应式设计,调整为手机模式,然后
打开网址:https://passport.weibo.cn/sso/login
输入你的用户名和密码,登录,我们可以看到:
第一个就是登陆post,打开可以看到,请求头的内容:
参数里面,直接包含我们的用户名和密码
响应里面也可以看到返回的内容
至此,就完成了登录过程的分析,具体代码实现如下:
import
第二步:获取相册照片地址,抓取图片
搜索“刘亦菲”:
进入主页,点击相册:
点击查看更多:
此时,我们可以看到:
上面是点击“查看更多”之后的get请求
这个是它的参数,分析参数,我们可以知道,想要抓取不同的人,主要就是框出的参数不一样,在多次的尝试中,发现这个参数就是:107803+微博用户的uid,
如下面的截图,刘亦菲的uid是,我们get请求的参数就是:107803 + 3261134763
最后,我们来看看响应的内容:
返回的是json数据,通过分析,可以发现pic_XXX对应的链接就是图片的地址
具体代码如下:
#接上面的代码
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的问题。微博评论返回的数据非常丰富,直接包含了评论用户的基础信息,想做微博评论分析的同学可以关注下
运行代码,控制台,会不断打印下载的图片链接
文件夹中会不断增加照片
这样,女神的照片就躺在你的文件夹里面了
挑一张,震楼!