拒絕低效!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 解決過生活中的小問題嗎?歡迎留言討論。

相關文章
相關標籤/搜索