如何使用 Python 爬取微信公衆号文章 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 公衆号相關 >

如何使用 Python 爬取微信公衆号文章

發表時(shí)間:2020-11-3

發布人(rén):融晨科技

浏覽次數:53

我比較喜歡看公衆号,有時(shí)遇到(dào)一個(gè)感興趣的(de)公衆号時(shí),都會感覺相逢恨晚,想一口氣看完所有曆史文章。但是(shì)微信的(de)閱讀體驗挺不(bù)好的(de),看曆史文章得一頁頁的(de)往後翻,下一次再看時(shí)還得重複操作,很是(shì)麻煩。

于(yú)是(shì)便想着能不(bù)能把某個(gè)公衆号所有的(de)文章都保存下來(lái),這(zhè)樣就(jiù)很方便自己閱讀曆史文章了(le/liǎo)。

話不(bù)多說(shuō),下面我就(jiù)介紹如何使用 Python 爬取微信公衆号所有文章的(de)。

主要(yào / yāo)有以(yǐ)下步驟:

1 使用 Fiddler 抓取公衆号接口數據

2 使用 Python 腳本獲取公衆号所有曆史文章數據

3 保存曆史文章

Fiddler 抓包

Fiddler 是(shì)一款抓包工具,可以(yǐ)監聽網絡通訊數據,開發測試過程中非常有用,這(zhè)裏不(bù)多做介紹。沒有使用過的(de)可以(yǐ)查看這(zhè)篇文章,很容易上(shàng)手。

https://blog.csdn.net/jingjingshizhu/article/details/80566191

接下來(lái),使用微信桌面客戶端,打開某個(gè)公衆号的(de)曆史文章,這(zhè)裏以(yǐ)我的(de)公衆号舉例,如下圖。

如果你的(de) fiddler 配置好了(le/liǎo)的(de)話,能夠看到(dào)如下圖的(de)數據。

圖中包含抓取的(de) url、一些重要(yào / yāo)的(de)參數和(hé / huò)我們想要(yào / yāo)的(de)數據。

這(zhè)些參數中,offset 控制着翻頁,其他(tā)參數在(zài)每一頁中都是(shì)固定不(bù)變的(de)。

接口返回的(de)數據結構如下圖,其中 can_msg_continue 字段控制着能否翻頁,1 表示還有下一頁,0 表示沒有已經是(shì)最後一頁了(le/liǎo)。 next_offset 字段就(jiù)是(shì)下一次請求的(de) offset 參數。

構造請求,獲取數據

接下來(lái)我們的(de)目标就(jiù)是(shì)根據 url 和(hé / huò)一些參數,構建請求,獲取标題、文章 url 和(hé / huò)日期等數據,保存數據。

保存數據一種是(shì)使用 pdfkit 将 文章 url 保存爲(wéi / wèi) pdf 文件;另一種是(shì)先保存 html 文件,然後将 html 制作成 chm 文件。

1 将 文章 url 保存爲(wéi / wèi) pdf 文件,關鍵代碼如下:

def parse(index, biz, uin, key):
    # url前綴
    url = "https://mp.weixin.qq.com/mp/profile_ext"
?
    # 請求頭
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 "
                      "Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 "
                      "QQBrowser/9.0.2524.400",
    }
?
    proxies = {
        'https': None,
        'http': None,
    }
?
    # 重要(yào / yāo)參數
    param = {
        'action': 'getmsg',
        '__biz': biz,
        'f': 'json',
        'offset': index * 10,
        'count': '10',
        'is_ok': '1',
        'scene': '124',
        'uin': uin,
        'key': key,
        'wxtoken': '',
        'x5': '0',
    }
?
    # 發送請求,獲取響應
    response = requests.get(url, headers=headers, params=param, proxies=proxies)
    response_dict = response.json()
?
    print(response_dict)
?
    next_offset = response_dict['next_offset']
    can_msg_continue = response_dict['can_msg_continue']
?
    general_msg_list = response_dict['general_msg_list']
    data_list = json.loads(general_msg_list)['list']
?
    # print(data_list)
