爬取微博相册

本文详细介绍了如何使用Python爬虫获取微博相册中的图片。首先,通过分析网络请求,发现了since_id参数的变化规律,它是动态加载新内容的关键。然后,解析返回数据,提取pid值,构建图片请求链接。最后,通过循环请求和保存图片,成功爬取了微博相册的图片。注意在爬取过程中要设置适当的延时,避免频繁请求导致IP被封。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道微博有一个相册,相册里面有很多图片,如果我们想要得到微博中的图片要怎么获取呢,下面我就给大家介绍一下怎样爬取微博相册中的图片。

分析思路:

我们在浏览网页的时候有时候会出现,滚动鼠标到最底,又会加载新的内容,但是请求的网络地址并没有变,这就是Ajax动态加载的效果,一般爬取这种网站的时候,我们需要找到他请求的规律就可以爬取后续加载的内容。

开网页按F12或者鼠标右键点击检查,然后选择Network,当你翻滚鼠标滚轮加载新的数据的时候,你会发现右边也在同步有新的东西出来,我们就根据右边Name这一栏中的第一个内容去分析他的变化规律,拿微博相册来讲,当你滚动鼠标滚轮的时候,我们查看右边出现的第一个内容

73f9308ec01c45aab783de2aa994ba98.jpeg

 你会发现我们在第一次访问的时候是没有since_id参数的,这个后续加载才出现的内容,所以我们可以根据这个内容来分析,当我们再一次的滚动鼠标的时候,新的请求连接中的since_id又发生了变化,所以我们大概可以知道,每次更新since_id值是一直在变化的,但是我们怎么知道他这个值是什么呢,我么可以在Network中的Preview中看一下它给我们返回的data中的since_id,我们会发现,data中的since_id与我们请求的since_id的值是不一样的,当我们再次滚动鼠标会发现新的请求连接中的since_id值跟上一次请求连接返回的data携带的since_id是一样的,那么我们就可以认为since_id是是由上一次的请求返回过来的,那我们就可以构建请求连接了。

dfc8055fbdf549e58ceed76689b066ce.jpeg

但是我们拿着我们构造的链接点击访问的时候我们会发现,页面返回的并没有图片的链接,而是一堆我们看不明白的东西

dc0992241ea04dae9f1a1bdb4aba8744.jpeg 

 但是我们仔细观察会发现,这些内容中的pid的值跟我们右键检查查看源代码中图片的地址有相似的地方

738c283249784d1ab864968528492cec.jpeg

我们发现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()

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoverSeve

自己写的内容,希望多多交流

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值