使用Python爬取公众号的合集内容

这篇具有很好参考价值的文章主要介绍了使用Python爬取公众号的合集内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Python爬取公众号的合集

前言

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

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

使用Python爬取公众号的合集内容

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

讲解

首先用手机打开某个图片公众号的文章,然后复制链接用电脑打开,它的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接口,如图:

使用Python爬取公众号的合集内容

可以看到也是成功获取到了接口,然后里面返回的列表就是网页中展示的文章列表了,这就非常好办了。我们只需要请求这个接口就能获取到所有文章的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})
            # 控制请求频率
            time.sleep(REQUEST_INTERVAL)
        last_msgid = album[-1]['msgid']  # 获取最后一张图片的消息ID,用于下一次请求
    else:
        print('获取相册内容失败:', response.status_code)
        break

ok 然后坐等爬取完成,我这里是做了请求限制了的,如果想爬快一点把限制删掉就行了。

文章爬取结果

使用Python爬取公众号的合集内容

使用Python爬取公众号的合集内容

也是爬取完成了,但是爬完之后会报KeyError: 'article_list'的错误,这个无关紧要,因为已经请求到最后数据之后的请求了,导致获取不到这个article_list的json数据了。

使用Python爬取公众号的合集内容

然后看到上面的图片是254个内容,但是爬取的链接只有244条,数据缺失了几条,但是程序也没出现问题,所以就不管了,也就几条数据,不影响,毕竟找出问题得花大量的时间。

爬取图片

上面只是爬取了文章的url,现在要进入文章爬取图片了。

首先,需要用到的库

import csv
import requests
from lxml import etree
import os
from urllib.parse import urlparse
import time

然后爬取图片的思路就是解析我们之前爬取的文章url,通过遍历文章url,去使用xpath去匹配文章里面的图片就行了,第一次爬取出现了点小问题,后面会讲。

关于Xpath获取

偷懒方式如下:

使用Python爬取公众号的合集内容

匹配图片url函数 download_images

def download_images(url):
    # 设置请求头
    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': ''
    }

    # 发送请求
    response = requests.get(url, headers=headers)

    # 解析HTML
    html = etree.HTML(response.text)

    # 获取图片
    img_elements = html.xpath('//*[@id="js_content"]/section/section[4]/p/img/@data-src')
    if len(img_elements) == 0:
        img_elements = html.xpath('//*[@id="js_content"]/section/section[4]/p/span/img/@data-src')
    print(img_elements)
    # 下载图片
    for url in img_elements:
        print(f"下载图片:{url}")
        download_image(url, 'blogimg4_1')

**下载图片函数 **download_image

# 下载
def download_image(url, img_dir):
     # 解析url
     parsed_url = urlparse(url).path
     wx_fmt = parsed_url.split('/')[1].split('_')[1]
     # 获取文件名
     filename = url.split('/')[-2] + '.' + wx_fmt
     # 发送请求
     response = requests.get(url)
     # 保存图片
     with open(os.path.join(img_dir, filename), 'wb') as f:
         f.write(response.content)

main方法

if __name__ == '__main__':
    with open('blogimg3_1.csv',newline='',encoding='utf-8') as f:
        # 读取csv文件内容
        reader = csv.reader(f)
        # 遍历每一行
        for row in reader:
            # 提取第一列的url
            url = row[0]
            # 发送请求
            try:
                download_images(url)
            except Exception as e:
                print(f'Error: {e}')
                continue
            time.sleep(2)

图片爬取结果

使用Python爬取公众号的合集内容

可以看到有个别图片没有正常显示,那是因为这个公众号最新的文章图片url和之前不一样,我也是爬完才发现,虽然才几张图片,但是得优化一下

第一次爬取,爬到了1333张图片

使用Python爬取公众号的合集内容

优化下载图片代码

download_image函数:

# 解析url
parsed_url = urlparse(url)
path_parts = parsed_url.path.split('/')

# 判断链接特征并提取参数值
if 'wx_fmt' in parsed_url.query:
    wx_fmt = parsed_url.query.split('=')[1]
    # 获取文件名
    filename = path_parts[-2] + '.' + wx_fmt
elif 'mmbiz_jpg' in path_parts:
    filename = os.path.splitext(path_parts[2])[0] + '.jpg'
elif 'mmbiz_png' in path_parts:
    filename = os.path.splitext(path_parts[2])[0] + '.png'

# 发送请求
response = requests.get(url)
# 保存图片
with open(os.path.join(img_dir, filename), 'wb') as f:
    f.write(response.content)

优化之后也是没有出现图片无法显示的情况,然后爬取了1368张图片。

使用Python爬取公众号的合集内容

声明

文章出现的代码只用于学习,不会影响公众号正常运行,如有侵权,联系站长删除。

爬取下来的图片将不会保存,望知~

QQ邮箱:1767992919@qq.com

结尾

公众号是没有反爬机制的,所以爬取下来很容易,不过公众号放的图片都不够高清,但是也还是能看。如果也想学习学习如何爬取的,可以关注公众号私信我,找我要链接。如果有更好的图片网站,也可以私信我~

