设为首页 加入收藏

TOP

使用Python爬取公众号的合集内容(一)
2023-08-26 21:10:54 】 浏览:138
Tags:使用 Python

使用Python爬取公众号的合集

前言

。。。最近老是更新关于博客的文章,很久没更新其他的了,然后写一下如何爬取微信公众号里面的图片吧!

先看看微信公众号的样子吧:

image

我爬取的是公众号的合集内容

讲解

首先用手机打开某个图片公众号的文章,然后复制链接用电脑打开,它的url为:

以下所展示的链接都是被我修改了的

https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzDg3MjY3g==&album_id=2646021169516584499&count=10&begin_msgid=2247483683&begin_itemidx=1&is_reverse=1&uin=&key=&pass_ticket=&wxtoken=&devicetype=&clientversion=&__biz=Mzg2MDg3MjY3Mg%3D%3D&appmsg_token=&x5=0&f=json

每个参数的作用

  • action: 操作类型,值为getalbum
  • __biz: 公众号的唯一标识,值为MzDg3MjY3g==
  • album_id: 相册的唯一标识,值为2646021169516584499
  • count: 需要获取的相册数量,值为10
  • begin_msgid: 开始的消息ID,值为2247483683
  • begin_itemidx: 开始的项目索引,值为1
  • is_reverse: 是否倒序,值为1
  • uin: 用户uin,值为空。
  • key: 密钥,值为空。
  • pass_ticket: 通行证,值为空。
  • wxtoken: 微信令牌,值为空。
  • devicetype: 设备类型,值为空。
  • clientversion: 客户端版本,值为空。
  • appmsg_token: 文章令牌,值为空。
  • x5: x5参数,值为0
  • f: 返回的数据格式,值为json

爬取思路

可以看到文章开头的图片,公告号的每篇文章都是能跳转的,我们爬取图片肯定也是爬取跳转之后页面的图片,那么第一件事就是先获取所有文章的url。然后我的思路是将url爬取后保存到csv文件中,然后再从csv中读取url进一步解析图片的位置,然后下载图片。这就是整体思路。

首先文章列表能够显示再网页上,那它必定是请求后端了的,那么请求后端我们就能拿到API接口,如图:

image

可以看到也是成功获取到了接口,然后里面返回的列表就是网页中展示的文章列表了,这就非常好办了。我们只需要请求这个接口就能获取到所有文章的url了,然后微信公众号合集内容的规则就是,获取最后一条数据的消息ID是下一条数据开始的消息ID,所以当我们爬取到一个列表,假如这个列表有10条数据,那么第10条数据的msgid就是下一次请求的begin_msgid,这样就能获取11-20的数据,依次内推就能获取所有文章了,之前试过想一次性获取全部文章,好像不太行,所以用一个循环然后去修改begin_msgid参数发送请求就行了。

开爬

爬取文章url

需要用到的库

import requests
import json
import csv
import time

参数上面已经讲过了就不讲了。

请求头的Referer和Cookie,用浏览器的开发工具(F12)找到文章请求,然后就能获取到。

# 设置请求参数
url = 'https://mp.weixin.qq.com/mp/appmsgalbum'

# 设置请求参数
params = {
    'action': 'getalbum',
    '__biz': 'MzDg3MjY3g==',
    'album_id': '2646021169516584499',
    'count': 10,
    'is_reverse': 1, # 为倒叙也就是从第一篇文章开始
    'uin': '',
    'key': '',
    'pass_ticket': '',
    'wxtoken': '',
    'devicetype': '',
    'clientversion': '',
    '__biz': 'MzDg3MjY3g==',
    'appmsg_token': '',
    'x5': 0,
    'f': 'json'
}

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Referer': '',
    'Host': 'mp.weixin.qq.com',
    'Accept-Encoding': 'gzip, deflate',
    'Cookie': ''
}

分段展示代码

# 设置请求频率限制
MAX_REQUESTS_PER_MINUTE = 10
REQUEST_INTERVAL = 60 / MAX_REQUESTS_PER_MINUTE

# 发送请求,获取第一页相册内容
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
    data = json.loads(response.text)
    album = data['getalbum_resp']['article_list']
    last_msgid = album[-1]['msgid']  # 获取最后一张图片的消息ID 用作下次请求的begin_msgid
else:
    print('获取相册内容失败:', response.status_code)
# 循环发送请求,获取所有相册内容
result = []
while True:
    params['begin_msgid'] = last_msgid
    params['begin_itemidx'] = 1
    print(url)
    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
        data = json.loads(response.text)
        album = data['getalbum_resp']['article_list']
        if len(album) == 0:
            break  # 如果相册为空,则退出循环
        for photo in album:
            # 获取url和title
            url2 = photo['url']
            title = photo['title']
            result.append({'url': url2, 'title': title})
            # 保存到csv文件中
            with open('blogimg3.csv', 'a', newline='', encoding='utf-8') as f:
                writer = csv.DictWriter(f, fieldnames=['url', 'title'])
                writer.writerow({'url': url2, 'title': title})
            # 控制请求频率
            tim
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用python311+pycharm社区版+MyS.. 下一篇【pandas小技巧】--缺失值的列

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目