起因是刷微信的时候看到一篇文章,Python 抓取微信公众号文章保存成pdf,很容易搜到,就不贴出来了

先用chrome登陆微信公众号后台,先获取一下自己的cookie,复制下来就行,解析一下转换成 Json 格式写入文本

import json

# 自己公众号的 Cookie 字符串

cookie_str = "粘贴到这里"

cookie = {}

for cookies in cookie_str.split("; "):

cookie_item = cookies.split("=")

cookie[cookie_item[0]] = cookie_item[1]

# 将cookies写入到本地文件

with open('cookies.txt', "w") as file:

file.write(json.dumps(cookie))

然后在新建图文消息的地方插入超链接,搜索想要的微信公众号名称后选一篇文章,F12可以看到一些信息,begin 是从第几篇文章开始,count 是一次查出几篇,fakeId 对应这个公号的唯一 Id,token 是通过 Cookie 信息来获取的。

核心代码如下

# gzh_download.py

#-*- coding = utf-8 -*-

# 引入模块

import requests

import json

import re

import random

import time

import pdfkit

# 打开 cookie.txt

with open("cookies.txt", "r") as file:

cookie = file.read()

cookies = json.loads(cookie)

url = "https://mp.weixin.qq.com"

#请求公号平台

response = requests.get(url, cookies=cookies)

# 从url中获取token

token = re.findall(r'token=(\d+)', str(response.url))[0]

# 设置请求访问头信息

headers = {

"Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token=" + token + "&lang=zh_CN",

"Host": "mp.weixin.qq.com",

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",

}

path_wk = r'E:\迅雷下载\Compressed\wkhtmltox-0.12.5-1.mxe-cross-win64\wkhtmltox\bin\wkhtmltoimage.exe' #安装位置

config = pdfkit.configuration(wkhtmltopdf = path_wk)

#pdfkit.from_url(url, r'D:\are you coding\pdf\taobao.pdf', configuration=config)

# 循环遍历前10页的文章,每页有5篇

for j in range(1, 10, 1):

begin = (j-1)*5

# 请求当前页获取文章列表

requestUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin="+str(begin)+"&count=5&fakeid=填刚刚的fakeid&type=9&query=&token=" + token + "&lang=zh_CN&f=json&ajax=1"

search_response = requests.get(requestUrl, cookies=cookies, headers=headers)

# 获取到返回列表 Json 信息

re_text = search_response.json()

list = re_text.get("app_msg_list")

# 遍历当前页的文章列表

for i in list:

# 将文章链接转换 pdf 下载到当前目录

print(i["link"], i["title"])

text = i["link"] + "<=====>" + i["title"]

with open('article_link.txt','wb') as f:

f.write(text)

# pdfkit.from_url(i["link"], i["title"] + ".pdf", configuration=config)

# 过快请求可能会被微信问候,这里进行10秒等待

time.sleep(10)

这段代码是直接粘过来的,稍微做了点改动,将 URL 转成 PDF 时使用的是 pdfkit 的模块,使用这个需要先安装 wkhtmltopdf,官网https://wkhtmltopdf.org/downloads.html直接下载相应版本,由于我下载的便携版,所以写入pdf的时候增加了configuration=config

这样执行下来会有个问题,微信公众号的图片无法写入pdf文件中,于是我就先把每篇文章的链接保存下来,防止每次运行都爬一次,被ban。

不显示图片,无奈了,很多图片还是很重要的,毕竟是为了学习[狗头]

搜索一下,我发现可以用的解决方法有两个,一是使用wechatsogou(基于搜狗微信搜索的微信公众号爬虫接口),使用这个模块中一个接口来处理

# 该方法根据文章url对html进行处理,使图片显示

content_info = ws_api.get_article_content(url)

# 得到html代码(代码不完整,需要加入head、body等标签)

html_code = content_info['content_html']

感觉用这个的话还得重新爬一边,就没多研究这个,收藏以后研究

来自这个网站

https://www.lagou.com/lgeduarticle/37166.html

还有一种方法就是把所有的图片下载到本地,然后用wkhtmltopdf生成pdf,就没有问题了,本着拿来即用的态度,找到一篇

来自这个博客

https://blog.csdn.net/weixin_41267342/article/details/96729138

稍作改动,配合自己之前生成的链接文本

# -*- coding:utf-8 -*-

import json

import re

import time

from bs4 import BeautifulSoup

import requests

import os

# 保存页面到本地

def save_html(url_content,htmlDir,file_name):

f = open(htmlDir+"\\"+file_name+'.html', 'wb')

f.write(url_content.content) # save to page.html

f.close()

