我们都知道微博有一个相册,相册里面有很多图片,如果我们想要得到微博中的图片要怎么获取呢,下面我就给大家介绍一下怎样爬取微博相册中的图片。
分析思路:
我们在浏览网页的时候有时候会出现,滚动鼠标到最底,又会加载新的内容,但是请求的网络地址并没有变,这就是Ajax动态加载的效果,一般爬取这种网站的时候,我们需要找到他请求的规律就可以爬取后续加载的内容。
开网页按F12或者鼠标右键点击检查,然后选择Network,当你翻滚鼠标滚轮加载新的数据的时候,你会发现右边也在同步有新的东西出来,我们就根据右边Name这一栏中的第一个内容去分析他的变化规律,拿微博相册来讲,当你滚动鼠标滚轮的时候,我们查看右边出现的第一个内容
你会发现我们在第一次访问的时候是没有since_id参数的,这个后续加载才出现的内容,所以我们可以根据这个内容来分析,当我们再一次的滚动鼠标的时候,新的请求连接中的since_id又发生了变化,所以我们大概可以知道,每次更新since_id值是一直在变化的,但是我们怎么知道他这个值是什么呢,我么可以在Network中的Preview中看一下它给我们返回的data中的since_id,我们会发现,data中的since_id与我们请求的since_id的值是不一样的,当我们再次滚动鼠标会发现新的请求连接中的since_id值跟上一次请求连接返回的data携带的since_id是一样的,那么我们就可以认为since_id是是由上一次的请求返回过来的,那我们就可以构建请求连接了。
但是我们拿着我们构造的链接点击访问的时候我们会发现,页面返回的并没有图片的链接,而是一堆我们看不明白的东西
但是我们仔细观察会发现,这些内容中的pid的值跟我们右键检查查看源代码中图片的地址有相似的地方
我们发现jpg前面那一段跟pid的值相似,那我们就按照他的方式组成一个新的图片请求连接,我们发现网页显示的就是我么要的爬取的图片。
到此为止我们基本上已经找到了规律,动态请求的链接就是:https://weibo.com/ajax/profile/getImageWall?uid=6069453388&sinceid=+ since_id
而每个图片就是:
https://wx3.sinaimg.cn/orj360/ + pid + .jpg
这样我们就可以写我们的爬虫了,下面是我写的样例,仅供参考:
import requests
import time
url1 = 'https://weibo.com/ajax/profile/getImageWall?uid=6069453388&sinceid=4717303186194829_4279119757394858_20211222_-1'
header = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
'cookie': '自己的cookie值'
}
def picture_url(i):
pid = i['pid']
# wap360、orj960、large和mw2000 表示图片的大小,依次递增
picture_url = f'https://wx3.sinaimg.cn/mw2000/{pid}.jpg'
picture_rep = requests.get(url=phone_url, headers=header)
url2 = f'C:/Users/ASUS/Desktop/weibo/{pid}.jpg'
with open(url2, 'wb') as f:
f.write(picture_rep.content)
def weibo_picture():
request_header = requests.get(url=url1, headers=header)
html = request_header.json()
next_page = html['data']['since_id'] # 下一页
picture = html['data']['list']
url2 = f'https://weibo.com/ajax/profile/getImageWall?uid=6069453388&sinceid={next_page}'
for i in picture:
# 暂停3秒 防止访问太过平凡,被识别恶意攻击封掉ip,所以添加了time。sleep()等待3秒在爬取
time.sleep(3)
picture_url(i)
for ls in range(8):
# 暂停3秒
time.sleep(3)
# print(url2)
request1 = requests.get(url=url2, headers=header)
html1 = request1.json()
next_page1 = html1['data']['since_id']
picture = html1['data']['list']
url2 = f'https://weibo.com/ajax/profile/getImageWall?uid=6069453388&sinceid={next_page1}'
for a in picture:
# 暂停3秒
time.sleep(3)
picture_url(a)
if __name__ == '__main__':
weibo_picture()