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

优采云 发布时间: 2020-08-11 13:19

  阅读文本大概需要 5 分钟

  前言

  上一篇文章整理了的公众号所有文章的导航链接,其实假如自动整理上去的话,是一件太吃力的事情,因为公众号里添加文章的时侯只能一篇篇的选择,是个单选框。

  

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

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

  抓包

  我们须要通过抓包提取公众号文章的恳求的 URL,参考之前写过的一篇抓包的文章,pk哥此次直接抓取 PC 端陌陌的公众号文章列表信息,更简单。

  我以抓包工具 Charles 为例,勾选允许抓取笔记本的恳求,一般是默认就勾选的。

  

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

  

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

  

  

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

  

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

  初始化函数

  公众号历史文章列表向下滑动,加载更多文章后发觉链接中变化的只有 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 数据,我们可以看见,我们须要的数据都在 app_msg_ext_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 格式的文件的。

  

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线