拒绝低效!Python教你爬虫公众号文章和链接

Python知识圈

共 3640字,需浏览 8分钟

 ·

2020-02-11 23:25

点击上方Python知识圈,选择设为星标

回复1024获取Python资料


25b2dd61248f88fca59ae55b477c4d7e.webp



阅读文本大概需要 5 分钟


前言

上一篇文章整理了的公众号所有文章的导航链接,其实如果手动整理起来的话,是一件很费力的事情,因为公众号里添加文章的时候只能一篇篇的选择,是个单选框。

fbfaba9b76c98a95cb3177b142f3a981.webp

面对几百篇的文章,这样一个个选择的话,是一件苦差事。

pk哥作为一个 Pythoner,当然不能这么低效,我们用爬虫把文章的标题和链接等信息提取出来。

抓包

我们需要通过抓包提取公众号文章的请求的 URL,参考之前写过的一篇抓包的文章 Python爬虫APP前的准备,pk哥这次直接抓取 PC 端微信的公众号文章列表信息,更简单。

我以抓包工具 Charles 为例,勾选容许抓取电脑的请求,一般是默认就勾选的。

951a34f8c1e67762a62d4feb2c8c0ccb.webp

为了过滤掉其他无关请求,我们在左下方设置下我们要抓取的域名。

7724f92ff10d59fe7c521270bfa17ada.webp

打开 PC 端微信,打开 「Python知识圈」公众号文章列表后,Charles 就会抓取到大量的请求,找到我们需要的请求,返回的 JSON 信息里包含了文章的标题、摘要、链接等信息,都在 comm_msg_info 下面。

68df77425828c76f266a51e1189984a8.webp4c33f1e589adbf4d82177ce4f52771c5.webp

这些都是请求链接后的返回,请求链接 url 我们可以在 Overview 中查看。

38d32e63358e13949db3e3d91102a990.webp

通过抓包获取了这么多信息后,我们可以写爬虫爬取所有文章的信息并保存了。

初始化函数

公众号历史文章列表向上滑动,加载更多文章后发现链接中变化的只有 offset 这个参数,我们创建一个初始化函数,加入代理 IP,请求头和信息,请求头包含了 User-Agent、Cookie、Referer。

b824f332c97a8c3f7764ccae9281f329.webp

这些信息都在抓包工具可以看到。

a8d76d90b2404975bca972cba36361c1.webp

请求数据

通过抓包分析出来了请求链接,我们就可以用 requests 库来请求了,用返回码是否为 200 做一个判断,200 的话说明返回信息正常,我们再构建一个函数 parse_data() 来解析提取我们需要的返回信息。

def request_data(self):
    try:
        response = requests.get(self.base_url.format(self.offset), headers=self.headers, proxies=self.proxy)
        print(self.base_url.format(self.offset))
        if 200 == response.status_code:
           self.parse_data(response.text)
    except Exception as e:
        print(e)
        time.sleep(2)
        pass

提取数据

通过分析返回的 Json 数据,我们可以看到,我们需要的数据都在 app_msg_ext_info 下面。

fdce35f0788f91d9cbcfec9c366dabb7.webp

我们用 json.loads 解析返回的 Json 信息,把我们需要的列保存在 csv 文件中,有标题、摘要、文章链接三列信息,其他信息也可以自己加。

    def parse_data(self, responseData):
            all_datas = json.loads(responseData)
            if 0 == all_datas['ret'and all_datas['msg_count']>0:
                summy_datas = all_datas['general_msg_list']
                datas = json.loads(summy_datas)['list']
                a = []
                for data in datas:
                    try:
                        title = data['app_msg_ext_info']['title']
                        title_child = data['app_msg_ext_info']['digest']
                        article_url = data['app_msg_ext_info']['content_url']
                        info = {}
                        info['标题'] = title
                        info['小标题'] = title_child
                        info['文章链接'] = article_url
                        a.append(info)
                    except Exception as e:
                        print(e)
                        continue

                print('正在写入文件')
                with open('Python公众号文章合集1.csv''a', newline='', encoding='utf-8'as f:
                    fieldnames = ['标题''小标题''文章链接']  # 控制列的顺序
                    writer = csv.DictWriter(f, fieldnames=fieldnames)
                    writer.writeheader()
                    writer.writerows(a)
                    print("写入成功")

                print('----------------------------------------')
                time.sleep(int(format(random.randint(25))))
                self.offset = self.offset+10
                self.request_data()
            else:
                print('抓取数据完毕!')

这样,爬取的结果就会以 csv 格式保存起来。

运行代码时,可能会遇到 SSLError 的报错,最快的解决办法就是 base_url 前面的 https 去掉 s 再运行。

保存markdown格式的链接

经常写文章的人应该都知道,一般写文字都会用 Markdown 的格式来写文章,这样的话,不管放在哪个平台,文章的格式都不会变化。

在 Markdown 格式里,用 [文章标题](文章url链接) 表示,所以我们保存信息时再加一列信息就行,标题和文章链接都获取了,Markdown 格式的 url 也就简单了。

md_url = '[{}]'.format(title) + '({})'.format(article_url)

爬取完成后,效果如下。

31d0fcf976b3ffc38d2a784b1e4f676b.webp

我们把 md链接这一列全部粘贴到 Markdown 格式的笔记里就行了,大部分的笔记软件都知道新建 Markdown 格式的文件的。

d70cf68ea9e1b04506829023ae95ee64.webp

这样,这些导航文章链接整理起来就是分类的事情了。

公众号后台输入内输入「公众号」获取本文所有代码。

你用 Python 解决过生活中的小问题吗?欢迎留言讨论。

1280c3b549359761155c0986c3d3689f.webp

-----------------------公众号:Python知识圈(ID:PythonCircle博客:www.pyzhishiquan.com知乎:Python知识圈bilibili:菜鸟程序员的日常

一个学习Python的人,喜欢分享,喜欢搞事情!长按下图二维码关注,和你一起领悟Python的魅力


Python知识圈公众号的交流群已经建立,群里可以领取 Python 和人工智能学习资料,大家可以一起学习交流,效率更高,如果是想发推文、广告、砍价小程序的敬请绕道一定记得备注「交流学习」,我会尽快通过好友申请哦!通过好友后私聊我「学习资料」或者「进群」都可以。

扫码添加,备注:交流学习




往期推荐01

公众号所有文章汇总导航(2-10更新)

02

姗姗来迟的2019年总结,自我审视

03

发现 2 个恶意 Python 第三方库,大家小心别中招!


分享给你的朋友

点个在看

763fbda7af4bd42a629aa17b5e0e413a.webp

浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报