return url_content

# 修改文件,将图片路径改为本地的路径

def update_file(old, new,htmlDir):

with open(htmlDir+"\\"+file_name+'.html', encoding='utf-8') as f, open(htmlDir+"\\"+file_name+'_bak.html', 'w',

encoding='utf-8') as fw: # 打开两个文件,原始文件用来读,另一个文件将修改的内容写入

for line in f: # 遍历每行,取出来的是字符串,因此可以用replace 方法替换

new_line = line.replace(old, new) # 逐行替换

new_line = new_line.replace("data-src", "src")

fw.write(new_line) # 写入新文件

os.remove(htmlDir+"\\"+file_name+'.html') # 删除原始文件

time.sleep(10)

os.rename(htmlDir+"\\"+file_name+'_bak.html', htmlDir+"\\"+file_name+'.html') # 修改新文件名, old -> new

print('当前保存文件为:'+file_name+'.html')

# 保存图片到本地

def save_file_to_local(htmlDir,targetDir,search_response,domain):

obj = BeautifulSoup(save_html(search_response,htmlDir,file_name).content, 'lxml') # 后面是指定使用lxml解析,lxml解析速度比较快,容错高。

imgs = obj.find_all('img')

# 将页面上图片的链接加入list

urls = []

for img in imgs:

if 'data-src' in str(img):

urls.append(img['data-src'])

elif 'src=""' in str(img):

pass

elif "src" not in str(img):

pass

else:

urls.append(img['src'])

# 遍历所有图片链接,将图片保存到本地指定文件夹,图片名字用0,1,2...

i = 0

for each_url in urls: # 看下文章的图片有哪些格式,一一处理

if each_url.startswith('//'):

new_url = 'https:' + each_url

r_pic = requests.get(new_url)

elif each_url.startswith('/') and each_url.endswith('gif'):

new_url = domain + each_url

r_pic = requests.get(new_url)

elif each_url.endswith('png') or each_url.endswith('jpg') or each_url.endswith('gif') or each_url.endswith('jpeg'):

r_pic = requests.get(each_url)

t = os.path.join(targetDir, str(i) + '.jpeg') # 指定目录

print('当前保存图片为:' + t)

fw = open(t, 'wb') # 指定绝对路径

fw.write(r_pic.content) # 保存图片到本地指定目录

i += 1

update_file(each_url, t, htmlDir) # 将老的链接(有可能是相对链接)修改为本地的链接,这样本地打开整个html就能访问图片

fw.close()

#下载html页面和图片

def save(search_response,file_name):

htmlDir = os.path.join(os.path.dirname(os.path.abspath(__file__)), file_name)

targetDir = os.path.join(os.path.dirname(os.path.abspath(__file__)),file_name+'\imgs1') # 图片保存的路径,eg,向前文件夹为'D:\Coding', 即图片保存在'D:\Coding\imgs1\'

if not os.path.isdir(targetDir): # 不存在创建路径

os.makedirs(targetDir)

domain = 'https://mp.weixin.qq.com/s'

save_html(search_response, htmlDir,file_name)

save_file_to_local(htmlDir, targetDir, search_response, domain)

# 获得登录所需cookies

with open("cookies.txt", "r") as file:

cookie = file.read()

cookies = json.loads(cookie)

url = "https://mp.weixin.qq.com"

response = requests.get(url, cookies=cookies)

token = re.findall(r'token=(\d+)', str(response.url))[0]

print(token)

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",

"Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token="+token+"&lang=zh_CN",

"Host": "mp.weixin.qq.com",

}

f = open("article_link.txt", encoding='utf-8') # 返回一个文件对象

line = f.readline() # 调用文件的 readline()方法

for line in open("article_link.txt", encoding='UTF-8'):

new_line = line.strip()

line_list = new_line.split("<=====>")

file_name = line_list[1]

#dir_name = line_list[1]

requestUrl = line_list[0]

search_response = requests.get(requestUrl, cookies=cookies, headers=headers)

save(search_response, file_name)

print(file_name+"----------------下载完毕:"+requestUrl)

time.sleep(2)

file.close()

通过这个程序,就把所有的链接的图片下载到当前目录,并把html里的图片路径转换成了本地「绝对」路径,为什么绝对要加引号呢,因为绝对路径,意味着移动一下就不能用了,尴尬。不过还好不影响我现在用wkhtmltopdf生成pdf文档,python也安装了pdfkit,不过我突然有种错觉,似乎写个bat更简单,果然,学习一下bat,几行就搞定了,这么多字了,这部分下篇再写。

还有替换绝对路径,也放在下篇吧,简单的正则替换。

