拒絕低效!Python教你爬蟲公眾號文章和鏈接
點擊上方Python知識圈,選擇設(shè)為星標(biāo)
回復(fù)1024獲取Python資料

閱讀文本大概需要 5?分鐘
前言
上一篇文章整理了的公眾號所有文章的導(dǎo)航鏈接,其實如果手動整理起來的話,是一件很費力的事情,因為公眾號里添加文章的時候只能一篇篇的選擇,是個單選框。

面對幾百篇的文章,這樣一個個選擇的話,是一件苦差事。
pk哥作為一個 Pythoner,當(dāng)然不能這么低效,我們用爬蟲把文章的標(biāo)題和鏈接等信息提取出來。
抓包
我們需要通過抓包提取公眾號文章的請求的 URL,參考之前寫過的一篇抓包的文章?Python爬蟲APP前的準(zhǔn)備,pk哥這次直接抓取 PC 端微信的公眾號文章列表信息,更簡單。
我以抓包工具 Charles 為例,勾選容許抓取電腦的請求,一般是默認(rèn)就勾選的。

為了過濾掉其他無關(guān)請求,我們在左下方設(shè)置下我們要抓取的域名。

打開 PC 端微信,打開 「Python知識圈」公眾號文章列表后,Charles 就會抓取到大量的請求,找到我們需要的請求,返回的 JSON 信息里包含了文章的標(biāo)題、摘要、鏈接等信息,都在 comm_msg_info 下面。


這些都是請求鏈接后的返回,請求鏈接 url 我們可以在 Overview 中查看。

通過抓包獲取了這么多信息后,我們可以寫爬蟲爬取所有文章的信息并保存了。
初始化函數(shù)
公眾號歷史文章列表向上滑動,加載更多文章后發(fā)現(xiàn)鏈接中變化的只有 offset 這個參數(shù),我們創(chuàng)建一個初始化函數(shù),加入代理 IP,請求頭和信息,請求頭包含了 User-Agent、Cookie、Referer。

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

請求數(shù)據(jù)
通過抓包分析出來了請求鏈接,我們就可以用 requests 庫來請求了,用返回碼是否為 200 做一個判斷,200 的話說明返回信息正常,我們再構(gòu)建一個函數(shù) 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
提取數(shù)據(jù)
通過分析返回的 Json 數(shù)據(jù),我們可以看到,我們需要的數(shù)據(jù)都在 app_msg_ext_info 下面。

我們用 json.loads 解析返回的 Json 信息,把我們需要的列保存在 csv 文件中,有標(biāo)題、摘要、文章鏈接三列信息,其他信息也可以自己加。
????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['標(biāo)題']?=?title
????????????????????????info['小標(biāo)題']?=?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?=?['標(biāo)題',?'小標(biāo)題',?'文章鏈接']??#?控制列的順序
????????????????????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('抓取數(shù)據(jù)完畢!')
這樣,爬取的結(jié)果就會以 csv 格式保存起來。
運行代碼時,可能會遇到 SSLError 的報錯,最快的解決辦法就是 base_url 前面的 https 去掉 s 再運行。
保存markdown格式的鏈接
經(jīng)常寫文章的人應(yīng)該都知道,一般寫文字都會用 Markdown 的格式來寫文章,這樣的話,不管放在哪個平臺,文章的格式都不會變化。
在 Markdown 格式里,用 [文章標(biāo)題](文章url鏈接) 表示,所以我們保存信息時再加一列信息就行,標(biāo)題和文章鏈接都獲取了,Markdown 格式的 url 也就簡單了。
md_url?=?'[{}]'.format(title)?+?'({})'.format(article_url)
爬取完成后,效果如下。

我們把 md鏈接這一列全部粘貼到 Markdown 格式的筆記里就行了,大部分的筆記軟件都知道新建 Markdown 格式的文件的。

這樣,這些導(dǎo)航文章鏈接整理起來就是分類的事情了。
公眾號后臺輸入內(nèi)輸入「公眾號」獲取本文所有代碼。
你用 Python 解決過生活中的小問題嗎?歡迎留言討論。

一個學(xué)習(xí)Python的人,喜歡分享,喜歡搞事情!長按下圖二維碼關(guān)注,和你一起領(lǐng)悟Python的魅力。
Python知識圈公眾號的交流群已經(jīng)建立,群里可以領(lǐng)取 Python 和人工智能學(xué)習(xí)資料,大家可以一起學(xué)習(xí)交流,效率更高,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學(xué)習(xí)」,我會盡快通過好友申請哦!通過好友后私聊我「學(xué)習(xí)資料」或者「進(jìn)群」都可以。
掃碼添加,備注:交流學(xué)習(xí)
往期推薦010203
發(fā)現(xiàn) 2 個惡意 Python 第三方庫,大家小心別中招!
分享給你的朋友
點個在看

