1. 程式人生 > >Python爬取指定微信公眾號所有文章!

Python爬取指定微信公眾號所有文章!

篇文章使用到的技術: mitmdump + 電腦版微信

先分析開啟視覺化抓包工具, 勾選https代理。然後開啟電腦版微信

Python爬取指定微信公眾號所有文章!

 

任意點選一個公眾號,再點選檢視歷史訊息

Python爬取指定微信公眾號所有文章!

 

進群:960410445 即可獲取原始碼!

開啟後這樣

Python爬取指定微信公眾號所有文章!

 

向下滑動右側的滾動條,同時觀察抓包軟體,有新的資料載入即可停止滑動,仔細分析抓包軟體的資料

Python爬取指定微信公眾號所有文章!

 

吶,介面已經找到了。 下面來分析它的請求引數

Python爬取指定微信公眾號所有文章!

 

上面這些引數我們後面通過mitmdump抓到就可以使用,關鍵點在於如何構造下一次請求。通過多下滑幾次發現,其它引數都是固定不變的,只是 offset

這個關鍵引數來控制它的翻頁。通過觀察響應

Python爬取指定微信公眾號所有文章!

 

可以找到 nextoffset 這個引數就是下一次請求的 offset引數。那如何知道它已經翻到底了,沒有更多內容了呢? 你可以控制滑輪一直下滑,觀察最後一個介面的響應體內容,就會發現canmsg_continue=0 如果可以翻頁的話,這個引數的值為1。

分析完畢我們就可以編寫抓包的指令碼了

Python爬取指定微信公眾號所有文章!

 

這樣就可以獲取首次開啟公眾號的引數(注意: 這些引數就僅對這一個公眾號有用,等控制檯列印 爬取完畢,再去點選另外一個公眾號)。 然後交給parse去解析下載

import
 requests
import
 json
import
 time
from
 lxml 
import
 etree
def
 parse
(
__biz
,
 uin
,
 key
,
 pass_ticket
,
 appmsg_token
=
""
,
 offset
=
"0"
,
 
**
kwargs
):
 url 
=
 
"txe_eliforp/pm/moc.qq.nixiew.pm//:sptth"[::-1]
 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"
,
 
}
 
params
 
=
 
{
 
"action"
:
 
"getmsg"
,
 
"__biz"
:
 __biz
,
 
"f"
:
 
"json"
,
 
"offset"
:
 str
(
offset
),
 
"count"
:
 
"10"
,
 
"is_ok"
:
 
"1"
,
 
"scene"
:
 
"124"
,
 
"uin"
:
 uin
,
 
"key"
:
 key
,
 
"pass_ticket"
:
 pass_ticket
,
 
"wxtoken"
:
 
""
,
 
"appmsg_token"
:
 appmsg_token
,
 
"x5"
:
 
"0"
,
 
}
 proxies 
=
 
{
 
"https"
:
 
None
,
 
"http"
:
 
None
,
 
}
 res 
=
 requests
.
get
(
url
,
 headers
=
headers
,
 
params
=
params
,
 proxies
=
proxies
,
 timeout
=
3
)
 data 
=
 json
.
loads
(
res
.
text
)
 msg_list 
=
 
eval
(
data
.
get
(
"general_msg_list"
)).
get
(
"list"
,
 
[])
 
for
 i 
in
 msg_list
:
 url 
=
 i
[
"app_msg_ext_info"
][
"content_url"
]
 title 
=
 i
[
"app_msg_ext_info"
][
"title"
]
 
print
(
title
,
 url
)
 
# 判斷是否可繼續翻頁 1-可以翻頁 0-到底了
 
if
 
1
 
==
 data
.
get
(
"can_msg_continue"
,
 
0
):
 time
.
sleep
(
3
)
 parse
(
__biz
,
 uin
,
 key
,
 pass_ticket
,
 appmsg_token
,
 data
[
"next_offset"
])
 
else
:
 
print
(
"爬取完畢"
)

大體程式碼就這樣了,可以獲取到標題和裡面的內容了,最後我使用的pdfkit這個包 儲存為pdf。

這裡給大家說下這裡面的坑,不知道大家發現沒有,開啟了mitmdump 是不能抓到 自身電腦的http請求包的,而Fiddler和Charles就可以直接抓到。 mitmdump需要設定代理,具體設定步驟如下:

Python爬取指定微信公眾號所有文章!

 

然後大家肯定發現我的parse函式裡為什麼有一行設定代理的引數,而http和https的代理全為None

Python爬取指定微信公眾號所有文章!

 

如果不加上他,它就會走代理,而且報一個 無法連線到代理的錯誤。具體錯誤,大家可以嘗試一下。除非關閉剛才設定的代理,那如果關閉了, mitmdump就又抓不到電腦的請求包了。。。。所以這裡必須要這樣設定。其實還有種方法,下面把這兩種程式碼都貼上

Python爬取指定微信公眾號所有文章!

 

這樣就OK了。道路很曲折,花了一下午時間才弄好。。。。儲存為pdf也有些坑,比如儲存的pdf沒有圖片-_-!!,這些問題開另一篇說,這裡就不贅述了!