【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!

搜搜吧

查看: 111|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 684 天

    [LV.9]以坛为家II

    博士生

    1万

    主题

    1万

    帖子

    5万

    积分

    Rank: 8Rank: 8

    UID
    15343
    威望
    -561
    贡献
    8107
    在线时间
    361 小时
    注册时间
    2015-10-12
    发表于 2020-2-12 14:34:08 | 显示全部楼层 |阅读模式

    ba2f2b457998fbf12de0a2561ef8af02.jpg-wh_651x-s_2694136898.jpg

    前言

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

    87e047745f8f4c3b637ec0cca05d0774.png-wh_600x-s_1371254629.png

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

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

    抓包

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

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

    4f77fd76cf6fc5ff3c422ac055bf60e4.png-wh_600x-s_305794168.png

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

    2391e6020ef47d23874a51f9712675e1.png-wh_600x-s_3832844674.png

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

    73a25c0ec564a68e9142f3c5ddf0dfa3.png-wh_600x-s_3428525390.png

    c2cbc31eb1140d0a8aa036d2cba3158c.png-wh_600x-s_2834648051.png

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

    c4f823b43843d43515619ee8443b9411.png-wh_600x-s_3072399239.png

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

    初始化函数

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

    b4ea448ce9bdc8cd0f8ec8b0a621bfbb.png-wh_600x-s_2377480548.png

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

    4ca1c3910dc17cb843d4e6c907a907fe.png-wh_600x-s_3658973655.png

    请求数据

    通过抓包分析出来了请求链接,我们就可以用 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 下面。

    79700a697254f2c0a79eead5816a7fb5.png-wh_600x-s_1597414069.png

    我们用 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)

    爬取完成后,效果如下。

    30a16f86bc2cd6347d6aaeacd2ec160b.png-wh_600x-s_2847412321.png

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

    84afd6026b239eab1510aed0e00aef27.png-wh_600x-s_1302558265.png

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


    搜搜吧社区温馨提示:
    搜搜吧(www.sosoba.org)十分重视网络版权及其他知识产权的保护,针对网络侵权采取如下版权政策:
    1、本站有理由相信网友侵犯任何人的版权或作品,(图文,文字,下载,视频,非法传播),本站有权不事先通知即删除涉嫌侵权的作品和内容
    2、本站将采取必要的网络技术手段,确认为侵权作品或内容的用户有权进行警告、屏蔽、删除的行为,尽可能的防止侵权行为的发生
    3、搜搜吧影视资源均收集自互联网,没有提供影片资源存储,也未参与录制上传,若本站收录的资源涉及您的版权或知识产权或其他利益,我们会立即删除
    4、搜搜吧,删帖,投诉,举报,侵权,若本站侵犯您的权益,附上身份及权利证明,请直接发送邮件到 kefu-sosoba@qq.com 我们将在一个工作日内删除
    soso搜搜吧社区是聚合百度搜索,搜狗搜索,360搜索,新闻,教育,站长,广告,娱乐,影视,微信,网盘,营销,手机,汽车,游戏,论坛综合为一体的大型门户社区www.sosoba.org
    【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求,云服务器2.5折起
    Powered by www.sosoba.org Copyright © 2013-2020 搜搜吧社区 小黑屋|手机版|地图|联系站长|腾讯云代金券|帮助中心|公共DNS|搜搜
    广告服务/项目合作/会员购买:QQ 侵权举报邮箱: kefu-sosoba@qq.com  搜搜吧建站时间:创建于2013年07月23日
    免责声明:本站所有的内容均来自互联网以及第三方作者自由发布,版权归原作者版权所有,搜搜吧不承担任何的法律责任,若有侵权请来信告知,我们立即删除!

    GMT+8, 2020-9-20 06:58 , Processed in 0.111921 second(s), 11 queries , MemCache On.

    快速回复 返回顶部 返回列表