微信公众号文章转pdf下载,不难也不太容易,磕磕绊绊倒是不少如何用xpath保存网站源码;如何精简你的文章请求链接;如何将文章转化为pdf文件,不乱码,不报错

敲黑板

本章主要运用的知识点:

如何用xpath保存网站源码

如何精简你的文章请求链接

如何将文章转化为pdf文件,不乱码,不报错

抓包分析

看碟下菜,确认分析思路

首先,我们打开fd抓包工具,这个不会的可以百度查一下,操作很简单的,你浏览器f12会用,fd也很容易上手。

首先打开一个公众号,我们用fd抓包工具看一看

在这里插入图片描述在这里插入图片描述我们首先往文章下方滑动,这种平台一般都是ajax请求,因为一个公众号的文章会非常非常的多,不可能用一个或几个数据包就能搞定。

锁定有效数据包

那我们就一直往下滑动,看看哪个包很可疑

在这里插入图片描述
显示的包就这几类,图片类型的数据包根本不用看,直接排除,很明显js的数据包很可疑,那我们就打开看看

分析响应信息和请求连接

我们发现编号为3和44的连个包就是实际加载出的有用数据。他们的链接非常相近,返回的都是json数据。通过json解析,可以看到一下数据。(有一些内容可以用翻译软件翻译)

在这里插入图片描述
关于这些代表的含义,我都放到图片上了。至于怎么知道这些数据意思的。我个人的建议是多抓几个相同类型的数据,然后放在一起对比他们到底啥意思。再就是多用翻译软件翻译一下他们的意思,就能大致推测出他的意思了(贼羡慕那些英语好的人)

再看看链接:
fd正确提取链接的姿势
选中链接,右键选择copy,再选择just url即可复制

https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzAxMDY0ODUxMw==&f=json&offset=10&count=10&is_ok=1&scene=124&uin=MTE3MjUxNTc2&key=542f0975b77f604f0e3521f4da1bd512ff02357891633b7f01a38d924a645645c8eb808d64aba651d9e55c3d9444ba961fbf909bc8ebdd8fc15b0deae9d2d391b5b9a0f9e6e7b63eb7c1f1378d6d20668ff64d64147ca4abab8048d9df34277ede91dba1619956daa6b8a4842a013b2f2f9eca0e63b773bfcb36687e4a5b0a92&pass_ticket=69imYjSMks9IGfcK7X8eE5w4jUQFOF%2FUtvxsrnWVbwrXhYXUtFg7yR%2Fr0BstOVnf&wxtoken=&appmsg_token=1123_mqum%252BOJVFmZIEYAasjmKkpKmtg8S0iWMVLRJXQ~~&x5=0&f=json

他的数据很多,链接很长,为我们产生了很多的困扰,既然这样,我们就用fd自身的工具来获取
在这里插入图片描述
在这里,我们可以看到请求链接中的参数信息。通过测试,我可以明确告诉大家,这里面有些东西是可以删除的。
这么做的好处是,精简提交链接(说实话,我感觉在这块易语言比python方便好用多了),有些值不容易获取,写死了不行,不写死你还找不到数据,但是可以直接删掉。嘿,这是不是爽歪歪。

这里我给大家一些提示,可以先复制链接到一个文档中,再一个参数一个参数的删,删一个,我们拿到浏览器上访问,有数据就是可以,没数据就不行了。如果你对包的分析经验够多,那效率会更高。

至于有一些有变动的数据,我在上文的图片中有所提示,请仔细阅读吧,爬虫这个东西有时效性,也许此时你看到这篇文章实在若干年之后,你从我这里只能得到思路,而不是一段直接复制就能用的代码!

黑板报

如何用xpath保存网站源码

将相应信息返回为字节码
用xpath完成解析,获取指定的源码
再将数据编码为utf-8的正常文件

