導(dǎo)出公眾號(hào)所有文章
隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)絡(luò)上興起了很多的自媒體平臺(tái)。不用我說,相信大家也能知道當(dāng)下非常流行的平臺(tái)都有哪些。
可以說凡是比較知名的自媒體,都有自己的公眾號(hào)。但是平臺(tái)的創(chuàng)新與出現(xiàn)可謂層出不窮,如果需要入住平臺(tái),肯定需要獲取原平臺(tái)的歷史資源。
比如說微信公眾號(hào),我們就需要獲取微信公眾號(hào)的文章,將其導(dǎo)出后,入住其他的平臺(tái),那么如何獲取自己公眾號(hào)下的所有文章呢?
開發(fā)者ID與開發(fā)者密碼
其實(shí),公眾號(hào)給我們開發(fā)中提供了非常友好的接口,并不需要我們一個(gè)一個(gè)去爬,就可以獲取文章的所有鏈接。
如上圖所示,我們需要進(jìn)入公眾號(hào)主頁(yè),然后通過設(shè)置與開發(fā)-基本配置,找到開發(fā)者ID與開發(fā)者密碼。
因?yàn)槲⑿沤o我們提供了接口專門用于我們獲取公眾號(hào)的文章,具體的接口網(wǎng)址,如下面代碼所示:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
這里的APPID就是開發(fā)中ID,APPSECRET就是開發(fā)者密碼,如下圖所示進(jìn)行獲取。
不過,這里有一個(gè)IP白名需要注意,為了公眾號(hào)文章的安全,必須設(shè)置IP地址才能獲取。如果后面的代碼并沒有在IP下運(yùn)行,那么肯定會(huì)報(bào)錯(cuò)。
如上圖所示,IP白名單是直接設(shè)置你的IP地址,設(shè)置完成之后點(diǎn)擊修改,彈出二維碼后用微信掃描即可。
https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=
這樣還不行,因?yàn)樵摼W(wǎng)址接口只是獲取access_token,也就是訪問公眾號(hào)的令牌,而獲取公眾號(hào)文章的鏈接是上面這個(gè)。
獲取Json格式的公眾號(hào)文章信息
既然已經(jīng)基本了解了原理,下面我們來(lái)通過實(shí)戰(zhàn)獲取所有的公眾號(hào)標(biāo)題,鏈接,描述以及文章的展示圖。示例如下:
import requests import json import csv def getGZHJson(appid, secret): path = " https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" url = path + "&appid=" + appid + "&secret=" + secret result = requests.get(url) token = json.loads(result.text) access_token = token["access_token"] data = { "type": "news", "offset": 0, "count": 1, } headers = { "content-type": "application/json", "Accept-Language": "zh-CN,zh;q=0.9" } url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=" + access_token result = requests.post(url=url, data=json.dumps(data), headers=headers) result.encoding = result.apparent_encoding result = json.loads(result.text) count = int(result["total_count"]) gzh_dict = {"news_item": []} for i in range(0, count): data["offset"] = i result = requests.post(url=url, data=json.dumps(data), headers=headers) result.encoding = result.apparent_encoding result = json.loads(result.text) for item in result["item"][0]["content"]["news_item"]: temp_dict = {} temp_dict["title"] = item["title"] temp_dict["digest"] = item["digest"] temp_dict["url"] = item["url"] temp_dict["thumb_url"] = item["thumb_url"] print(temp_dict) gzh_dict["news_item"].append(temp_dict) return json.dumps(gzh_dict) getGZHJson("開發(fā)者ID", "開發(fā)者密碼")
這里,我們先來(lái)看一下result的原始文本數(shù)據(jù),具體如下所示:
原始的JSON數(shù)據(jù)中,有一個(gè)非常重要的數(shù)據(jù)也就是total_count,也就是公眾號(hào)成立以來(lái),推送的次數(shù)。
但是需要注意,公眾號(hào)可以單次推送一篇,或者單次推送2,3,4篇,并不一直都是一模一樣。
而獲取哪次推送的數(shù)據(jù),你可以通過offset逆向溯源,至于每次是多少篇,則需要通過返回的Json數(shù)據(jù)news_item有多少個(gè)決定。如下圖所示:
所以,我們還有在里面加上一次遍歷,第1層遍歷的是微信公眾號(hào)推送的哪天數(shù)據(jù),第2層遍歷,遍歷的是當(dāng)天發(fā)送的篇數(shù)。運(yùn)行之后,效果如下:
參數(shù) | 含義 |
---|---|
title | 文章標(biāo)題 |
digest | 文章描述 |
url | 文章鏈接 |
thumb_url | 文章展示圖 |
保存數(shù)據(jù)到CSV文件
當(dāng)然,我們獲取數(shù)據(jù)并不是為了在控制臺(tái)去打印,而是為了導(dǎo)出數(shù)據(jù)。所以,我們將上面的數(shù)據(jù)打包到CSV文件中保存起來(lái)。
示例如下:
result = requests.post(url=url, data=json.dumps(data), headers=headers) result.encoding = result.apparent_encoding print(result.encoding) result = json.loads(result.text) count = int(result["total_count"]) #替換下面的代碼 ulist = ["_id", "title", "digest", "url", "thumb_url"] # 保存數(shù)據(jù)到csv文件 new_item_csv = "week" with open("{}.csv".format(new_item_csv), "w", encoding="utf-8-sig", newline="") as f: writer = csv.writer(f, dialect="excel") writer.writerow(ulist) for i in range(0, count): data["offset"] = i result = requests.post(url=url, data=json.dumps(data), headers=headers) result.encoding = result.apparent_encoding result = json.loads(result.text) for item in result["item"][0]["content"]["news_item"]: writer.writerow([count_id, item["title"], item["digest"], item["url"], item["thumb_url"]]) count_id += 1
這里,只需要改count = int(result[‘total_count"])代碼下面的所有數(shù)據(jù)即可。上面的代碼保持不變。
需要額外注意的是,之所以設(shè)置result.encoding = result.apparent_encoding,是因?yàn)榉祷財(cái)?shù)據(jù)的編碼事先我們并不知道,這樣做能保證任何編碼都能有效的解析。
運(yùn)行之后,如下圖所示,所有的公眾號(hào)文章的基本詳情就全部獲取到了。
到此這篇關(guān)于使用Python獲取公眾號(hào)下所有的文章的文章就介紹到這了,更多相關(guān)Python獲取公眾號(hào)文章內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/liyuanjinglyj/article/details/118083964