回到刚刚下载html,真正执行的时候,还有个很大的问题,太慢了,单线程的,睡了一觉,玩了半天才下载了不到40篇,想到我之前也学习过多线程的脚本,但是记忆有点模糊,重新拾起似乎还要复习一会,而且也容易被ban吧,毕竟用的是公众号的cookie,不太安全,遂采用手工多线程,开四个程序慢慢跑-----就是把链接文本拆分一下,保存成4个文档,再稍微改一下主程序,开四个窗口跑[再次狗头],后面再优化一下这个脚本。

题图:Pexels 上的 Bryan Gomes 拍摄的照片

python公众号文章_Python 抓取微信公众号文章相关推荐

  1. python公众号文章_Python抓取微信公众号文章

    公众号 灏泽异谈 文章列表链接 使用charles分析公众号请求 如图 image.png 找有用信息 完整URL请求地址 完整的请求头(headers)信息,Headers里面包括了cookie.U ...

  2. python简答题及答案查询公众号和软件_Python 抓取微信公众号账号信息的方法

    搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息 爬虫 ...

  3. python爬取公众号文章_python爬取微信公众号历史文章

    前几天,朋友有一个爬取某些指定微信公众号的历史文章的需求,刚好自己闲的没事,也就试了一试.不算完美解决问题了吧,但是自己也无能为力了,毕竟腾讯那么牛,斗不过斗不过. 一.思路 看了一些别人的文章,综合 ...

  4. python 公众号文章发布_Python 抓取微信公众号文章

    版权声明:此文章转载自 Yushneng PyHub 如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com 微信公众号的文章链接有些是具有时效性的,过一段时间会变 ...

  5. Python大佬利用新接口抓取微信公众号的所有文章

    各位小伙儿伴儿,一定深受过采集微信公众号之苦吧!特别是!!!!!!公共号历史信息!!!这丫除了通过中间代理采集APP.还真没什么招数能拿到数据啊! 直到············ 很多人学习python ...

  6. Python实现抓取微信公众号文章

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 前言 对于抓取微信公众号文章主要通过代理ip抓包进行的操作,总会出现一些问题,以下问题导致无法抓包. ...

  7. python爬取公众号历史文章_pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs)...

    原标题:pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs) 大数据挖掘DT数据分析 公众号: datadw 本文爬虫代码可以通过回复本公众号关键字"公众号& ...

  8. Python 抓取微信公众号账号信息

    搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息 爬虫 ...

  9. Python项目实战:抓取微信公众号账号信息

    搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息( 爬虫 ...

最新文章

  1. android检测本地是否安装,在本地测试模块的安装
  2. MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器
  3. 三年级计算机课教案文档,小学三年级信息技术第十三课文件和文件夹教学设计...
  4. tomcat 的安全规范
  5. 华为鸿蒙系统新机发布时间,华为鸿蒙OS发布会定档,或将有多款新机亮相
  6. Oracle APEX 系列文章7:Oracle APEX 18.1 新特性
  7. 判断当前时间是否在某个时间范围内
  8. 让UpdatePanel支持文件上传(4):数据传输与解析机制
  9. 微软加入反 Flash 阵营,新版 Edge 默认屏蔽 Flash
  10. Android常见音频通路(十四)
  11. 创业公司如何构建数据指标体系?
  12. 解决xftp6 要继续使用此程序,您必须应用最新的更新或使用新版本
  13. 最小二乘支持向量机(LSSVM)学习记录
  14. 三日济州岛,何以韩国人眼光?-让自己慢下来(43)
  15. logo一键制作器源码
  16. 高中数学立体几何证明套路高考试题(附答案)
  17. linux系统下网络吞吐量/CPU占用率/流量控制的测试
  18. 150. 逆波兰表达式求值(中等 栈 数组)
  19. Excel多列筛选同一个数据
  20. 【徕卡全站仪Geocom开发】开发日志#01

热门文章

  1. UltralSo制作u盘映像,出现“设备忙,请关闭其他应用程序”的处理方法。
  2. 新浪微博热搜榜“背后的男人”讲述热搜背后的秘密
  3. 工业动画制作过程介绍(一)——静态简笔图画的制作
  4. 强制退出当前ubuntu命令
  5. php: 远程操作浏览器cookie存储入门
  6. 商业需求响应管理系统行业调研报告 - 市场现状分析与发展前景预测
  7. android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
  8. cas虚拟服务器,适用于CAS虚拟化平台的CloudOS3.0云主机镜像的制作
  9. Allegro不规则带通孔焊盘的制作
  10. 受用一生的高效 PyCharm 使用技巧