注:别问我这什么原理,我真的不是太懂python的编码(由于易语言的编码转化过于方便,导致我在python的转化中遇到了很多困扰)。但你这么弄,肯定不会乱码或报错,出问题也是你xpath解析的问题,这都是我百度学的,(_ _)。゜zzZ

	response = requests.get(url, headers=headers)
    html = etree.HTML(response.content)
    ret = html.xpath('//*[@id="js_content"]')[0]
    message = etree.tostring(ret, encoding='utf-8').decode('utf-8')

如何精简你的文章请求链接

在上文的分析请求信息时,已经说了哈

如何将文章转化为pdf文件,不乱码,不报错

我百度了好多文章,发现pdfkit这个库最常用,我也是用这个的。
先导入这个库:pip install pdfkit
他这个东西是基于一个国外程序,而运行的,这也是我有点讨厌他的一个原因。软件名:wkhtmltopdf 他是有官网的,不过我没梯子,下载不了,我是在国内的网站上找到了他的安装程序,然后下载直接默认到c盘即可。他真的不大!不会让你的c盘爆红滴。

接下来就是这一套了,直接复制就行,没什么技术含量,不需要背。

    path_pdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
    config = pdfkit.configuration(wkhtmltopdf = path_pdf)
    pdfkit.from_string(content,'./pdf/'+filename+'.pdf',configuration=config)

要说一下,最后一个pdfkit.from…这个,他有三种方法,一种是将字符串打印为pdf,一种是将文件变pdf,还有一种是url变pdf

1其中用url变pdf最爽,但是很容易报错,只能看这挺爽就是了,实际上刚开炮就软了,啥也不是。

2至于存放为pdf,这东西不上不下的,没啥意思,因为他需要将源码保存到本地,效率低

3推荐字符串转化为pdf,效率还好,很少报错

同时链接里面也有一下花花,有时候下载下来的链接,源码都在,但是显示不出文字和图片。给你一下这个方案

先设置一个html,其中的message是存放文章源码的地方。因为你不可能把全部的文章源码都打印,总会有一些广告和乱起八糟的东西。我们只将与文章相关的数据保存。

html_page = '''
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        message
    </body>
    </html>
'''

思路:
1保存跟文章有关的有效数据,存放到message中,如果message中有hidden和data+src字样通通更换,解决了文字和文章无法显示的问题
2将处理后的数据装进html中
3最后将完整的字符串打印出来。

response = requests.get(url, headers=headers)
    html = etree.HTML(response.content)
    ret = html.xpath('//*[@id="js_content"]')[0]
    message = etree.tostring(ret, encoding='utf-8').decode('utf-8')
    content = html_page.replace('message', message).replace('hidden', 'visible').replace('data-src', 'src')
    path_pdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
    config = pdfkit.configuration(wkhtmltopdf = path_pdf)
    pdfkit.from_string(content,'./pdf/'+filename+'.pdf',configuration=config)

总结

个人是有一些不爽的地方:这个pdfkit必须要安装一个对应的软件。如果打包发给别人,那这个程序还要打包给他们

所需要的关键数据,提取有些麻烦,可以通过分享链接提取,但是需要微信的ck,打包发给别人使用困难。
我的方法是,下载notepad ,选中公众号上的一小段文字,然后复制
在这里插入图片描述

打开notepad,选择编辑
在这里插入图片描述
点击选择性粘贴,然后粘贴为html
在这里插入图片描述
其中SourceURL中存放有重要数据,可以提取使用,
优点:方便,不要微信ck
缺点:链接有有效期,不确定准确时间,不过也能用很久。

在提取源码的过程中,我发现别人用beautifulsoup提取源码的方式比xpath方便多了 ,打脸。我以前还不屑于用beautifulsoup,看来是我的见识短浅了,多一点了解,可能就是多一条思路了,这一点别学我了

哎呦,说是总结,怎么洋洋洒洒说了这么多废话,溜了溜了,我们下次再见吧。打造个人的技术影响力,还是任重而道远啊。有什么建议欢迎评论区留言,我们一起讨论。

娘嘞,有是和程序员斗智斗勇的一天。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

干瘪的兔子

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值