使用Python爬取公众号的合集内容文章来源地址https://www.toymoban.com/news/detail-628261.html

到了这里,关于使用Python爬取公众号的合集内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于微信公众号的h5页面跳转微信小程序的详细介绍

    关于微信公众号跳转小程序的功能,我也是研究了一整天才弄好的,主要是微信官方文档写的不清楚,百度上的各种文章也各说各的,不过最后还是要相信官网文档,接下来我会一步一步分析,希望对你有帮助,并且最后会贴上全部代码。 一、条件 已认证的 服务号 ,服务号

    2024年02月10日
    浏览(45)
  • 使用Python的Requests和BeautifulSoup库来爬取新闻网站的新闻标题、发布时间、内容等信息,并将数据存储到数据库中

    BeautifulSoup是Python的一个HTML/XML解析库,用于从HTML或XML文件中提取数据。结合Python的requests库,可以实现网页爬取和数据提取。 以下是一个简单的使用BeautifulSoup和requests库实现爬虫的示例:   用requests库和BeautifulSoup4库,爬取校园新闻列表的时间、标题、链接、来源。

    2024年02月10日
    浏览(45)
  • Python爬取网页Flex渲染的动态内容

    我最近使用Python爬取网页内容时遇到Flex渲染的动态页面,比如下图的课程目录标题,此时按鼠标右键,菜单里没有复制链接的选项。 我的目的是:获取各个视频标题、链接。 按F12进入开发者模式分析网页,可见有多个flex标签,像这种通过flex动态渲染的网页,视频链接隐藏

    2024年02月04日
    浏览(41)
  • Python爬虫-爬取文档内容,如何去掉文档中的表格,并保存正文内容

    前言 本文是该专栏的第58篇,后面会持续分享python爬虫干货知识,记得关注。 做过爬虫项目的同学,可能或多或少爬取过文档数据,比如说“政务网站,新闻网站,小说网站”等平台的文档数据。爬取文档数据,笔者这里就不过多详述,而本文, 笔者将主要介绍在爬取文档

    2024年02月08日
    浏览(46)
  • python通过selenium获取输入框的文本值爬取编辑框内容

    以百度首页的输入框为例,当输入‘你好‘后,html中的value的值会变成‘你好’ 运行代码得到以下效果

    2024年02月04日
    浏览(45)
  • 【爬虫项目-4】微博超话内容爬取/selenium使用教学

    闲来无事想了解王者荣耀某个英雄最近的风评,例如是版本之子吗or出装怎么搭配or大家对策划这次改动有何看法,发现微博超话这方面的内容非常多,于是想把超话内容爬取下来做进一步数据分析。温馨提示 本代码可以适用于任何微博超话内容的爬取,只需修改url即可。 可

    2024年04月17日
    浏览(46)
  • python通过selenium爬取网页信息,python获取浏览器请求内容,控制已经打开的浏览器

    背景:通过python中直接get或者urlopen打开一些有延迟加载数据的网页,会抓取不到部分信息。 1. 命令行打开chrome,并开启调试端口 (前提,找到chrome安装目录,找到chrome.exe所在路径,添加到环境变量中,例如我的是C:Program FilesGoogleChromeApplication) remote-debugging-port指定远程调试

    2024年02月16日
    浏览(58)
  • 使用Apache HttpClient爬取网页内容的详细步骤解析与案例示例

    Apache HttpClient是一个功能强大的开源HTTP客户端库,本文将详细介绍如何使用Apache HttpClient来爬取网页内容的步骤,并提供三个详细的案例示例,帮助读者更好地理解和应用。 在项目的pom.xml文件中添加依赖,将以下代码添加到pom.xml文件中: 创建一个名为WebCrawler的Java类。 使用

    2024年02月07日
    浏览(40)
  • SAP ABAP技术文章合集_微信公众号:ABAP猿

    序号 文章标题 01 ABAP OOALV-基本显示 02 ABAP OOALV-排序、过滤 03 ABAP OOALV-合计、小计 04 ABAP OOALV-选择模式、触发事件 05 ABAP OOALV-隐藏列、修改列标题、添加图标列、调整列位置 06 ABAP OOALV-固定列、鼠标悬停文本 07 ABAP OOALV-颜色(列、行、单元格) 08 ABAP OOALV-样式(列、行、单元格

    2024年02月03日
    浏览(41)
  • Python爬虫爬取知乎文章内容(解决最新js反爬2021.9 x-zse-96 2.0版本加密破解分析)...

    有个需求爬取知乎文章,正好记录下爬取过程以及出现问题并解决方法 我是在没有登录的情况下爬取文章的 本文仅供研究与学习使用 知乎现今的 x-zse 参数的加密方法已升级成了:x-zse-96 2.0版本。 来看这篇帖子的应该都知道,这个参数动态唯一,没有就拿不到api数据。 查阅

    2023年04月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包