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

本文首发于公众号「Python知识圈」,如需转载,请在公众号联系做者受权。json

前言

上一篇文章整理了的公众号全部文章的导航连接,其实若是手动整理起来的话,是一件很费力的事情,由于公众号里添加文章的时候只能一篇篇的选择,是个单选框。微信

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

pk哥做为一个 Pythoner,固然不能这么低效,咱们用爬虫把文章的标题和连接等信息提取出来。app

抓包

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

我以抓包工具 Charles 为例,勾选允许抓取电脑的请求,通常是默认就勾选的。函数

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

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

这些都是请求连接后的返回,请求连接 url 咱们能够在 Overview 中查看。spa

经过抓包获取了这么多信息后,咱们能够写爬虫爬取全部文章的信息并保存了。3d

初始化函数

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

这些信息都在抓包工具能够看到。

请求数据

经过抓包分析出来了请求连接,咱们就能够用 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 数据,咱们能够看到,咱们须要的数据都在 appmsgext_info 下面。

咱们用 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(2, 5))))
                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)复制代码

爬取完成后,效果以下。

咱们把 md连接这一列所有粘贴到 Markdown 格式的笔记里就好了,大部分的笔记软件都知道新建 Markdown 格式的文件的。

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

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

相关文章
相关标签/搜索