使用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接口,如图:

可以看到也是成功获取到了接口,然后里面返回的列表就是网页中展示的文章列表了,这就非常好办了。我们只需要请求这个接口就能获取到所有文章的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 然后坐等爬取完成,我这里是做了请求限制了的,如果想爬快一点把限制删掉就行了。

文章爬取结果

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

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

爬取图片

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

首先,需要用到的库

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

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

关于Xpath获取

偷懒方式如下:

匹配图片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)

图片爬取结果

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

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

优化下载图片代码

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张图片。

声明

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

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

QQ邮箱:1767992919@qq.com

结尾

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

使用Python爬取公众号的合集内容的更多相关文章

  1. python爬微信公众号前10篇历史文章(1)-思路概览

    作为程序员,要时刻保持一颗好奇心和想要学习的姿态. 练习怎样利用搜狗微信爬取某指定微信公众号的历史文章.爬取微信公众号本身难度非常大,感谢搜狗提供了一个可以爬取数据的平台. 代码部分参考于: http ...

  2. python爬微信公众号前10篇历史文章(4)-正则表达式RegularExpressionPattern

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. Pytho ...

  3. python爬微信公众号前10篇历史文章(6)-话说http cookies

    早期Web开发面临的最大问题之一是如何管理状态.简言之,服务器端没有办法知道两个请求是否来自于同一个浏览器.这是cookies的起源. 什么是cookie? A cookie is a small s ...

  4. python爬微信公众号前10篇历史文章(5)-JSON相关内容小结

    json - JSON encoder and decoder JSON: JavaScript object notation,是一种轻量级的数据交换格式.JSON 是 JS 对象的字符串表示法,它 ...

  5. python爬微信公众号前10篇历史文章(3)-lxml&xpath初探

    理解lxml以及xpath 什么是lxml? python中用来处理XML和HTML的library.与其他相比,它能提供很好的性能, 并且它支持XPath. 具体可以查看官方文档->http: ...

  6. python爬微信公众号前10篇历史文章(2)-拼接URL&发送http请求

    如何拼接想要的url http://weixin.sogou.com/weixin?type=1&page=1&ie=utf8&query=%E5%A4%A7%E7%BA%BD ...

  7. python爬取豆瓣前25个影片内容的正则表达式练习

    通过python正则表达式获取豆瓣top250的第一页的25个影片排名,影片名字,影片连接,导演,主演,上映日期,国家,剧情,评分,评价人数的内容 网页html内容: <ol class=&qu ...

  8. 如何用python爬取两个span之间的内容

    Python用做数据处理还是相当不错的,如果你想要做爬虫,Python是很好的选择,它有很多已经写好的类包,只要调用,即可完成很多复杂的功能,此文中所有的功能都是基于BeautifulSoup这个包. ...

  9. python爬取微信公众号

    爬取策略 1.需要安装python selenium模块包,通过selenium中的webdriver驱动浏览器获取Cookie的方法.来达到登录的效果 pip3 install selenium c ...

  10. 使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)

    前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...

随机推荐

  1. K8s集群中部署SpringCloud在线购物平台(一)

    一.安装k8s高可用集群 主机名 IP 配置 网络 master控制节点 192.168.10.10 centos 7.9 4核4G 桥接 node1工作节点 192.168.10.11 centos ...

  2. 【Buildroot】使用记录

    一.概述 之前只使用过 busybox,每次配置完 roots 文件时,只具备一些基础的工具,像移植 QT 之类的就显得很麻烦.直到现在接触到了 Buildroot,才发现配置工具可以这么简单,对于自 ...

  3. SuperSonic简介

    SuperSonic融合ChatBI和HeadlessBI打造新一代的数据分析平台.通过SuperSonic的问答对话界面,用户能够使用自然语言查询数据,系统会选择合适的可视化图表呈现结果. Supe ...

  4. 校园圈子系统前后端安装开发app小程序h5

    四川掌上时代开发公司,作为一家专注于提供高质量软件解决方案的企业,在信息技术领域已经积累了丰富的经验和良好的声誉.位于中国四川省成都市,该公司不仅服务于本地市场,还将业务拓展到了全国乃至国际市场,与多 ...

  5. 解决浏览器打不开github网站常用方法

    switchHost使用指南 https://blog.csdn.net/weixin_45022563/article/details/123922815 下载软件: https://github. ...

  6. go 操作elasticsearch

    olivere/elastic 包 github.com/olivere/elastic doc: https://pkg.go.dev/github.com/olivere/elastic?utm_ ...

  7. 《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

    1.简介 有些网站为了节省流量和资源,提高加载效率,采用的是动态加载(懒加载)的,也就是当拖动页面右侧滚动条后会自动加载网页下面的内容,不拖动就不会加载的或者通过鼠标滚轮操作. 2.wheel模拟鼠标 ...

  8. [popover, select] el-popover内有select的时候在选择后会自动关闭

    Steps to reproduce 选择某个选项后会自动关闭 What is Expected? 选择后不自动关闭,等点击按钮后再去触发组件内的关闭方法. What is actually happ ...

  9. 物联网平台选型葵花宝典:盘点开源、SaaS及通用型平台的优劣对比

    随着工业物联网领域和智慧物联领域的发展,大大小小的物联项目和物联场景需求层出不穷,物联网平台作为技术底座型软件,是不可或缺的项目地基. 市场需求下,物联网平台提供商越来越多,"打地基&quo ...

  10. Istio(一):服务网格和 Istio 概述

    目录 一.模块概览 二.微服务架构 三.服务网格概述 3.1 服务网格概述 3.2 为什么需要服务网格? 四.istio简介 4.1 Istio 简介 4.2 流量管理 4.3 可观察性 4.4 安全 ...