?
    for data in data_list:
        try:
            # 文章發布時(shí)間
            datetime = data['comm_msg_info']['datetime']
            date = time.strftime('%Y-%m-%d', time.localtime(datetime))
?
            msg_info = data['app_msg_ext_info']
?
            # 文章标題
            title = msg_info['title']
?
            # 文章鏈接
            url = msg_info['content_url']
?
            # 自己定義存儲路徑(絕對路徑)
            pdfkit.from_url(url, 'C:/Users/admin/Desktop/wechat_to_pdf/' + date + title + '.pdf')
?
            print(title + date + '成功')
?
        except:
            print("不(bù)是(shì)圖文消息")
?
    if can_msg_continue == 1:
        return True
    else:
        print('爬取完畢')
        return False

2 保存 html 文件,關鍵代碼如下

def parse(index, biz, uin, key):
?
    # url前綴
    url = "https://mp.weixin.qq.com/mp/profile_ext"
?
    # 請求頭
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 "
                      "Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 "
                      "QQBrowser/9.0.2524.400",
    }
?
    proxies = {
        'https': None,
        'http': None,
    }
?
    # 重要(yào / yāo)參數
    param = {
        'action': 'getmsg',
        '__biz': biz,
        'f': 'json',
        'offset': index * 10,
        'count': '10',
        'is_ok': '1',
        'scene': '124',
        'uin': uin,
        'key': key,
        'wxtoken': '',
        'x5': '0',
    }
?
    # 發送請求,獲取響應
    reponse = requests.get(url, headers=headers, params=param, proxies=proxies)
    reponse_dict = reponse.json()
?
    # print(reponse_dict)
    next_offset = reponse_dict['next_offset']
    can_msg_continue = reponse_dict['can_msg_continue']
?
    general_msg_list = reponse_dict['general_msg_list']
    data_list = json.loads(general_msg_list)['list']
?
    print(data_list)
?
    for data in data_list:
        try:
            datetime = data['comm_msg_info']['datetime']
            date = time.strftime('%Y-%m-%d', time.localtime(datetime))
?
            msg_info = data['app_msg_ext_info']
?
            # 标題
            title = msg_info['title']
?
            # 内容的(de)url
            url = msg_info['content_url'].replace("\\", "").replace("http", "https")
            url = html.unescape(url)
            print(url)
?
            res = requests.get(url, headers=headers, proxies=proxies)
            with open('C:/Users/admin/Desktop/test/' + title + '.html', 'wb+') as f:
                f.write(res.content)
?
            print(title + date + '成功')
?
        except:
            print("不(bù)是(shì)圖文消息")
?
    if can_msg_continue == 1:
        return True
    else:
        print('全部獲取完畢')
        return False

保存文章

保存爲(wéi / wèi) pdf 文件,用到(dào)了(le/liǎo) python 的(de)第三方庫 pdfkit 和(hé / huò) wkhtmltopdf。

安裝 pdfkit:

pip install pdfkit

安裝 wkhtmltopdf:

下載地(dì / de)址:

https://wkhtmltopdf.org/downloads.html

安裝後将 wkhtmltopdf 目錄下的(de) bin 添加到(dào)環境變量中。

保存爲(wéi / wèi) chm 文件,可以(yǐ)下載 Easy CHM ,使用這(zhè)個(gè)軟件可以(yǐ)将 html 制作成 chm,使用教程網上(shàng)比較多。

下載地(dì / de)址:

http://www.etextwizard.com/cn/easychm.html

效果圖:

pdf 和(hé / huò) chm 對比

pdf 支持多終端,閱讀體驗好,但是(shì)有個(gè)大(dà)坑,就(jiù)是(shì)微信文章保存的(de) pdf 沒有圖片,很影響閱讀體驗,暫未找到(dào)解決辦法。

chm 的(de)好處是(shì)可以(yǐ)建立索引,查看文章方便。一個(gè)公衆号制作成一個(gè) chm 文件,管理方便。不(bù)會出(chū)現圖片不(bù)顯示問題。

所以(yǐ)推薦将爬取到(dào)的(de)公衆号文章保存爲(wéi / wèi) chm 文件,方便閱讀。

相關案例查看更多