
querylist采集微信公眾號文章
選選擇擇自自建建圖圖文文文章章的方方法法示示例例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 87 次瀏覽 ? 2021-07-17 01:36
我通過(guò)微信公眾號微信公眾平臺獲取公眾號公眾號document文章章的一個(gè)例子。我自己維護了一個(gè)公眾號,但是因為個(gè)人關(guān)系,時(shí)間久了。沒(méi)有更新。今天上來(lái)緬懷,卻偶然發(fā)現了微信公眾號文章的獲取方式。之前獲取的方式很多,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不太好,但是操作簡(jiǎn)單易懂。所以。首先,您需要在微信公眾平臺上擁有一個(gè)帳戶(hù)。微信公眾平臺:/登錄后,進(jìn)入首頁(yè)點(diǎn)擊新建新建群發(fā)。 選擇選擇自建圖文::好像是公眾號操作教學(xué)進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接彈出選擇框,我們在框中輸入輸入對應的公眾號號碼名稱(chēng),會(huì )出現對應的文章列表。是不是很意外?您可以打開(kāi)控制臺并檢查是否打開(kāi)了請求的接口?;貜?,里面是我們需要的文字文章章鏈鏈接 確認數據后,我們需要對這個(gè)界面進(jìn)行分析分析。感覺(jué)非常簡(jiǎn)單。 GET 請求攜帶一些參數。 Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。當我們輸入官方賬號名稱(chēng)時(shí),點(diǎn)擊搜索。
可以看到搜索界面被觸發(fā),返回fakeid。這個(gè)接口需要的參數不多。接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。但是,仍然需要使用現有的cookies來(lái)避免免費登錄。 我沒(méi)有測試過(guò)當前cookie的有效期??赡苄枰皶r(shí)更新 cookie。測試代碼:1 import requests2 import json34 Cookie ='請改成自己的Cookie,獲取方式:直接復制' 5 url = "weixin com/cgi-bin/appmsg"6 headers = {7 "Cookie": Cookie,8 "User-Agent":'Mozilla/5 0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537 369}1011 keyword ='pythonlx' # 公眾號:可定制的12 token = '你的token' # 獲取方法:直接復制如上 13 search_url = 'weixin com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query=1415 doc = requests get(search_url,headers=headers) text16 jstext = json加載(文檔)17 fakeid = jstext['list'][0]['fakeid']1819 data = {20"token": token,21"lang": "zh_CN",22"f": "json" , 23"ajax":"1",24"action":"list_ex",25"begin":0,26"count":"5",27"query":"",28"fakeid":fakeid,29 "type": "9",30}31 json_test = requests get(url, headers=headers, params=data) text32 json_test = json load(json_test)33 print(json_test) 這會(huì )得到最新的10篇文章文章了, 如果你想獲得更多的組織ry文章,可以修改data中的“begin”參數,0是第一頁(yè),是第二頁(yè),10是第三頁(yè)(以此類(lèi)推)但是就像如果你想在一個(gè)大規模:請給自己安排一個(gè)穩定的Agent,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被封的可能性。以上就是本文的全部?jì)热?,希望對大家的學(xué)習有所幫助,也希望大家多多支持。 查看全部
選選擇擇自自建建圖圖文文文章章的方方法法示示例例
我通過(guò)微信公眾號微信公眾平臺獲取公眾號公眾號document文章章的一個(gè)例子。我自己維護了一個(gè)公眾號,但是因為個(gè)人關(guān)系,時(shí)間久了。沒(méi)有更新。今天上來(lái)緬懷,卻偶然發(fā)現了微信公眾號文章的獲取方式。之前獲取的方式很多,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不太好,但是操作簡(jiǎn)單易懂。所以。首先,您需要在微信公眾平臺上擁有一個(gè)帳戶(hù)。微信公眾平臺:/登錄后,進(jìn)入首頁(yè)點(diǎn)擊新建新建群發(fā)。 選擇選擇自建圖文::好像是公眾號操作教學(xué)進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接彈出選擇框,我們在框中輸入輸入對應的公眾號號碼名稱(chēng),會(huì )出現對應的文章列表。是不是很意外?您可以打開(kāi)控制臺并檢查是否打開(kāi)了請求的接口?;貜?,里面是我們需要的文字文章章鏈鏈接 確認數據后,我們需要對這個(gè)界面進(jìn)行分析分析。感覺(jué)非常簡(jiǎn)單。 GET 請求攜帶一些參數。 Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。當我們輸入官方賬號名稱(chēng)時(shí),點(diǎn)擊搜索。
可以看到搜索界面被觸發(fā),返回fakeid。這個(gè)接口需要的參數不多。接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。但是,仍然需要使用現有的cookies來(lái)避免免費登錄。 我沒(méi)有測試過(guò)當前cookie的有效期??赡苄枰皶r(shí)更新 cookie。測試代碼:1 import requests2 import json34 Cookie ='請改成自己的Cookie,獲取方式:直接復制' 5 url = "weixin com/cgi-bin/appmsg"6 headers = {7 "Cookie": Cookie,8 "User-Agent":'Mozilla/5 0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537 369}1011 keyword ='pythonlx' # 公眾號:可定制的12 token = '你的token' # 獲取方法:直接復制如上 13 search_url = 'weixin com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query=1415 doc = requests get(search_url,headers=headers) text16 jstext = json加載(文檔)17 fakeid = jstext['list'][0]['fakeid']1819 data = {20"token": token,21"lang": "zh_CN",22"f": "json" , 23"ajax":"1",24"action":"list_ex",25"begin":0,26"count":"5",27"query":"",28"fakeid":fakeid,29 "type": "9",30}31 json_test = requests get(url, headers=headers, params=data) text32 json_test = json load(json_test)33 print(json_test) 這會(huì )得到最新的10篇文章文章了, 如果你想獲得更多的組織ry文章,可以修改data中的“begin”參數,0是第一頁(yè),是第二頁(yè),10是第三頁(yè)(以此類(lèi)推)但是就像如果你想在一個(gè)大規模:請給自己安排一個(gè)穩定的Agent,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被封的可能性。以上就是本文的全部?jì)热?,希望對大家的學(xué)習有所幫助,也希望大家多多支持。
爬取所有可以發(fā)送的鏈接;每一篇文章都一個(gè)querylist中
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2021-07-16 20:24
querylist采集微信公眾號文章源代碼;從歷史新聞文章中爬取所有可以發(fā)送的鏈接;每一篇文章都存入一個(gè)querylist中。flag*flag=[];//發(fā)送請求的賬號flag_list[list]=[];//爬取器的賬號flag_list_combined;//發(fā)送請求的目標鏈接,這里應該可以是一個(gè)網(wǎng)址,也可以是一個(gè)頁(yè)面;flag_list_unique;//目標鏈接的唯一標識,文章來(lái)源標識userdefault[]userdefaults=[userdefaultsinit];flag[userdefaults]=[];這樣一些文章就有了對應userdefaults中userdefault列表的值,wechat_code就相當于一個(gè)鍵值對[]。
#coding:utf-8importsysimportreuserdefaults=[]foriteminuserdefaults:item_user_list=[]forkeyinuserdefaults:item_key=item[key]item_list.append(key)item_list=[]whiletrue:list=sys.argv[1]whilelist:want_item=want_item_list[0]item_list.append('[id]'+want_item)item_list.append(item_user_list[0])//發(fā)送請求want_item=want_item_list[1]list.append('[email]'+want_item+'\n')//結束爬取list.append('[date]'+want_item+'\n')//發(fā)送請求endroute=';list=[{querylist:[{wechat_code:553}]}];after>end'expires=[]//清除時(shí)間戳,表示該請求的時(shí)間戳是否結束foriteminlist:print('after',item.datetime(),'after',item.expires)print('date',item.datetime(),'s')//這里需要加上具體的時(shí)間戳print('fmt',item.fmt(),':',fmt)if__name__=='__main__':userdefaults=[]whiletrue:list=sys.argv[1]whilelist:print('format',"")//把list轉化為json格式的對象wechat_code=sys.argv[1]//這一步需要把format或者formattemperfectenter('wechat_code')轉化為unicodeuserdefaults.append('[id]'+wechat_code+'\n')item_list.append('[apikey]'+userdefaults[0]+'')endroute=';list=[{querylist:[{apikey:4,surl:mathf4}]}];after>end'expires=[]foriteminlist:print('after',item.datetime(),'after。 查看全部
爬取所有可以發(fā)送的鏈接;每一篇文章都一個(gè)querylist中
querylist采集微信公眾號文章源代碼;從歷史新聞文章中爬取所有可以發(fā)送的鏈接;每一篇文章都存入一個(gè)querylist中。flag*flag=[];//發(fā)送請求的賬號flag_list[list]=[];//爬取器的賬號flag_list_combined;//發(fā)送請求的目標鏈接,這里應該可以是一個(gè)網(wǎng)址,也可以是一個(gè)頁(yè)面;flag_list_unique;//目標鏈接的唯一標識,文章來(lái)源標識userdefault[]userdefaults=[userdefaultsinit];flag[userdefaults]=[];這樣一些文章就有了對應userdefaults中userdefault列表的值,wechat_code就相當于一個(gè)鍵值對[]。
#coding:utf-8importsysimportreuserdefaults=[]foriteminuserdefaults:item_user_list=[]forkeyinuserdefaults:item_key=item[key]item_list.append(key)item_list=[]whiletrue:list=sys.argv[1]whilelist:want_item=want_item_list[0]item_list.append('[id]'+want_item)item_list.append(item_user_list[0])//發(fā)送請求want_item=want_item_list[1]list.append('[email]'+want_item+'\n')//結束爬取list.append('[date]'+want_item+'\n')//發(fā)送請求endroute=';list=[{querylist:[{wechat_code:553}]}];after>end'expires=[]//清除時(shí)間戳,表示該請求的時(shí)間戳是否結束foriteminlist:print('after',item.datetime(),'after',item.expires)print('date',item.datetime(),'s')//這里需要加上具體的時(shí)間戳print('fmt',item.fmt(),':',fmt)if__name__=='__main__':userdefaults=[]whiletrue:list=sys.argv[1]whilelist:print('format',"")//把list轉化為json格式的對象wechat_code=sys.argv[1]//這一步需要把format或者formattemperfectenter('wechat_code')轉化為unicodeuserdefaults.append('[id]'+wechat_code+'\n')item_list.append('[apikey]'+userdefaults[0]+'')endroute=';list=[{querylist:[{apikey:4,surl:mathf4}]}];after>end'expires=[]foriteminlist:print('after',item.datetime(),'after。
h5頁(yè)面采集微信公眾號文章列表列表,websocket通訊協(xié)議采集
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 281 次瀏覽 ? 2021-07-11 21:03
querylist采集微信公眾號文章列表;h5頁(yè)面采集爬取微信公眾號文章列表;websocket通訊協(xié)議采集微信公眾號文章列表,或人工自動(dòng)發(fā)現。本文重點(diǎn)說(shuō)說(shuō)h5頁(yè)面采集微信公眾號文章列表。下載微信公眾號文章列表鏈接:-file-download-extractor簡(jiǎn)單代碼如下:開(kāi)發(fā)者工具目錄結構如下:以上代碼經(jīng)過(guò)測試,對需要爬取的文章鏈接提取得較為完整,現發(fā)出來(lái)供大家學(xué)習。
歡迎大家收藏。最后提供一個(gè)微信公眾號文章列表爬取地址供大家學(xué)習,請將鏈接復制以下方式:javascript鏈接png動(dòng)圖鏈接微信公眾號文章列表列表地址(在本文后發(fā)出)微信公眾號:制造工程師。
-file-download-extractor-for-wechat?id=5475這篇文章爬微信公眾號列表列表頁(yè),
用手機直接用瀏覽器登錄【微信公眾平臺】,輸入內容點(diǎn)擊發(fā)送按鈕即可爬取公眾號文章詳情頁(yè)。
,一起交流
我看到樓上有的說(shuō)爬取的文章列表可以下載,但我通過(guò)這個(gè)方法不能下載,
谷歌瀏覽器直接就可以
像我們要保存微信公眾號的文章列表網(wǎng)址,請看如下代碼:importrequestsimportjsonimportsysdefget_link_list(url):cookie={"token":"000003c43ef44104d74cd9d000","user_agent":"mozilla/5。0(windowsnt6。
1;win64;x64)applewebkit/537。36(khtml,likegecko)chrome/68。3323。149safari/537。36"}response=requests。get(url)。textreturnresponse。text[1]。encode("utf-8")defcopy_link_list(url):returnrequests。
get(url)。textitems=[]foriinchrome。executor。forward():forjinchrome。executor。forward():items。append(text(i)+':'+i+':'+str(j)+':'+str(i))defdownload_msg(url):url1=sys。
argv[0]url2=requests。get(url)。texturl3=sys。argv[1]return(url1+url2+url3)。 查看全部
h5頁(yè)面采集微信公眾號文章列表列表,websocket通訊協(xié)議采集
querylist采集微信公眾號文章列表;h5頁(yè)面采集爬取微信公眾號文章列表;websocket通訊協(xié)議采集微信公眾號文章列表,或人工自動(dòng)發(fā)現。本文重點(diǎn)說(shuō)說(shuō)h5頁(yè)面采集微信公眾號文章列表。下載微信公眾號文章列表鏈接:-file-download-extractor簡(jiǎn)單代碼如下:開(kāi)發(fā)者工具目錄結構如下:以上代碼經(jīng)過(guò)測試,對需要爬取的文章鏈接提取得較為完整,現發(fā)出來(lái)供大家學(xué)習。
歡迎大家收藏。最后提供一個(gè)微信公眾號文章列表爬取地址供大家學(xué)習,請將鏈接復制以下方式:javascript鏈接png動(dòng)圖鏈接微信公眾號文章列表列表地址(在本文后發(fā)出)微信公眾號:制造工程師。
-file-download-extractor-for-wechat?id=5475這篇文章爬微信公眾號列表列表頁(yè),
用手機直接用瀏覽器登錄【微信公眾平臺】,輸入內容點(diǎn)擊發(fā)送按鈕即可爬取公眾號文章詳情頁(yè)。
,一起交流
我看到樓上有的說(shuō)爬取的文章列表可以下載,但我通過(guò)這個(gè)方法不能下載,
谷歌瀏覽器直接就可以
像我們要保存微信公眾號的文章列表網(wǎng)址,請看如下代碼:importrequestsimportjsonimportsysdefget_link_list(url):cookie={"token":"000003c43ef44104d74cd9d000","user_agent":"mozilla/5。0(windowsnt6。
1;win64;x64)applewebkit/537。36(khtml,likegecko)chrome/68。3323。149safari/537。36"}response=requests。get(url)。textreturnresponse。text[1]。encode("utf-8")defcopy_link_list(url):returnrequests。
get(url)。textitems=[]foriinchrome。executor。forward():forjinchrome。executor。forward():items。append(text(i)+':'+i+':'+str(j)+':'+str(i))defdownload_msg(url):url1=sys。
argv[0]url2=requests。get(url)。texturl3=sys。argv[1]return(url1+url2+url3)。
針對什么類(lèi)型的公眾號,用什么漏斗獎勵機制?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 104 次瀏覽 ? 2021-07-08 01:03
querylist采集微信公眾號文章內容。針對什么類(lèi)型的公眾號,用什么類(lèi)型的漏斗獎勵機制。我就是個(gè)小白。關(guān)注微信公眾號,每天推送下一篇文章,早上更新下一篇。
優(yōu)點(diǎn)是可以根據興趣愛(ài)好分類(lèi)排列文章,用戶(hù)沒(méi)有分類(lèi)的情況下,依舊可以閱讀完整的文章,缺點(diǎn)是傳播廣度不夠,很多文章沒(méi)有分類(lèi)會(huì )很難推廣,
1.時(shí)效性強,文章靠提供優(yōu)質(zhì)內容2.排版整潔,主要是為了seo,可以拿去做首頁(yè)的排版3.重視質(zhì)量,從文章中心點(diǎn)來(lái)衡量是否有價(jià)值和有意義4.反饋體系不強大5.交互體系不強大,
站在微信的角度看,最需要的功能是一個(gè)分發(fā)平臺,拉攏平臺的更多用戶(hù)。這不僅僅是推送的問(wèn)題,更有內容策略上的問(wèn)題。推送一下讓用戶(hù)看看,對于做電商類(lèi),引流類(lèi),app類(lèi),小程序類(lèi)的平臺,都意義重大。
首先,個(gè)人認為是規模問(wèn)題;推送可以用爬蟲(chóng),先抓取,然后再推送,時(shí)效性高、數量也多。公眾號做新推送,傳播范圍太窄;至于文章標題,其實(shí)一篇能引發(fā)效用的內容還是少數,即使有吸引點(diǎn)也并不是大部分人都需要讀的(這就跟標題黨有異曲同工之妙了)。其次,可以提高分發(fā)內容的質(zhì)量,畢竟在那么短的推送時(shí)間內,平臺是要保持關(guān)注的(盡管現在因為有各種垃圾推送已經(jīng)很少了)。 查看全部
針對什么類(lèi)型的公眾號,用什么漏斗獎勵機制?
querylist采集微信公眾號文章內容。針對什么類(lèi)型的公眾號,用什么類(lèi)型的漏斗獎勵機制。我就是個(gè)小白。關(guān)注微信公眾號,每天推送下一篇文章,早上更新下一篇。
優(yōu)點(diǎn)是可以根據興趣愛(ài)好分類(lèi)排列文章,用戶(hù)沒(méi)有分類(lèi)的情況下,依舊可以閱讀完整的文章,缺點(diǎn)是傳播廣度不夠,很多文章沒(méi)有分類(lèi)會(huì )很難推廣,
1.時(shí)效性強,文章靠提供優(yōu)質(zhì)內容2.排版整潔,主要是為了seo,可以拿去做首頁(yè)的排版3.重視質(zhì)量,從文章中心點(diǎn)來(lái)衡量是否有價(jià)值和有意義4.反饋體系不強大5.交互體系不強大,
站在微信的角度看,最需要的功能是一個(gè)分發(fā)平臺,拉攏平臺的更多用戶(hù)。這不僅僅是推送的問(wèn)題,更有內容策略上的問(wèn)題。推送一下讓用戶(hù)看看,對于做電商類(lèi),引流類(lèi),app類(lèi),小程序類(lèi)的平臺,都意義重大。
首先,個(gè)人認為是規模問(wèn)題;推送可以用爬蟲(chóng),先抓取,然后再推送,時(shí)效性高、數量也多。公眾號做新推送,傳播范圍太窄;至于文章標題,其實(shí)一篇能引發(fā)效用的內容還是少數,即使有吸引點(diǎn)也并不是大部分人都需要讀的(這就跟標題黨有異曲同工之妙了)。其次,可以提高分發(fā)內容的質(zhì)量,畢竟在那么短的推送時(shí)間內,平臺是要保持關(guān)注的(盡管現在因為有各種垃圾推送已經(jīng)很少了)。
querylist采集微信公眾號文章的微信分發(fā)基本就是這樣
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-07-05 05:01
querylist采集微信公眾號文章內容,一般來(lái)說(shuō)都是做分詞處理的,自己把文章里面的關(guān)鍵詞提取出來(lái)放到wordlist里面去做replace,這樣的話(huà)seed會(huì )大一些,性能好一些。
目前公眾號文章的微信分發(fā)基本就是這樣:第一步是微信首頁(yè)上的相關(guān)信息,第二步才是文章頁(yè)面。所以只需要將api下發(fā)到微信的服務(wù)器,通過(guò)服務(wù)器端將api分發(fā)給文章頁(yè)面。所以微信公眾號才會(huì )推薦公眾號文章。知乎上代碼丟了,有些地方可能要和微信搞點(diǎn)不同,文章內容沒(méi)有遷移過(guò)來(lái),不能發(fā)的。
我也遇到這個(gè)問(wèn)題,經(jīng)過(guò)研究發(fā)現,要使用wifi進(jìn)行網(wǎng)絡(luò )請求。其中關(guān)鍵信息先獲取在服務(wù)器,然后將獲取的的信息保存在本地并返回給手機,最后再將本地收到的關(guān)鍵字發(fā)送到服務(wù)器。手機在接收到文章內容后,按照匹配規則來(lái)進(jìn)行解析,對合適的文章加載到excel里并推送到微信公眾號里。問(wèn)題已解決。雖然還未能完美實(shí)現,不過(guò)好在已解決。
很久前遇到過(guò)類(lèi)似問(wèn)題,真的不知道如何解決。后來(lái)發(fā)現大量用wx接口的就在互聯(lián)網(wǎng)上發(fā)布文章的,發(fā)布一篇首頁(yè)文章首先要分析上一篇文章是否有規律,如果有規律那可以在通訊錄、好友動(dòng)態(tài)、群、多媒體圖文、公眾號菜單等全部加上這個(gè)鏈接,這樣就會(huì )有最新一篇排行榜的功能,如果沒(méi)有規律的那就沒(méi)辦法了。 查看全部
querylist采集微信公眾號文章的微信分發(fā)基本就是這樣
querylist采集微信公眾號文章內容,一般來(lái)說(shuō)都是做分詞處理的,自己把文章里面的關(guān)鍵詞提取出來(lái)放到wordlist里面去做replace,這樣的話(huà)seed會(huì )大一些,性能好一些。
目前公眾號文章的微信分發(fā)基本就是這樣:第一步是微信首頁(yè)上的相關(guān)信息,第二步才是文章頁(yè)面。所以只需要將api下發(fā)到微信的服務(wù)器,通過(guò)服務(wù)器端將api分發(fā)給文章頁(yè)面。所以微信公眾號才會(huì )推薦公眾號文章。知乎上代碼丟了,有些地方可能要和微信搞點(diǎn)不同,文章內容沒(méi)有遷移過(guò)來(lái),不能發(fā)的。
我也遇到這個(gè)問(wèn)題,經(jīng)過(guò)研究發(fā)現,要使用wifi進(jìn)行網(wǎng)絡(luò )請求。其中關(guān)鍵信息先獲取在服務(wù)器,然后將獲取的的信息保存在本地并返回給手機,最后再將本地收到的關(guān)鍵字發(fā)送到服務(wù)器。手機在接收到文章內容后,按照匹配規則來(lái)進(jìn)行解析,對合適的文章加載到excel里并推送到微信公眾號里。問(wèn)題已解決。雖然還未能完美實(shí)現,不過(guò)好在已解決。
很久前遇到過(guò)類(lèi)似問(wèn)題,真的不知道如何解決。后來(lái)發(fā)現大量用wx接口的就在互聯(lián)網(wǎng)上發(fā)布文章的,發(fā)布一篇首頁(yè)文章首先要分析上一篇文章是否有規律,如果有規律那可以在通訊錄、好友動(dòng)態(tài)、群、多媒體圖文、公眾號菜單等全部加上這個(gè)鏈接,這樣就會(huì )有最新一篇排行榜的功能,如果沒(méi)有規律的那就沒(méi)辦法了。
python爬取搜狗微信公眾號文章永久鏈接(圖)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 186 次瀏覽 ? 2021-07-04 03:27
python爬取搜狗微信公眾號文章永久鏈接
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息
固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url)
# 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content
with open("urli.jpg", "wb") as f:
f.write(url_img)
# f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//div[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i)
# 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"]
except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"]
if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10)
# time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s)
# time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name}) 查看全部
python爬取搜狗微信公眾號文章永久鏈接(圖)
python爬取搜狗微信公眾號文章永久鏈接
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息




固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url)
# 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content
with open("urli.jpg", "wb") as f:
f.write(url_img)
# f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//div[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i)
# 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"]
except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"]
if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10)
# time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s)
# time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
搜狗微信上當天信息排名指定輸入關(guān)鍵字怎么做?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 116 次瀏覽 ? 2021-07-04 03:22
這個(gè)文章主要介紹python如何抓取搜狗微信公眾號文章永久鏈接。小編覺(jué)得還不錯?,F在分享給大家,給大家一個(gè)參考。跟著(zhù)小編一起來(lái)看看吧。
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息
固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url) # 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i) # 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公眾號文章permanent鏈接的詳細內容。更多詳情請關(guān)注Gxl其他相關(guān)文章! 查看全部
搜狗微信上當天信息排名指定輸入關(guān)鍵字怎么做?
這個(gè)文章主要介紹python如何抓取搜狗微信公眾號文章永久鏈接。小編覺(jué)得還不錯?,F在分享給大家,給大家一個(gè)參考。跟著(zhù)小編一起來(lái)看看吧。
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息




固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url) # 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i) # 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公眾號文章permanent鏈接的詳細內容。更多詳情請關(guān)注Gxl其他相關(guān)文章!
不用提交詞典的方法用的是該方法合并詞典
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 118 次瀏覽 ? 2021-07-01 04:02
querylist采集微信公眾號文章推薦信息的時(shí)候,只要把詞匯前綴去掉就可以得到這個(gè)關(guān)鍵詞的取值了。所以你上面那句代碼的問(wèn)題應該是還沒(méi)有去掉詞匯前綴。search_vars=preg_match_search(filter_variable,capsule_example)然后就去查對應關(guān)鍵詞對應的詞典了。
取出搜索值search_vars查詞匯對應的詞典這樣子
python有一個(gè)filter_variable參數可以滿(mǎn)足題主需求,
直接在循環(huán)里面遞歸查吧。querylist+groupby不推薦。最終結果一定要合并詞典,
再從詞庫里查詞,
python+matplotlib=不會(huì )遞歸你還在這里折騰干嘛!推薦個(gè)工具:支持第三方庫的運行器spidercreate_class
pipinstallsort_url
其實(shí)都可以用knn來(lái)滿(mǎn)足要求,不過(guò)可能all_capital指定了一個(gè)區間。
importmatplotlib.pyplotaspltfromfilter_mapimportsort_urls
補充一個(gè)可以用groupby實(shí)現,需要自己編程實(shí)現,這是我上課時(shí)候自己寫(xiě)的例子,實(shí)際運行效果,每一步都會(huì )記錄詞頻sort_urls_with_idx:#一個(gè)列表,分別是每個(gè)關(guān)鍵詞出現的概率defsort_urls(url,idx):#不用提交詞典bot=sort_urls(url,idx)whiletrue:#以下每個(gè)關(guān)鍵詞window=idx。
pop()count_urls=idx[0]comment=idx[1]window=[idx[0],idx[1]]print(window。extend(range(。
4),window.size,even(numberofrange(1,1
0),numberofnumberofnumberofnumberofspecified_urls)))print(window.extend(range
4),range(1,1
0),even(numberofnumberofnumberofspecified_urls)))returncomment現在查詞頻的方法用的是該方法,然后jieba,一般也要數據格式化,當然,也可以用,不用記錄語(yǔ)料內容, 查看全部
不用提交詞典的方法用的是該方法合并詞典
querylist采集微信公眾號文章推薦信息的時(shí)候,只要把詞匯前綴去掉就可以得到這個(gè)關(guān)鍵詞的取值了。所以你上面那句代碼的問(wèn)題應該是還沒(méi)有去掉詞匯前綴。search_vars=preg_match_search(filter_variable,capsule_example)然后就去查對應關(guān)鍵詞對應的詞典了。
取出搜索值search_vars查詞匯對應的詞典這樣子
python有一個(gè)filter_variable參數可以滿(mǎn)足題主需求,
直接在循環(huán)里面遞歸查吧。querylist+groupby不推薦。最終結果一定要合并詞典,
再從詞庫里查詞,
python+matplotlib=不會(huì )遞歸你還在這里折騰干嘛!推薦個(gè)工具:支持第三方庫的運行器spidercreate_class
pipinstallsort_url
其實(shí)都可以用knn來(lái)滿(mǎn)足要求,不過(guò)可能all_capital指定了一個(gè)區間。
importmatplotlib.pyplotaspltfromfilter_mapimportsort_urls
補充一個(gè)可以用groupby實(shí)現,需要自己編程實(shí)現,這是我上課時(shí)候自己寫(xiě)的例子,實(shí)際運行效果,每一步都會(huì )記錄詞頻sort_urls_with_idx:#一個(gè)列表,分別是每個(gè)關(guān)鍵詞出現的概率defsort_urls(url,idx):#不用提交詞典bot=sort_urls(url,idx)whiletrue:#以下每個(gè)關(guān)鍵詞window=idx。
pop()count_urls=idx[0]comment=idx[1]window=[idx[0],idx[1]]print(window。extend(range(。
4),window.size,even(numberofrange(1,1
0),numberofnumberofnumberofnumberofspecified_urls)))print(window.extend(range
4),range(1,1
0),even(numberofnumberofnumberofspecified_urls)))returncomment現在查詞頻的方法用的是該方法,然后jieba,一般也要數據格式化,當然,也可以用,不用記錄語(yǔ)料內容,
下篇文章:python爬蟲(chóng)如何爬取微信公眾號文章(二)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 107 次瀏覽 ? 2021-06-23 21:35
第二部分文章:python爬蟲(chóng)如何抓取微信公眾號文章(二)
下一篇如何連接python爬蟲(chóng)實(shí)現微信公眾號文章每日推送
因為最近在法庭實(shí)習,需要一些公眾號資料,然后做成網(wǎng)頁(yè)展示,方便查看。之前寫(xiě)過(guò)一些爬蟲(chóng),但是都是爬網(wǎng)站數據。這一次本以為會(huì )很容易,但是遇到了很多麻煩。分享給大家。
1、 使用爬蟲(chóng)爬取數據最基本也是最重要的一點(diǎn)就是找到目標網(wǎng)站的url地址,然后遍歷地址一個(gè)一個(gè)或者多線(xiàn)程爬取。一般后續的爬取地址主要有兩種獲取方式,一種是根據頁(yè)面分頁(yè)計算出URL地址的規律,通常后跟參數page=num,另一種是過(guò)濾掉當前的標簽頁(yè)面,取出URL作為后續的爬取地址。遺憾的是,這兩種方法都不能在微信公眾號中使用。原因是公眾號的文章地址之間沒(méi)有關(guān)聯(lián),不可能通過(guò)一個(gè)文章地址找到所有文章地址。
2、 那我們如何獲取公眾號文章地址的歷史記錄呢?一種方法是通過(guò)搜狗微信網(wǎng)站搜索目標公眾號,可以看到最近的文章,但只是最近的無(wú)法獲取歷史文章。如果你想每天爬一次,可以用這個(gè)方法每天爬一個(gè)。圖片是這樣的:
3、當然了,我們需要的結果很多,所以還是得想辦法把所有的歷史文本都弄出來(lái),廢話(huà)少說(shuō),直入正題:
首先要注冊一個(gè)微信公眾號(訂閱號),可以注冊個(gè)人,比較簡(jiǎn)單,步驟網(wǎng)上都有,這里就不介紹了。 (如果之前有的話(huà),就不需要注冊了)
注冊后,登錄微信公眾平臺,在首頁(yè)左欄的管理下,有一個(gè)素材管理,如圖:
點(diǎn)擊素材管理,然后選擇圖文信息,然后點(diǎn)擊右側新建圖文素材:
轉到新頁(yè)面并單擊頂部的超鏈接:
然后在彈窗中選擇查找文章,輸入要爬取的公眾號名稱(chēng),搜索:
然后點(diǎn)擊搜索到的公眾號,可以看到它的所有歷史文章:
4、找到history文章后,我們如何編寫(xiě)一個(gè)程序來(lái)獲取所有的URL地址? ,首先我們來(lái)分析一下瀏覽器在點(diǎn)擊公眾號名稱(chēng)時(shí)做了什么,調出查看頁(yè)面,點(diǎn)擊網(wǎng)絡(luò ),先清除所有數據,然后點(diǎn)擊目標公眾號,可以看到如下界面:
點(diǎn)擊字符串后,再點(diǎn)擊標題:
找到將軍。這里的Request Url就是我們的程序需要請求的地址格式。我們需要把它拼接起來(lái)。里面的參數在下面的Query String Parameters里面比較清楚:
這些參數的含義很容易理解。唯一需要說(shuō)明的是,fakeid 是公眾號的唯一標識。每個(gè)官方賬號都不一樣。如果爬取其他公眾號,只需要修改這個(gè)參數即可。隨機可以省略。
另外一個(gè)重要的部分是Request Headers,里面收錄了cookie、User-Agent等重要信息,在下面的代碼中會(huì )用到:
5、 經(jīng)過(guò)以上分析,就可以開(kāi)始寫(xiě)代碼了。
需要的第一個(gè)參數:
#目標urlurl = "./cgi-bin/appmsg"#使用cookies,跳過(guò)登錄操作headers = {"Cookie": "ua_id=YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU=; pgv_pvi=232_58780000000bRx0cVU=; pgv_pvi=232_58780000000000a = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39SU7awJMxhDVb4AbVXJM =; mm_lang = zh_CN的 “” 用戶(hù)代理 “:” 的Mozilla / 5
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}
根據自己的cookie和token進(jìn)行修改,然后發(fā)送請求獲取響應,去掉每個(gè)文章的title和url,代碼如下:
content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers = headers, params=data).json() # 返回一個(gè)json,里面收錄content_json["app_msg_list"]中item每頁(yè)的數據:#提取每頁(yè)的標題文章和對應的url items = [ ] items.append(item["title"]) items.append(item["link"]) content_list.append(items)
第一個(gè) for 循環(huán)是抓取的頁(yè)面數。首先需要看好公眾號歷史記錄文章列表中的總頁(yè)數。這個(gè)數字只能小于頁(yè)數。更改數據["begin"],表示從前幾條開(kāi)始,每次5條,注意爬取太多和太頻繁,否則會(huì )被ip和cookies攔截,嚴重的話(huà),公眾號會(huì )被封號的,請多多關(guān)照。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .被屏蔽了。
然后按如下方式保存標題和網(wǎng)址:
name=["title","link"]test=pd.DataFrame(columns=name,data=content_list)test.to_csv("XXX.csv",mode="a",encoding="utf-8 ")print("保存成功")
完整的程序如下:
# -*- coding: utf-8 -*-import requestsimport timeimport csvimport pandas as pd# Target urlurl = "./cgi-bin/appmsg"# 使用cookies跳過(guò)登錄操作 headers = { “曲奇”:“ua_id = YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU =; pgv_pvi = 2045358080; pgv_si = s4132856832; UUID = 48da56b488e5c697909a13dfac91a819; bizuin = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%40smail.nju。 ; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39S U7awJMxhDVb4AbVXJM =; mm_lang = zh_CN "," User-Agent ":" Mozilla / 5 .
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers=headers, params=data).json() # 返回一個(gè)json,里面收錄每個(gè)頁(yè)面的數據for item in content_json["app_msg_list"]: # 提取每個(gè)頁(yè)面的標題文章和對應的url items = [] items.
append(item["title"]) 項。追加(項目[“鏈接”])內容列表。 append(items) print(i)name=["title","link"]test=pd.數據幀(列=名稱(chēng),數據=內容列表)測試。 to_csv("xingzhengzhifa.csv",mode="a",encoding="utf-8")print("保存成功")
最后保存的文件如圖:
獲取每個(gè)文章的url后,可以遍歷爬取每個(gè)文章的內容。關(guān)于爬取文章內容的部分將在下一篇博文中介紹。
補充內容:
關(guān)于如何從小伙伴那里獲取文章封面圖片和摘要的問(wèn)題,查看瀏覽器可以看到返回的json數據中收錄了很多信息,包括封面圖片和摘要
只需要 items.append(item["digest"]) 來(lái)保存文章summary。其他字段如發(fā)布時(shí)間可獲取。
關(guān)于獲取閱讀數和點(diǎn)贊數的問(wèn)題,沒(méi)有辦法通過(guò)本題的方法獲取,因為網(wǎng)頁(yè)公眾號文章沒(méi)有閱讀數以及點(diǎn)贊數。這需要使用電腦版微信或者手機版微信通過(guò)抓包工具獲取。
關(guān)于ip代理,統計頁(yè)數,多次保存,我在公眾號文章中介紹過(guò),有需要的可以看看 查看全部
下篇文章:python爬蟲(chóng)如何爬取微信公眾號文章(二)
第二部分文章:python爬蟲(chóng)如何抓取微信公眾號文章(二)
下一篇如何連接python爬蟲(chóng)實(shí)現微信公眾號文章每日推送
因為最近在法庭實(shí)習,需要一些公眾號資料,然后做成網(wǎng)頁(yè)展示,方便查看。之前寫(xiě)過(guò)一些爬蟲(chóng),但是都是爬網(wǎng)站數據。這一次本以為會(huì )很容易,但是遇到了很多麻煩。分享給大家。
1、 使用爬蟲(chóng)爬取數據最基本也是最重要的一點(diǎn)就是找到目標網(wǎng)站的url地址,然后遍歷地址一個(gè)一個(gè)或者多線(xiàn)程爬取。一般后續的爬取地址主要有兩種獲取方式,一種是根據頁(yè)面分頁(yè)計算出URL地址的規律,通常后跟參數page=num,另一種是過(guò)濾掉當前的標簽頁(yè)面,取出URL作為后續的爬取地址。遺憾的是,這兩種方法都不能在微信公眾號中使用。原因是公眾號的文章地址之間沒(méi)有關(guān)聯(lián),不可能通過(guò)一個(gè)文章地址找到所有文章地址。
2、 那我們如何獲取公眾號文章地址的歷史記錄呢?一種方法是通過(guò)搜狗微信網(wǎng)站搜索目標公眾號,可以看到最近的文章,但只是最近的無(wú)法獲取歷史文章。如果你想每天爬一次,可以用這個(gè)方法每天爬一個(gè)。圖片是這樣的:
3、當然了,我們需要的結果很多,所以還是得想辦法把所有的歷史文本都弄出來(lái),廢話(huà)少說(shuō),直入正題:
首先要注冊一個(gè)微信公眾號(訂閱號),可以注冊個(gè)人,比較簡(jiǎn)單,步驟網(wǎng)上都有,這里就不介紹了。 (如果之前有的話(huà),就不需要注冊了)
注冊后,登錄微信公眾平臺,在首頁(yè)左欄的管理下,有一個(gè)素材管理,如圖:
點(diǎn)擊素材管理,然后選擇圖文信息,然后點(diǎn)擊右側新建圖文素材:
轉到新頁(yè)面并單擊頂部的超鏈接:
然后在彈窗中選擇查找文章,輸入要爬取的公眾號名稱(chēng),搜索:
然后點(diǎn)擊搜索到的公眾號,可以看到它的所有歷史文章:
4、找到history文章后,我們如何編寫(xiě)一個(gè)程序來(lái)獲取所有的URL地址? ,首先我們來(lái)分析一下瀏覽器在點(diǎn)擊公眾號名稱(chēng)時(shí)做了什么,調出查看頁(yè)面,點(diǎn)擊網(wǎng)絡(luò ),先清除所有數據,然后點(diǎn)擊目標公眾號,可以看到如下界面:
點(diǎn)擊字符串后,再點(diǎn)擊標題:
找到將軍。這里的Request Url就是我們的程序需要請求的地址格式。我們需要把它拼接起來(lái)。里面的參數在下面的Query String Parameters里面比較清楚:
這些參數的含義很容易理解。唯一需要說(shuō)明的是,fakeid 是公眾號的唯一標識。每個(gè)官方賬號都不一樣。如果爬取其他公眾號,只需要修改這個(gè)參數即可。隨機可以省略。
另外一個(gè)重要的部分是Request Headers,里面收錄了cookie、User-Agent等重要信息,在下面的代碼中會(huì )用到:
5、 經(jīng)過(guò)以上分析,就可以開(kāi)始寫(xiě)代碼了。
需要的第一個(gè)參數:
#目標urlurl = "./cgi-bin/appmsg"#使用cookies,跳過(guò)登錄操作headers = {"Cookie": "ua_id=YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU=; pgv_pvi=232_58780000000bRx0cVU=; pgv_pvi=232_58780000000000a = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39SU7awJMxhDVb4AbVXJM =; mm_lang = zh_CN的 “” 用戶(hù)代理 “:” 的Mozilla / 5
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}
根據自己的cookie和token進(jìn)行修改,然后發(fā)送請求獲取響應,去掉每個(gè)文章的title和url,代碼如下:
content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers = headers, params=data).json() # 返回一個(gè)json,里面收錄content_json["app_msg_list"]中item每頁(yè)的數據:#提取每頁(yè)的標題文章和對應的url items = [ ] items.append(item["title"]) items.append(item["link"]) content_list.append(items)
第一個(gè) for 循環(huán)是抓取的頁(yè)面數。首先需要看好公眾號歷史記錄文章列表中的總頁(yè)數。這個(gè)數字只能小于頁(yè)數。更改數據["begin"],表示從前幾條開(kāi)始,每次5條,注意爬取太多和太頻繁,否則會(huì )被ip和cookies攔截,嚴重的話(huà),公眾號會(huì )被封號的,請多多關(guān)照。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .被屏蔽了。
然后按如下方式保存標題和網(wǎng)址:
name=["title","link"]test=pd.DataFrame(columns=name,data=content_list)test.to_csv("XXX.csv",mode="a",encoding="utf-8 ")print("保存成功")
完整的程序如下:
# -*- coding: utf-8 -*-import requestsimport timeimport csvimport pandas as pd# Target urlurl = "./cgi-bin/appmsg"# 使用cookies跳過(guò)登錄操作 headers = { “曲奇”:“ua_id = YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU =; pgv_pvi = 2045358080; pgv_si = s4132856832; UUID = 48da56b488e5c697909a13dfac91a819; bizuin = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%40smail.nju。 ; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39S U7awJMxhDVb4AbVXJM =; mm_lang = zh_CN "," User-Agent ":" Mozilla / 5 .
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers=headers, params=data).json() # 返回一個(gè)json,里面收錄每個(gè)頁(yè)面的數據for item in content_json["app_msg_list"]: # 提取每個(gè)頁(yè)面的標題文章和對應的url items = [] items.
append(item["title"]) 項。追加(項目[“鏈接”])內容列表。 append(items) print(i)name=["title","link"]test=pd.數據幀(列=名稱(chēng),數據=內容列表)測試。 to_csv("xingzhengzhifa.csv",mode="a",encoding="utf-8")print("保存成功")
最后保存的文件如圖:
獲取每個(gè)文章的url后,可以遍歷爬取每個(gè)文章的內容。關(guān)于爬取文章內容的部分將在下一篇博文中介紹。
補充內容:
關(guān)于如何從小伙伴那里獲取文章封面圖片和摘要的問(wèn)題,查看瀏覽器可以看到返回的json數據中收錄了很多信息,包括封面圖片和摘要
只需要 items.append(item["digest"]) 來(lái)保存文章summary。其他字段如發(fā)布時(shí)間可獲取。
關(guān)于獲取閱讀數和點(diǎn)贊數的問(wèn)題,沒(méi)有辦法通過(guò)本題的方法獲取,因為網(wǎng)頁(yè)公眾號文章沒(méi)有閱讀數以及點(diǎn)贊數。這需要使用電腦版微信或者手機版微信通過(guò)抓包工具獲取。
關(guān)于ip代理,統計頁(yè)數,多次保存,我在公眾號文章中介紹過(guò),有需要的可以看看
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 144 次瀏覽 ? 2021-06-22 01:35
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
public void getMsgExt(String str,String url) {
// TODO Auto-generated method stub
String biz = "";
String sn = "";
Map queryStrs = HttpUrlParser.parseUrl(url);
if(queryStrs != null){
biz = queryStrs.get("__biz");
biz = biz + "==";
sn = queryStrs.get("sn");
sn = "%" + sn + "%";
}
/**
* $sql = "select * from `文章表` where `biz`='".$biz."'
* and `content_url` like '%".$sn."%'" limit 0,1;
* 根據biz和sn找到對應的文章
*/
Post post = postMapper.selectByBizAndSn(biz, sn);
if(post == null){
System.out.println("biz:"+biz);
System.out.println("sn:"+sn);
tmpListMapper.deleteByLoad(1);
return;
}
// System.out.println("json數據:"+str);
Integer read_num;
Integer like_num;
try{
read_num = JsonPath.read(str, "['appmsgstat']['read_num']");//閱讀量
like_num = JsonPath.read(str, "['appmsgstat']['like_num']");//點(diǎn)贊量
}catch(Exception e){
read_num = 123;//閱讀量
like_num = 321;//點(diǎn)贊量
System.out.println("read_num:"+read_num);
System.out.println("like_num:"+like_num);
System.out.println(e.getMessage());
}
/**
* 在這里同樣根據sn在采集隊列表中刪除對應的文章,代表這篇文章可以移出采集隊列了
* $sql = "delete from `隊列表` where `content_url` like '%".$sn."%'"
*/
tmpListMapper.deleteBySn(sn);
//然后將閱讀量和點(diǎn)贊量更新到文章表中。
post.setReadnum(read_num);
post.setLikenum(like_num);
postMapper.updateByPrimaryKey(post);
}
通過(guò)處理跳轉將js注入微信的方法:
public String getWxHis() {
String url = "";
// TODO Auto-generated method stub
/**
* 當前頁(yè)面為公眾號歷史消息時(shí),讀取這個(gè)程序
* 在采集隊列表中有一個(gè)load字段,當值等于1時(shí)代表正在被讀取
* 首先刪除采集隊列表中load=1的行
* 然后從隊列表中任意select一行
*/
tmpListMapper.deleteByLoad(1);
TmpList queue = tmpListMapper.selectRandomOne();
System.out.println("queue is null?"+queue);
if(queue == null){//隊列表為空
/**
* 隊列表如果空了,就從存儲公眾號biz的表中取得一個(gè)biz,
* 這里我在公眾號表中設置了一個(gè)采集時(shí)間的time字段,按照正序排列之后,
* 就得到時(shí)間戳最小的一個(gè)公眾號記錄,并取得它的biz
*/
WeiXin weiXin = weiXinMapper.selectOne();
String biz = weiXin.getBiz();
url = "https://mp.weixin.qq.com/mp/pr ... ot%3B + biz +
"#wechat_redirect";//拼接公眾號歷史消息url地址(第二種頁(yè)面形式)
//更新剛才提到的公眾號表中的采集時(shí)間time字段為當前時(shí)間戳。
weiXin.setCollect(System.currentTimeMillis());
int result = weiXinMapper.updateByPrimaryKey(weiXin);
System.out.println("getHis weiXin updateResult:"+result);
}else{
//取得當前這一行的content_url字段
url = queue.getContentUrl();
//將load字段update為1
tmpListMapper.updateByContentUrl(url);
}
//將下一個(gè)將要跳轉的$url變成js腳本,由anyproxy注入到微信頁(yè)面中。
//echo "setTimeout(function(){window.location.href='".$url."';},2000);";
int randomTime = new Random().nextInt(3) + 3;
String jsCode = "setTimeout(function(){window.location.href='"+url+"';},"+randomTime*1000+");";
return jsCode;
}
以上是對代理服務(wù)器截獲的數據進(jìn)行處理的流程。有一個(gè)問(wèn)題需要注意。程序會(huì )循環(huán)訪(fǎng)問(wèn)數據庫中的每個(gè)收錄公眾號,甚至會(huì )再次訪(fǎng)問(wèn)存儲的文章,以不斷更新文章Count和like count的讀數。如果需要抓大量公眾號,建議修改添加任務(wù)隊列的代碼,添加條件限制。否則,公眾號多輪重復抓取數據會(huì )極大影響效率。
到目前為止,我們已經(jīng)抓取了微信公眾號的所有文章鏈接,并且這個(gè)鏈接是一個(gè)可以在瀏覽器中打開(kāi)的永久鏈接。下一步就是編寫(xiě)爬蟲(chóng)程序,從數據庫中抓取鏈接,爬取文章內容等信息。
我用webmagic寫(xiě)了一個(gè)爬蟲(chóng),輕量級好用。
public class SpiderModel implements PageProcessor{
private static PostMapper postMapper;
private static List posts;
// 抓取網(wǎng)站的相關(guān)配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
// TODO Auto-generated method stub
return this.site;
}
public void process(Page page) {
// TODO Auto-generated method stub
Post post = posts.remove(0);
String content = page.getHtml().xpath("//div[@id='js_content']").get();
//存在和諧文章 此處做判定如果有直接刪除記錄或設置表示位表示文章被和諧
if(content == null){
System.out.println("文章已和諧!");
//postMapper.deleteByPrimaryKey(post.getId());
return;
}
String contentSnap = content.replaceAll("data-src", "src").replaceAll("preview.html", "player.html");//快照
String contentTxt = HtmlToWord.stripHtml(content);//純文本內容
Selectable metaContent = page.getHtml().xpath("//div[@id='meta_content']");
String pubTime = null;
String wxname = null;
String author = null;
if(metaContent != null){
pubTime = metaContent.xpath("//em[@id='post-date']").get();
if(pubTime != null){
pubTime = HtmlToWord.stripHtml(pubTime);//文章發(fā)布時(shí)間
}
wxname = metaContent.xpath("//a[@id='post-user']").get();
if(wxname != null){
wxname = HtmlToWord.stripHtml(wxname);//公眾號名稱(chēng)
}
author = metaContent.xpath("//em[@class='rich_media_meta rich_media_meta_text' and @id!='post-date']").get();
if(author != null){
author = HtmlToWord.stripHtml(author);//文章作者
}
}
// System.out.println("發(fā)布時(shí)間:"+pubTime);
// System.out.println("公眾號名稱(chēng):"+wxname);
// System.out.println("文章作者:"+author);
String title = post.getTitle().replaceAll("?", "");//文章標題
String digest = post.getDigest();//文章摘要
int likeNum = post.getLikenum();//文章點(diǎn)贊數
int readNum = post.getReadnum();//文章閱讀數
String contentUrl = post.getContentUrl();//文章鏈接
WechatInfoBean wechatBean = new WechatInfoBean();
wechatBean.setTitle(title);
wechatBean.setContent(contentTxt);//純文本內容
wechatBean.setSourceCode(contentSnap);//快照
wechatBean.setLikeCount(likeNum);
wechatBean.setViewCount(readNum);
wechatBean.setAbstractText(digest);//摘要
wechatBean.setUrl(contentUrl);
wechatBean.setPublishTime(pubTime);
wechatBean.setSiteName(wxname);//站點(diǎn)名稱(chēng) 公眾號名稱(chēng)
wechatBean.setAuthor(author);
wechatBean.setMediaType("微信公眾號");//來(lái)源媒體類(lèi)型
WechatStorage.saveWechatInfo(wechatBean);
//標示文章已經(jīng)被爬取
post.setIsSpider(1);
postMapper.updateByPrimaryKey(post);
}
public static void startSpider(List inposts,PostMapper myPostMapper,String... urls){
long startTime, endTime;
startTime = System.currentTimeMillis();
postMapper = myPostMapper;
posts = inposts;
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
SpiderModel spiderModel = new SpiderModel();
Spider mySpider = Spider.create(spiderModel).addUrl(urls);
mySpider.setDownloader(httpClientDownloader);
try {
SpiderMonitor.instance().register(mySpider);
mySpider.thread(1).run();
} catch (JMException e) {
e.printStackTrace();
}
endTime = System.currentTimeMillis();
System.out.println("爬取時(shí)間" + ((endTime - startTime) / 1000) + "秒--");
}
}
其他與邏輯無(wú)關(guān)的數據存儲代碼將不再發(fā)布。這里我將代理服務(wù)器抓取的數據存放在mysql中,將我的爬蟲(chóng)程序抓取到的數據存放在mongodb中。
以下是我爬取的公眾號信息:
查看全部
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
public void getMsgExt(String str,String url) {
// TODO Auto-generated method stub
String biz = "";
String sn = "";
Map queryStrs = HttpUrlParser.parseUrl(url);
if(queryStrs != null){
biz = queryStrs.get("__biz");
biz = biz + "==";
sn = queryStrs.get("sn");
sn = "%" + sn + "%";
}
/**
* $sql = "select * from `文章表` where `biz`='".$biz."'
* and `content_url` like '%".$sn."%'" limit 0,1;
* 根據biz和sn找到對應的文章
*/
Post post = postMapper.selectByBizAndSn(biz, sn);
if(post == null){
System.out.println("biz:"+biz);
System.out.println("sn:"+sn);
tmpListMapper.deleteByLoad(1);
return;
}
// System.out.println("json數據:"+str);
Integer read_num;
Integer like_num;
try{
read_num = JsonPath.read(str, "['appmsgstat']['read_num']");//閱讀量
like_num = JsonPath.read(str, "['appmsgstat']['like_num']");//點(diǎn)贊量
}catch(Exception e){
read_num = 123;//閱讀量
like_num = 321;//點(diǎn)贊量
System.out.println("read_num:"+read_num);
System.out.println("like_num:"+like_num);
System.out.println(e.getMessage());
}
/**
* 在這里同樣根據sn在采集隊列表中刪除對應的文章,代表這篇文章可以移出采集隊列了
* $sql = "delete from `隊列表` where `content_url` like '%".$sn."%'"
*/
tmpListMapper.deleteBySn(sn);
//然后將閱讀量和點(diǎn)贊量更新到文章表中。
post.setReadnum(read_num);
post.setLikenum(like_num);
postMapper.updateByPrimaryKey(post);
}
通過(guò)處理跳轉將js注入微信的方法:
public String getWxHis() {
String url = "";
// TODO Auto-generated method stub
/**
* 當前頁(yè)面為公眾號歷史消息時(shí),讀取這個(gè)程序
* 在采集隊列表中有一個(gè)load字段,當值等于1時(shí)代表正在被讀取
* 首先刪除采集隊列表中load=1的行
* 然后從隊列表中任意select一行
*/
tmpListMapper.deleteByLoad(1);
TmpList queue = tmpListMapper.selectRandomOne();
System.out.println("queue is null?"+queue);
if(queue == null){//隊列表為空
/**
* 隊列表如果空了,就從存儲公眾號biz的表中取得一個(gè)biz,
* 這里我在公眾號表中設置了一個(gè)采集時(shí)間的time字段,按照正序排列之后,
* 就得到時(shí)間戳最小的一個(gè)公眾號記錄,并取得它的biz
*/
WeiXin weiXin = weiXinMapper.selectOne();
String biz = weiXin.getBiz();
url = "https://mp.weixin.qq.com/mp/pr ... ot%3B + biz +
"#wechat_redirect";//拼接公眾號歷史消息url地址(第二種頁(yè)面形式)
//更新剛才提到的公眾號表中的采集時(shí)間time字段為當前時(shí)間戳。
weiXin.setCollect(System.currentTimeMillis());
int result = weiXinMapper.updateByPrimaryKey(weiXin);
System.out.println("getHis weiXin updateResult:"+result);
}else{
//取得當前這一行的content_url字段
url = queue.getContentUrl();
//將load字段update為1
tmpListMapper.updateByContentUrl(url);
}
//將下一個(gè)將要跳轉的$url變成js腳本,由anyproxy注入到微信頁(yè)面中。
//echo "setTimeout(function(){window.location.href='".$url."';},2000);";
int randomTime = new Random().nextInt(3) + 3;
String jsCode = "setTimeout(function(){window.location.href='"+url+"';},"+randomTime*1000+");";
return jsCode;
}
以上是對代理服務(wù)器截獲的數據進(jìn)行處理的流程。有一個(gè)問(wèn)題需要注意。程序會(huì )循環(huán)訪(fǎng)問(wèn)數據庫中的每個(gè)收錄公眾號,甚至會(huì )再次訪(fǎng)問(wèn)存儲的文章,以不斷更新文章Count和like count的讀數。如果需要抓大量公眾號,建議修改添加任務(wù)隊列的代碼,添加條件限制。否則,公眾號多輪重復抓取數據會(huì )極大影響效率。
到目前為止,我們已經(jīng)抓取了微信公眾號的所有文章鏈接,并且這個(gè)鏈接是一個(gè)可以在瀏覽器中打開(kāi)的永久鏈接。下一步就是編寫(xiě)爬蟲(chóng)程序,從數據庫中抓取鏈接,爬取文章內容等信息。
我用webmagic寫(xiě)了一個(gè)爬蟲(chóng),輕量級好用。
public class SpiderModel implements PageProcessor{
private static PostMapper postMapper;
private static List posts;
// 抓取網(wǎng)站的相關(guān)配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
// TODO Auto-generated method stub
return this.site;
}
public void process(Page page) {
// TODO Auto-generated method stub
Post post = posts.remove(0);
String content = page.getHtml().xpath("//div[@id='js_content']").get();
//存在和諧文章 此處做判定如果有直接刪除記錄或設置表示位表示文章被和諧
if(content == null){
System.out.println("文章已和諧!");
//postMapper.deleteByPrimaryKey(post.getId());
return;
}
String contentSnap = content.replaceAll("data-src", "src").replaceAll("preview.html", "player.html");//快照
String contentTxt = HtmlToWord.stripHtml(content);//純文本內容
Selectable metaContent = page.getHtml().xpath("//div[@id='meta_content']");
String pubTime = null;
String wxname = null;
String author = null;
if(metaContent != null){
pubTime = metaContent.xpath("//em[@id='post-date']").get();
if(pubTime != null){
pubTime = HtmlToWord.stripHtml(pubTime);//文章發(fā)布時(shí)間
}
wxname = metaContent.xpath("//a[@id='post-user']").get();
if(wxname != null){
wxname = HtmlToWord.stripHtml(wxname);//公眾號名稱(chēng)
}
author = metaContent.xpath("//em[@class='rich_media_meta rich_media_meta_text' and @id!='post-date']").get();
if(author != null){
author = HtmlToWord.stripHtml(author);//文章作者
}
}
// System.out.println("發(fā)布時(shí)間:"+pubTime);
// System.out.println("公眾號名稱(chēng):"+wxname);
// System.out.println("文章作者:"+author);
String title = post.getTitle().replaceAll("?", "");//文章標題
String digest = post.getDigest();//文章摘要
int likeNum = post.getLikenum();//文章點(diǎn)贊數
int readNum = post.getReadnum();//文章閱讀數
String contentUrl = post.getContentUrl();//文章鏈接
WechatInfoBean wechatBean = new WechatInfoBean();
wechatBean.setTitle(title);
wechatBean.setContent(contentTxt);//純文本內容
wechatBean.setSourceCode(contentSnap);//快照
wechatBean.setLikeCount(likeNum);
wechatBean.setViewCount(readNum);
wechatBean.setAbstractText(digest);//摘要
wechatBean.setUrl(contentUrl);
wechatBean.setPublishTime(pubTime);
wechatBean.setSiteName(wxname);//站點(diǎn)名稱(chēng) 公眾號名稱(chēng)
wechatBean.setAuthor(author);
wechatBean.setMediaType("微信公眾號");//來(lái)源媒體類(lèi)型
WechatStorage.saveWechatInfo(wechatBean);
//標示文章已經(jīng)被爬取
post.setIsSpider(1);
postMapper.updateByPrimaryKey(post);
}
public static void startSpider(List inposts,PostMapper myPostMapper,String... urls){
long startTime, endTime;
startTime = System.currentTimeMillis();
postMapper = myPostMapper;
posts = inposts;
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
SpiderModel spiderModel = new SpiderModel();
Spider mySpider = Spider.create(spiderModel).addUrl(urls);
mySpider.setDownloader(httpClientDownloader);
try {
SpiderMonitor.instance().register(mySpider);
mySpider.thread(1).run();
} catch (JMException e) {
e.printStackTrace();
}
endTime = System.currentTimeMillis();
System.out.println("爬取時(shí)間" + ((endTime - startTime) / 1000) + "秒--");
}
}
其他與邏輯無(wú)關(guān)的數據存儲代碼將不再發(fā)布。這里我將代理服務(wù)器抓取的數據存放在mysql中,將我的爬蟲(chóng)程序抓取到的數據存放在mongodb中。
以下是我爬取的公眾號信息:


querylist采集微信公眾號文章,可以這樣:生成腳本
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 304 次瀏覽 ? 2021-06-20 19:48
querylist采集微信公眾號文章,可以這樣:1.webqq登錄公眾號后臺,授權2.選擇webqq選項,然后上傳圖片到服務(wù)器生成webqqpost對象3.獲取webqqpost對象實(shí)現抓包分析,分析公眾號后臺,
你自己也可以采集-no-can-source/index.html
主要需要:apikey生成腳本(抓包app分析包,endgame中抓包找到的唯一標識,
可以自己抓,
querylistapi
querylist關(guān)注公眾號里面的文章,如果有回復消息后,就可以獲取采集結果,
可以采集微信公眾號的文章,也可以根據搜索內容判斷,我覺(jué)得不過(guò)這個(gè)做成網(wǎng)站,必須要有微信開(kāi)放接口,比如服務(wù)號,或者公眾號在微信平臺有實(shí)名認證,具有一定的權限,就可以接入querylistapi,就可以接入微信公眾號采集流程,只要網(wǎng)站有接入querylistapi的功能,就可以實(shí)現,樓主可以看看杭州數云網(wǎng)絡(luò )這家公司不錯,有接入querylistapi。
我想知道為什么會(huì )有這樣的采集需求?querylist是公眾號文章對接的接口,好多公眾號是自己的app,可以以app應用形式接入即可,另外題主也可以試試草料二維碼平臺,也有類(lèi)似需求,這是我之前用他接的訂閱號文章。 查看全部
querylist采集微信公眾號文章,可以這樣:生成腳本
querylist采集微信公眾號文章,可以這樣:1.webqq登錄公眾號后臺,授權2.選擇webqq選項,然后上傳圖片到服務(wù)器生成webqqpost對象3.獲取webqqpost對象實(shí)現抓包分析,分析公眾號后臺,
你自己也可以采集-no-can-source/index.html
主要需要:apikey生成腳本(抓包app分析包,endgame中抓包找到的唯一標識,
可以自己抓,
querylistapi
querylist關(guān)注公眾號里面的文章,如果有回復消息后,就可以獲取采集結果,
可以采集微信公眾號的文章,也可以根據搜索內容判斷,我覺(jué)得不過(guò)這個(gè)做成網(wǎng)站,必須要有微信開(kāi)放接口,比如服務(wù)號,或者公眾號在微信平臺有實(shí)名認證,具有一定的權限,就可以接入querylistapi,就可以接入微信公眾號采集流程,只要網(wǎng)站有接入querylistapi的功能,就可以實(shí)現,樓主可以看看杭州數云網(wǎng)絡(luò )這家公司不錯,有接入querylistapi。
我想知道為什么會(huì )有這樣的采集需求?querylist是公眾號文章對接的接口,好多公眾號是自己的app,可以以app應用形式接入即可,另外題主也可以試試草料二維碼平臺,也有類(lèi)似需求,這是我之前用他接的訂閱號文章。
Python爬蟲(chóng)、數據分析、網(wǎng)站開(kāi)發(fā)等案例教程視頻免費在線(xiàn)觀(guān)看
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 295 次瀏覽 ? 2021-06-20 19:43
前言
本文中的文字圖片過(guò)濾網(wǎng)絡(luò )可用于學(xué)習、交流,不具有任何商業(yè)用途。如有任何問(wèn)題,請及時(shí)聯(lián)系我們處理。
Python爬蟲(chóng)、數據分析、網(wǎng)站development等案例教程視頻免費在線(xiàn)觀(guān)看
https://space.bilibili.com/523606542
基本的開(kāi)發(fā)環(huán)境。爬取兩個(gè)公眾號的文章:
1.藍光編程公眾號擁有的爬取文章
2、爬取所有關(guān)于python文章的公眾號
爬取藍光編程公眾號擁有的文章
1、登錄公眾號后點(diǎn)擊圖片和文字
2、打開(kāi)開(kāi)發(fā)者工具
3、點(diǎn)擊超鏈接
加載相關(guān)數據時(shí),有一個(gè)數據包,包括文章title、鏈接、摘要、發(fā)布時(shí)間等,您也可以選擇其他公眾號進(jìn)行抓取,但這需要您有一個(gè)微信公眾號帳戶(hù)。
添加cookie
import?pprint
import?time
import?requests
import?csv
f?=?open('青燈公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(0,?40,?5):
????url?=?f'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
????headers?=?{
????????'cookie':?'加cookie',
????????'referer':?'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=1252678642&lang=zh_CN',
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????html_data?=?response.json()
????pprint.pprint(response.json())
????lis?=?html_data['app_msg_list']
????for?li?in?lis:
????????title?=?li['title']
????????link_url?=?li['link']
????????update_time?=?li['update_time']
????????timeArray?=?time.localtime(int(update_time))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?link_url,
????????}
????????csv_writer.writerow(dit)
????????print(dit)
抓取所有關(guān)于python文章的公眾賬號
1、搜狗搜索python選擇微信
注意:如果不登錄,只能抓取前十頁(yè)數據。登錄后可以爬取2W多文章。
2.直接爬取靜態(tài)網(wǎng)頁(yè)的標題、公眾號、文章地址、發(fā)布時(shí)間。
import?time
import?requests
import?parsel
import?csv
f?=?open('公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'公眾號',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(1,?2447):
????url?=?f'https://weixin.sogou.com/weixin?query=python&_sug_type_=&s_from=input&_sug_=n&type=2&page={page}&ie=utf8'
????headers?=?{
????????'Cookie':?'自己的cookie',
????????'Host':?'weixin.sogou.com',
????????'Referer':?'https://www.sogou.com/web?query=python&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1396&sst0=1610779538290&lkt=0%2C0%2C0&sugsuv=1590216228113568&sugtime=1610779538290',
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????selector?=?parsel.Selector(response.text)
????lis?=?selector.css('.news-list?li')
????for?li?in?lis:
????????title_list?=?li.css('.txt-box?h3?a::text').getall()
????????num?=?len(title_list)
????????if?num?==?1:
????????????title_str?=?'python'?+?title_list[0]
????????else:
????????????title_str?=?'python'.join(title_list)
????????href?=?li.css('.txt-box?h3?a::attr(href)').get()
????????article_url?=?'https://weixin.sogou.com'?+?href
????????name?=?li.css('.s-p?a::text').get()
????????date?=?li.css('.s-p::attr(t)').get()
????????timeArray?=?time.localtime(int(date))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title_str,
????????????'公眾號':?name,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?article_url,
????????}
????????csv_writer.writerow(dit)
????????print(title_str,?name,?otherStyleTime,?article_url)
本文同步分享到博客“松鼠愛(ài)餅干”(CSDN)。 查看全部
Python爬蟲(chóng)、數據分析、網(wǎng)站開(kāi)發(fā)等案例教程視頻免費在線(xiàn)觀(guān)看
前言
本文中的文字圖片過(guò)濾網(wǎng)絡(luò )可用于學(xué)習、交流,不具有任何商業(yè)用途。如有任何問(wèn)題,請及時(shí)聯(lián)系我們處理。
Python爬蟲(chóng)、數據分析、網(wǎng)站development等案例教程視頻免費在線(xiàn)觀(guān)看
https://space.bilibili.com/523606542

基本的開(kāi)發(fā)環(huán)境。爬取兩個(gè)公眾號的文章:
1.藍光編程公眾號擁有的爬取文章
2、爬取所有關(guān)于python文章的公眾號
爬取藍光編程公眾號擁有的文章
1、登錄公眾號后點(diǎn)擊圖片和文字

2、打開(kāi)開(kāi)發(fā)者工具

3、點(diǎn)擊超鏈接

加載相關(guān)數據時(shí),有一個(gè)數據包,包括文章title、鏈接、摘要、發(fā)布時(shí)間等,您也可以選擇其他公眾號進(jìn)行抓取,但這需要您有一個(gè)微信公眾號帳戶(hù)。
添加cookie
import?pprint
import?time
import?requests
import?csv
f?=?open('青燈公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(0,?40,?5):
????url?=?f'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
????headers?=?{
????????'cookie':?'加cookie',
????????'referer':?'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=1252678642&lang=zh_CN',
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????html_data?=?response.json()
????pprint.pprint(response.json())
????lis?=?html_data['app_msg_list']
????for?li?in?lis:
????????title?=?li['title']
????????link_url?=?li['link']
????????update_time?=?li['update_time']
????????timeArray?=?time.localtime(int(update_time))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?link_url,
????????}
????????csv_writer.writerow(dit)
????????print(dit)
抓取所有關(guān)于python文章的公眾賬號
1、搜狗搜索python選擇微信

注意:如果不登錄,只能抓取前十頁(yè)數據。登錄后可以爬取2W多文章。
2.直接爬取靜態(tài)網(wǎng)頁(yè)的標題、公眾號、文章地址、發(fā)布時(shí)間。
import?time
import?requests
import?parsel
import?csv
f?=?open('公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'公眾號',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(1,?2447):
????url?=?f'https://weixin.sogou.com/weixin?query=python&_sug_type_=&s_from=input&_sug_=n&type=2&page={page}&ie=utf8'
????headers?=?{
????????'Cookie':?'自己的cookie',
????????'Host':?'weixin.sogou.com',
????????'Referer':?'https://www.sogou.com/web?query=python&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1396&sst0=1610779538290&lkt=0%2C0%2C0&sugsuv=1590216228113568&sugtime=1610779538290',
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????selector?=?parsel.Selector(response.text)
????lis?=?selector.css('.news-list?li')
????for?li?in?lis:
????????title_list?=?li.css('.txt-box?h3?a::text').getall()
????????num?=?len(title_list)
????????if?num?==?1:
????????????title_str?=?'python'?+?title_list[0]
????????else:
????????????title_str?=?'python'.join(title_list)
????????href?=?li.css('.txt-box?h3?a::attr(href)').get()
????????article_url?=?'https://weixin.sogou.com'?+?href
????????name?=?li.css('.s-p?a::text').get()
????????date?=?li.css('.s-p::attr(t)').get()
????????timeArray?=?time.localtime(int(date))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title_str,
????????????'公眾號':?name,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?article_url,
????????}
????????csv_writer.writerow(dit)
????????print(title_str,?name,?otherStyleTime,?article_url)

本文同步分享到博客“松鼠愛(ài)餅干”(CSDN)。
微信開(kāi)放平臺推文之類(lèi)的話(huà)考慮是否用關(guān)鍵字共享
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 126 次瀏覽 ? 2021-06-20 19:42
querylist采集微信公眾號文章textdatareader采集qq空間文章微信開(kāi)放平臺推文之類(lèi)是公司產(chǎn)品的會(huì )先成立項目組或者部門(mén)研究相關(guān)需求,分析需求是否合理。然后設計個(gè)基礎設計,寫(xiě)個(gè)helloworld。這邊所謂的人均壓力都不算大,實(shí)際上手發(fā)現沒(méi)啥。數據的話(huà)考慮是否用關(guān)鍵字共享不過(guò)也可以根據需求放一些圖片存緩存。
需要處理到瀏覽器那邊就用gulp+vuepress等。業(yè)務(wù)類(lèi)分為公眾號\移動(dòng)端\h5\微信小程序等我做的項目是用微信公眾號來(lái)測試,完全沒(méi)有開(kāi)發(fā)微信接口測試。因為功能測試不過(guò),所以把調試的功能公開(kāi)給了運營(yíng)人員,看他們自己后期的測試。最后項目開(kāi)發(fā)中段才開(kāi)始考慮量化算法。給總經(jīng)理們整點(diǎn)投票表決什么的以便安排人手。
我一般是先搞定業(yè)務(wù)問(wèn)題,然后挑戰一些很容易通過(guò)數據挖掘模型的功能。工作量因人而異,不會(huì )整天加班,看出的問(wèn)題也不會(huì )有回報。后端的話(huà)excel+hive+sql+springmvc就可以辦到。nosql這種不用考慮了,不過(guò)如果需要融合mongodb,請先給我自己買(mǎi)個(gè)mongodb。上市公司業(yè)務(wù)多的話(huà),開(kāi)個(gè)spark吧,采用一下spark的集群管理以及水平擴展思路。
量化方向主要是excel,hive等,傳統統計方向的話(huà),r應該可以,因為很多公司在做這個(gè)了,大數據這塊,excel占大頭了,有的會(huì )用mapreduce這類(lèi), 查看全部
微信開(kāi)放平臺推文之類(lèi)的話(huà)考慮是否用關(guān)鍵字共享
querylist采集微信公眾號文章textdatareader采集qq空間文章微信開(kāi)放平臺推文之類(lèi)是公司產(chǎn)品的會(huì )先成立項目組或者部門(mén)研究相關(guān)需求,分析需求是否合理。然后設計個(gè)基礎設計,寫(xiě)個(gè)helloworld。這邊所謂的人均壓力都不算大,實(shí)際上手發(fā)現沒(méi)啥。數據的話(huà)考慮是否用關(guān)鍵字共享不過(guò)也可以根據需求放一些圖片存緩存。
需要處理到瀏覽器那邊就用gulp+vuepress等。業(yè)務(wù)類(lèi)分為公眾號\移動(dòng)端\h5\微信小程序等我做的項目是用微信公眾號來(lái)測試,完全沒(méi)有開(kāi)發(fā)微信接口測試。因為功能測試不過(guò),所以把調試的功能公開(kāi)給了運營(yíng)人員,看他們自己后期的測試。最后項目開(kāi)發(fā)中段才開(kāi)始考慮量化算法。給總經(jīng)理們整點(diǎn)投票表決什么的以便安排人手。
我一般是先搞定業(yè)務(wù)問(wèn)題,然后挑戰一些很容易通過(guò)數據挖掘模型的功能。工作量因人而異,不會(huì )整天加班,看出的問(wèn)題也不會(huì )有回報。后端的話(huà)excel+hive+sql+springmvc就可以辦到。nosql這種不用考慮了,不過(guò)如果需要融合mongodb,請先給我自己買(mǎi)個(gè)mongodb。上市公司業(yè)務(wù)多的話(huà),開(kāi)個(gè)spark吧,采用一下spark的集群管理以及水平擴展思路。
量化方向主要是excel,hive等,傳統統計方向的話(huà),r應該可以,因為很多公司在做這個(gè)了,大數據這塊,excel占大頭了,有的會(huì )用mapreduce這類(lèi),
querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 409 次瀏覽 ? 2021-06-20 06:33
每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
請允許我強制投放一波廣告:
因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
一個(gè)喜歡小寵物但養不起貓的碼農,下班后很高興來(lái)看看??梢躁P(guān)注哦!
為保證視頻安全,避免丟失,請樓主為視頻添加水印。
獲取官方賬號信息
標題、摘要、封面、文章URL
步驟:
1、先自己申請公眾號
2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
4、抓包獲取信息并定位請求的url
通過(guò)查看信息,找到了我們需要的關(guān)鍵內容:title、abstract、cover和文章URL,確認這是我們需要的URL,點(diǎn)擊下一頁(yè),多次獲取url,發(fā)現只有 random 和 begin 的參數發(fā)生了變化
這樣就確定了主要信息網(wǎng)址。
讓我們開(kāi)始吧:
原來(lái)我們需要修改的參數是:token、random、cookie
獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
# -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
獲取結果(成功):
獲取文章內視頻:實(shí)現批量下載
分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
與獲取的其他信息無(wú)關(guān),只能強制。
這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
視頻下載:
def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
然后所有的信息都完成了,進(jìn)行代碼組裝。
一個(gè)。獲取公眾號信息
B.過(guò)濾單篇文章文章information
c.獲取視頻信息
d。拼接視頻頁(yè)面下載地址
e.下載視頻并保存
代碼實(shí)驗結果:
獲取公眾號:標題、摘要、封面、視頻、
可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
危險動(dòng)作,請勿操作!記??!記??!記??!
獲取代碼請回復公眾號:20191210或公眾號
查看全部
querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!

請允許我強制投放一波廣告:
因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
一個(gè)喜歡小寵物但養不起貓的碼農,下班后很高興來(lái)看看??梢躁P(guān)注哦!
為保證視頻安全,避免丟失,請樓主為視頻添加水印。
獲取官方賬號信息
標題、摘要、封面、文章URL
步驟:
1、先自己申請公眾號
2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接

3、彈出搜索框,搜索你需要的公眾號,查看歷史文章


4、抓包獲取信息并定位請求的url

通過(guò)查看信息,找到了我們需要的關(guān)鍵內容:title、abstract、cover和文章URL,確認這是我們需要的URL,點(diǎn)擊下一頁(yè),多次獲取url,發(fā)現只有 random 和 begin 的參數發(fā)生了變化

這樣就確定了主要信息網(wǎng)址。
讓我們開(kāi)始吧:
原來(lái)我們需要修改的參數是:token、random、cookie
獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
# -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
獲取結果(成功):

獲取文章內視頻:實(shí)現批量下載
分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:

打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:


嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
與獲取的其他信息無(wú)關(guān),只能強制。
這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
視頻下載:
def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
然后所有的信息都完成了,進(jìn)行代碼組裝。
一個(gè)。獲取公眾號信息
B.過(guò)濾單篇文章文章information
c.獲取視頻信息
d。拼接視頻頁(yè)面下載地址
e.下載視頻并保存
代碼實(shí)驗結果:



獲取公眾號:標題、摘要、封面、視頻、
可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
危險動(dòng)作,請勿操作!記??!記??!記??!
獲取代碼請回復公眾號:20191210或公眾號

querylist采集微信公眾號文章源碼(我會(huì )截圖分享)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 230 次瀏覽 ? 2021-06-14 00:02
querylist采集微信公眾號文章源碼我會(huì )截圖分享,里面有請輸入xxxxv這樣的語(yǔ)句。本人目前初學(xué)中,水平有限。如有錯誤,希望指正。僅代表個(gè)人解決了"常見(jiàn)文章庫提取問(wèn)題。輸入"某源碼庫"提取微信公眾號文章的標題",","目標格式"這樣的問(wèn)題。到此,下一篇文章"個(gè)人實(shí)現自動(dòng)回復管理系統"在中途就會(huì )全部搞定。
我通過(guò)分析此圖,認為可行性非常小,性能太差。再者很不方便,首頁(yè)與每篇文章之間的跳轉不方便(別人發(fā)送過(guò)一次)。
文章源代碼的提取的通過(guò)分析公眾號的h5地址就可以找到了,可以獲取整個(gè)公眾號的下載地址和公眾號每篇文章的鏈接地址,
有必要么,
當然可以啊,而且這個(gè)工具是已經(jīng)實(shí)現了的,
比較有必要,最起碼我們公司用這個(gè)文章提取工具都實(shí)現了我們的需求。
可以呀,
可以的,我目前想自己實(shí)現也是這么找。當然要得到微信公眾號的文章源碼,
文章源代碼提取肯定會(huì )有些封裝的接口,如果想使用原來(lái)接口我們可以分析一下源代碼來(lái)提取。
根據微信公眾號中的文章標題,也可以自己設計過(guò)濾器這么做, 查看全部
querylist采集微信公眾號文章源碼(我會(huì )截圖分享)
querylist采集微信公眾號文章源碼我會(huì )截圖分享,里面有請輸入xxxxv這樣的語(yǔ)句。本人目前初學(xué)中,水平有限。如有錯誤,希望指正。僅代表個(gè)人解決了"常見(jiàn)文章庫提取問(wèn)題。輸入"某源碼庫"提取微信公眾號文章的標題",","目標格式"這樣的問(wèn)題。到此,下一篇文章"個(gè)人實(shí)現自動(dòng)回復管理系統"在中途就會(huì )全部搞定。
我通過(guò)分析此圖,認為可行性非常小,性能太差。再者很不方便,首頁(yè)與每篇文章之間的跳轉不方便(別人發(fā)送過(guò)一次)。
文章源代碼的提取的通過(guò)分析公眾號的h5地址就可以找到了,可以獲取整個(gè)公眾號的下載地址和公眾號每篇文章的鏈接地址,
有必要么,
當然可以啊,而且這個(gè)工具是已經(jīng)實(shí)現了的,
比較有必要,最起碼我們公司用這個(gè)文章提取工具都實(shí)現了我們的需求。
可以呀,
可以的,我目前想自己實(shí)現也是這么找。當然要得到微信公眾號的文章源碼,
文章源代碼提取肯定會(huì )有些封裝的接口,如果想使用原來(lái)接口我們可以分析一下源代碼來(lái)提取。
根據微信公眾號中的文章標題,也可以自己設計過(guò)濾器這么做,
querylist采集微信公眾號文章聚合,可以試試weichat100,
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 191 次瀏覽 ? 2021-06-12 02:01
querylist采集微信公眾號文章內容的話(huà),個(gè)人認為應該是通過(guò)redis做querylist的querylist進(jìn)行抓取,可以通過(guò)mongodb等關(guān)系型數據庫存儲和管理。但是建議樓主可以采用feed聚合服務(wù),比如說(shuō)微信公眾號的文章或者小程序的推文,直接開(kāi)發(fā)一個(gè)feed服務(wù)端來(lái)進(jìn)行抓取的!。
feed對方需要發(fā)送get請求參與到redis里面。
可以試試weichat100,給你一個(gè)試試:/
百度搜索關(guān)鍵詞微信公眾號文章聚合,開(kāi)發(fā)項目很多。最直接簡(jiǎn)單的方法,其實(shí)你可以用瀏覽器打開(kāi),去看那個(gè),
高并發(fā)嗎?答案,
兩種可能,一種是你的服務(wù)器負載不足,經(jīng)常上線(xiàn),最近沒(méi)有任何數據抓取?;蛘呤琼?yè)面過(guò)于復雜或者附加屬性過(guò)多,這個(gè)個(gè)人覺(jué)得還是跟語(yǔ)言有關(guān),目前ruby,python等語(yǔ)言的效率都會(huì )相對較高。
是我對高并發(fā)要求太高了嗎?同意樓上說(shuō)的那個(gè)回答。
對服務(wù)器配置要求是真高,如果你有錢(qián),你可以找個(gè)節點(diǎn)或者購買(mǎi)相應服務(wù),比如你自己做個(gè)集群啥的。其他大家的回答都是為了說(shuō)明對你有幫助,對于那個(gè)使用redis來(lái)進(jìn)行querylist進(jìn)行抓取的方案,由于querylist不是微信開(kāi)發(fā)的,而是為了crud而生,所以,redis本身有數據的持久化機制,不需要數據庫操作。 查看全部
querylist采集微信公眾號文章聚合,可以試試weichat100,
querylist采集微信公眾號文章內容的話(huà),個(gè)人認為應該是通過(guò)redis做querylist的querylist進(jìn)行抓取,可以通過(guò)mongodb等關(guān)系型數據庫存儲和管理。但是建議樓主可以采用feed聚合服務(wù),比如說(shuō)微信公眾號的文章或者小程序的推文,直接開(kāi)發(fā)一個(gè)feed服務(wù)端來(lái)進(jìn)行抓取的!。
feed對方需要發(fā)送get請求參與到redis里面。
可以試試weichat100,給你一個(gè)試試:/
百度搜索關(guān)鍵詞微信公眾號文章聚合,開(kāi)發(fā)項目很多。最直接簡(jiǎn)單的方法,其實(shí)你可以用瀏覽器打開(kāi),去看那個(gè),
高并發(fā)嗎?答案,
兩種可能,一種是你的服務(wù)器負載不足,經(jīng)常上線(xiàn),最近沒(méi)有任何數據抓取?;蛘呤琼?yè)面過(guò)于復雜或者附加屬性過(guò)多,這個(gè)個(gè)人覺(jué)得還是跟語(yǔ)言有關(guān),目前ruby,python等語(yǔ)言的效率都會(huì )相對較高。
是我對高并發(fā)要求太高了嗎?同意樓上說(shuō)的那個(gè)回答。
對服務(wù)器配置要求是真高,如果你有錢(qián),你可以找個(gè)節點(diǎn)或者購買(mǎi)相應服務(wù),比如你自己做個(gè)集群啥的。其他大家的回答都是為了說(shuō)明對你有幫助,對于那個(gè)使用redis來(lái)進(jìn)行querylist進(jìn)行抓取的方案,由于querylist不是微信開(kāi)發(fā)的,而是為了crud而生,所以,redis本身有數據的持久化機制,不需要數據庫操作。
【魔獸世界】谷歌微信公眾號文章接口獲取方法
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 218 次瀏覽 ? 2021-06-11 00:05
一、網(wǎng)上方法:
1.使用訂閱賬號功能中的查詢(xún)鏈接,(此鏈接現在采取了嚴重的反抄襲措施,訂閱賬號在抓取幾十個(gè)頁(yè)面時(shí)會(huì )被屏蔽,僅供參考)
詳情請訪(fǎng)問(wèn)此鏈接:/4652.html
2.微信搜索使用搜狗搜索(此方法只能查看每個(gè)微信公眾號文章的前10條)
詳情請訪(fǎng)問(wèn)此鏈接:/qiqiyingse/article/details/70050113
3.先搶公眾號界面,訪(fǎng)問(wèn)界面獲取所有文章連接
二、環(huán)境配置及材料準備
1.需要安裝python selenium模塊包,使用selenium中的webdriver驅動(dòng)瀏覽器獲取cookie,達到登錄效果;
2.使用webdriver功能需要安裝瀏覽器對應的驅動(dòng)插件。我在這里測試的是 Google Chrome。
3.微信公眾號申請(個(gè)人訂閱號申請門(mén)檻低,服務(wù)號需要營(yíng)業(yè)執照等)
4、.微信公眾號文章界面地址可在微信公眾號后臺新建圖文消息,可通過(guò)超鏈接功能獲??;
通過(guò)搜索關(guān)鍵字獲取所有相關(guān)公眾號信息,但我只取第一個(gè)進(jìn)行測試,其他感興趣的人也可以全部獲取
5.獲取要爬取的公眾號的fakeid
6.選擇要爬取的公眾號,獲取文章接口地址
從 selenium 導入 webdriver
導入時(shí)間
導入json
導入請求
重新導入
隨機導入
user=""
password="weikuan3344520"
gzlist=['熊貓']
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
def weChat_login():
#定義一個(gè)空字典來(lái)存儲cookies的內容
post={}
#使用網(wǎng)絡(luò )驅動(dòng)程序啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='C:\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('/')
#等待 5 秒
time.sleep(5)
print("輸入微信公眾號賬號和密碼...")
#清除帳號框中的內容
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").clear()
#自動(dòng)填寫(xiě)登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").send_keys(user)
#清空密碼框內容
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").clear()
#自動(dòng)填寫(xiě)登錄密碼
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").send_keys(password)
//這是重點(diǎn),最近改版后
#自動(dòng)輸入密碼后,需要手動(dòng)點(diǎn)擊記住我
print("請點(diǎn)擊登錄界面:記住您的賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕登錄
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
#用手機掃描二維碼!
print("請用手機掃描二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新加載公眾號登錄頁(yè)面,登錄后會(huì )顯示公眾號后臺首頁(yè),從返回的內容中獲取cookies信息
driver.get('/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取的cookies為列表形式,將cookies轉換為json形式存放在名為cookie的本地文本中
對于 cookie_items 中的 cookie_item:
post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt','w+', encoding='utf-8') as f:
f.write(cookie_str)
print("Cookies 信息已保存在本地")
#抓取微信公眾號文章并存入本地文本
def get_content(query):
#query 是要抓取的公眾號名稱(chēng)
#公眾號首頁(yè)
url =''
#設置標題
標題 = {
"主機":"",
"用戶(hù)代理": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取的cookie
with open('cookie.txt','r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄后微信公眾號首頁(yè)url改為:/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號接口地址
search_url ='/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,共有三個(gè)變量:微信公眾號token、隨機數random、搜索微信公眾號名稱(chēng)
query_id = {
'action':'search_biz',
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'查詢(xún)':查詢(xún),
'開(kāi)始':'0',
'計數':'5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入cookies、params、headers等相關(guān)參數信息
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,以后爬取公眾號文章需要這個(gè)字段
fakeid = list.get('fakeid')
#微信公眾號文章界面地址
appmsg_url ='/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、爬取文章的fakeid公眾號、隨機數random
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin': '0',#不同的頁(yè)面,這個(gè)參數改變,改變規則是每頁(yè)加5
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
#打開(kāi)搜索到的微信公眾號文章list頁(yè)面
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#Get 文章total number
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5個(gè)條目,獲取文章頁(yè)總數,爬取時(shí)需要頁(yè)面爬取
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,后續每頁(yè)加5
開(kāi)始 = 0
當 num + 1> 0 :
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin':'{}'.format(str(begin)),
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
print('翻頁(yè):--------------',begin)
#獲取文章每個(gè)頁(yè)面的標題和鏈接地址,寫(xiě)入本地文本
query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list = query_fakeid_response.json().get('app_msg_list')
對于 fakeid_list 中的項目:
content_link=item.get('link')
content_title=item.get('title')
fileName=query+'.txt'
with open(fileName,'a',encoding='utf-8') as fh:
fh.write(content_title+":\n"+content_link+"\n")
數量 -= 1
begin = int(begin)
開(kāi)始+=5
time.sleep(2)
如果 __name__=='__main__':
試試:
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
weChat_login()
#登錄后使用微信公眾號文章interface爬取文章
在 gzlist 中查詢(xún):
#抓取微信公眾號文章并存入本地文本 查看全部
【魔獸世界】谷歌微信公眾號文章接口獲取方法
一、網(wǎng)上方法:
1.使用訂閱賬號功能中的查詢(xún)鏈接,(此鏈接現在采取了嚴重的反抄襲措施,訂閱賬號在抓取幾十個(gè)頁(yè)面時(shí)會(huì )被屏蔽,僅供參考)
詳情請訪(fǎng)問(wèn)此鏈接:/4652.html
2.微信搜索使用搜狗搜索(此方法只能查看每個(gè)微信公眾號文章的前10條)
詳情請訪(fǎng)問(wèn)此鏈接:/qiqiyingse/article/details/70050113
3.先搶公眾號界面,訪(fǎng)問(wèn)界面獲取所有文章連接
二、環(huán)境配置及材料準備
1.需要安裝python selenium模塊包,使用selenium中的webdriver驅動(dòng)瀏覽器獲取cookie,達到登錄效果;
2.使用webdriver功能需要安裝瀏覽器對應的驅動(dòng)插件。我在這里測試的是 Google Chrome。
3.微信公眾號申請(個(gè)人訂閱號申請門(mén)檻低,服務(wù)號需要營(yíng)業(yè)執照等)
4、.微信公眾號文章界面地址可在微信公眾號后臺新建圖文消息,可通過(guò)超鏈接功能獲??;


通過(guò)搜索關(guān)鍵字獲取所有相關(guān)公眾號信息,但我只取第一個(gè)進(jìn)行測試,其他感興趣的人也可以全部獲取


5.獲取要爬取的公眾號的fakeid


6.選擇要爬取的公眾號,獲取文章接口地址


從 selenium 導入 webdriver
導入時(shí)間
導入json
導入請求
重新導入
隨機導入
user=""
password="weikuan3344520"
gzlist=['熊貓']
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
def weChat_login():
#定義一個(gè)空字典來(lái)存儲cookies的內容
post={}
#使用網(wǎng)絡(luò )驅動(dòng)程序啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='C:\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('/')
#等待 5 秒
time.sleep(5)
print("輸入微信公眾號賬號和密碼...")
#清除帳號框中的內容
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").clear()
#自動(dòng)填寫(xiě)登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").send_keys(user)
#清空密碼框內容
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").clear()
#自動(dòng)填寫(xiě)登錄密碼
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").send_keys(password)
//這是重點(diǎn),最近改版后
#自動(dòng)輸入密碼后,需要手動(dòng)點(diǎn)擊記住我
print("請點(diǎn)擊登錄界面:記住您的賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕登錄
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
#用手機掃描二維碼!
print("請用手機掃描二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新加載公眾號登錄頁(yè)面,登錄后會(huì )顯示公眾號后臺首頁(yè),從返回的內容中獲取cookies信息
driver.get('/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取的cookies為列表形式,將cookies轉換為json形式存放在名為cookie的本地文本中
對于 cookie_items 中的 cookie_item:
post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt','w+', encoding='utf-8') as f:
f.write(cookie_str)
print("Cookies 信息已保存在本地")
#抓取微信公眾號文章并存入本地文本
def get_content(query):
#query 是要抓取的公眾號名稱(chēng)
#公眾號首頁(yè)
url =''
#設置標題
標題 = {
"主機":"",
"用戶(hù)代理": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取的cookie
with open('cookie.txt','r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄后微信公眾號首頁(yè)url改為:/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號接口地址
search_url ='/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,共有三個(gè)變量:微信公眾號token、隨機數random、搜索微信公眾號名稱(chēng)
query_id = {
'action':'search_biz',
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'查詢(xún)':查詢(xún),
'開(kāi)始':'0',
'計數':'5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入cookies、params、headers等相關(guān)參數信息
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,以后爬取公眾號文章需要這個(gè)字段
fakeid = list.get('fakeid')
#微信公眾號文章界面地址
appmsg_url ='/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、爬取文章的fakeid公眾號、隨機數random
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin': '0',#不同的頁(yè)面,這個(gè)參數改變,改變規則是每頁(yè)加5
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
#打開(kāi)搜索到的微信公眾號文章list頁(yè)面
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#Get 文章total number
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5個(gè)條目,獲取文章頁(yè)總數,爬取時(shí)需要頁(yè)面爬取
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,后續每頁(yè)加5
開(kāi)始 = 0
當 num + 1> 0 :
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin':'{}'.format(str(begin)),
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
print('翻頁(yè):--------------',begin)
#獲取文章每個(gè)頁(yè)面的標題和鏈接地址,寫(xiě)入本地文本
query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list = query_fakeid_response.json().get('app_msg_list')
對于 fakeid_list 中的項目:
content_link=item.get('link')
content_title=item.get('title')
fileName=query+'.txt'
with open(fileName,'a',encoding='utf-8') as fh:
fh.write(content_title+":\n"+content_link+"\n")
數量 -= 1
begin = int(begin)
開(kāi)始+=5
time.sleep(2)
如果 __name__=='__main__':
試試:
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
weChat_login()
#登錄后使用微信公眾號文章interface爬取文章
在 gzlist 中查詢(xún):
#抓取微信公眾號文章并存入本地文本
刷新搜狗微信公眾號文章列表列表的步驟暫時(shí)不知道
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 260 次瀏覽 ? 2021-06-08 02:48
最近有采集微信公號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于list地址的獲取,我們以后再研究。
在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。
以下是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),有待進(jìn)一步完善。
/**
?*?Created?by?PhpStorm.
?*?User:?Administrator
?*?Date:?2017/2/6
?*?Time:?10:54
?*?author:?gm
?*?微信公眾號文章采集類(lèi)
?*/
class?DownWxArticle?{
private???$mpwxurl?=?'http://mp.weixin.qq.com';
private???$wxgzherr=?'公眾號二維碼下載失敗=>';
private???$wximgerr=?'圖片下載失敗=>';
private???$direrr??=?'文件夾創(chuàng )建失??!';
private???$fileerr?=?'資源不存在!';
private???$dirurl??=?'';
????/*?抓取微信公眾號文章
?*?$qcode????boolean?公眾號二維碼?false=>不下載?true=>下載
?*?return
?*?$content??string??內容
?*?$tile?????string??標題
?*?$time?????int?????時(shí)間戳
?*?$wxggh????string??微信公眾號
?*?$wxh??????string??微信號
?*?$qcode????string??公眾號二維碼
?*?$tag??????string??標簽?原創(chuàng )
?*/
????function?get_file_article($url,$dir='',$qcode=false)
????{
$this->dirurl?=?$dir?:'/Uploads/'.date('Ymd',time());
????????if(!$this->put_dir($this->dirurl)){
exit(json_encode(array('msg'=>$this->direrr,'code'=>500)));
}
????????$file?=?file_get_contents($url);
????????if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
????????????exit(json_encode(array('msg'=>$this->fileerr,'code'=>500)));
????????}
????????//?內容主體
????????preg_match('/[sS]*?/',$file,$content);
????????//?標題
????????preg_match('/(.*?)/',$file,$title);
????????$title?=?$title?$title[1]:'';
????????//?時(shí)間
????????preg_match('/(.*?)/',$file,$time);
????????$time?=?$time?strtotime($time[1]):'';
????????//?公眾號
????????preg_match('/(.*?)</a>/',$file,$wxgzh);
????????$wxgzh?=?$wxgzh?$wxgzh[1]:'';
????????//?微信號
????????preg_match('/([sS]*?)/',$file,$wxh);
????????$wxh???=?$wxh?$wxh[1]:'';
????????//?公眾號二維碼
????????if($qcode){
????????????preg_match('/window.sg_qr_code="(.*?)";/',$file,$qcode);
????????????$qcodeurl?=?str_replace('x26amp;','&',$this->mpwxurl.$qcode[1]);
????????????$qcode?=?$this->put_file_img($this->dirurl,$qcodeurl);
????????????if(!$qcode){
????????????????$this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
????????????}
????????}
????????//?獲取標簽
????????preg_match('/(.*?)/',$file,$tag);
????????$tag?=?$tag?$tag[1]:'';
????????//?圖片
????????preg_match_all('//',$content[0],$images);
????????//?儲存原地址和下載后地址
????????$old?=?array();
????????$new?=?array();
????????//?去除重復圖片地址
????????$images?=?array_unique($images[1]);
????????if($images){
????????????foreach($images?as?$v){
????????????????$filename?=?$this->put_file_img($this->dirurl,$v);
????????????????if($filename){
????????????????????//?圖片保存成功?替換地址
????????????????????$old[]?=?$v;
????????????????????$new[]?=?$filename;
????????????????}else{
????????????????????//?失敗記錄日志
????????????????????$this->put_error_log($this->dirurl,$this->wximgerr.$v);
????????????????}
????????????}
????????????$old[]?=?'data-src';
????????????$new[]?=?'src';
????????????$content?=?str_replace($old,$new,$content[0]);
????????}
???????//?替換音頻
???????$content?=?str_replace("preview.html","player.html",$content);?
???????//?獲取閱讀點(diǎn)贊評論等信息
???????$comment?=?$this->get_comment_article($url);
$data?=?array('content'=>$content,'title'=>$title,'time'=>$time,'wxgzh'=>$wxgzh,'wxh'=>$wxh,'qcode'=>$qcode?:'','tag'=>$tag?:'','comment'=>$comment);
????????return?json_encode(array('data'=>$data,'code'=>200,'msg'=>'ok'));
????}
????/*?抓取保存圖片函數
?????*?return
?????*?$filename??string??圖片地址
?????*/
????function?put_file_img($dir='',$image='')
????{
????????//?判斷圖片的保存類(lèi)型?截取后四位地址
????????$exts?=?array('jpeg','png','jpg');
????????$filename?=?$dir.'/'.uniqid().time().rand(10000,99999);
????????$ext?=?substr($image,-5);
????????$ext?=?explode('=',$ext);
????????if(in_array($ext[1],$exts)?!==?false){
????????????$filename?.=?'.'.$ext[1];
????????}else{
????????????$filename?.=?'.gif';
????????}
????????$souce?=?file_get_contents($image);
????????if(file_put_contents($filename,$souce)){
????????????return?$filename;
????????}else{
????????????return?false;
????????}
????}
????/*?獲取微信公眾號文章的【點(diǎn)贊】【閱讀】【評論】
?????*?方法:將地址中的部分參數替換即可。
?????*?????1、s??????替換為?mp/getcomment?
?????*?????2、最后=??替換為?%3D
?????*?return
?????*?read_num??閱讀數
?????*?like_num??點(diǎn)贊數
?????*?comment???評論詳情
?????*/
????function?get_comment_article($url='')
????{
????????$url?=?substr($url,0,-1);
????????$url?=?str_replace('/s','/mp/getcomment',$url).'%3D';
????????return?file_get_contents($url);
????}
????/*?錯誤日志記錄
?????*?$dir??string??文件路徑
?????*?$data?string??寫(xiě)入內容
?????*/
????function?put_error_log($dir,$data)
????{
????????file_put_contents($dir.'/error.log',date('Y-m-d?H:i:s',time()).$data.PHP_EOL,FILE_APPEND);
????}
????/*?創(chuàng )建文件夾
?????*?$dir?string?文件夾路徑
?????*/
????function?put_dir($dir=''){
$bool?=?true;
????????if(!is_dir($dir)){
????????????if(!mkdir($dir,777,TRUE)){
$bool?=?false;
????????????????$this->put_error_log($dir,$this->direrr.$dir);
????????????}
????????}
return?$bool;
????}
}
使用方法:
$url?=?'';
$article?=?new?DownWxArticle();
$article->get_file_article($url,'',true); 查看全部
刷新搜狗微信公眾號文章列表列表的步驟暫時(shí)不知道
最近有采集微信公號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于list地址的獲取,我們以后再研究。
在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。
以下是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),有待進(jìn)一步完善。
/**
?*?Created?by?PhpStorm.
?*?User:?Administrator
?*?Date:?2017/2/6
?*?Time:?10:54
?*?author:?gm
?*?微信公眾號文章采集類(lèi)
?*/
class?DownWxArticle?{
private???$mpwxurl?=?'http://mp.weixin.qq.com';
private???$wxgzherr=?'公眾號二維碼下載失敗=>';
private???$wximgerr=?'圖片下載失敗=>';
private???$direrr??=?'文件夾創(chuàng )建失??!';
private???$fileerr?=?'資源不存在!';
private???$dirurl??=?'';
????/*?抓取微信公眾號文章
?*?$qcode????boolean?公眾號二維碼?false=>不下載?true=>下載
?*?return
?*?$content??string??內容
?*?$tile?????string??標題
?*?$time?????int?????時(shí)間戳
?*?$wxggh????string??微信公眾號
?*?$wxh??????string??微信號
?*?$qcode????string??公眾號二維碼
?*?$tag??????string??標簽?原創(chuàng )
?*/
????function?get_file_article($url,$dir='',$qcode=false)
????{
$this->dirurl?=?$dir?:'/Uploads/'.date('Ymd',time());
????????if(!$this->put_dir($this->dirurl)){
exit(json_encode(array('msg'=>$this->direrr,'code'=>500)));
}
????????$file?=?file_get_contents($url);
????????if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
????????????exit(json_encode(array('msg'=>$this->fileerr,'code'=>500)));
????????}
????????//?內容主體
????????preg_match('/[sS]*?/',$file,$content);
????????//?標題
????????preg_match('/(.*?)/',$file,$title);
????????$title?=?$title?$title[1]:'';
????????//?時(shí)間
????????preg_match('/(.*?)/',$file,$time);
????????$time?=?$time?strtotime($time[1]):'';
????????//?公眾號
????????preg_match('/(.*?)</a>/',$file,$wxgzh);
????????$wxgzh?=?$wxgzh?$wxgzh[1]:'';
????????//?微信號
????????preg_match('/([sS]*?)/',$file,$wxh);
????????$wxh???=?$wxh?$wxh[1]:'';
????????//?公眾號二維碼
????????if($qcode){
????????????preg_match('/window.sg_qr_code="(.*?)";/',$file,$qcode);
????????????$qcodeurl?=?str_replace('x26amp;','&',$this->mpwxurl.$qcode[1]);
????????????$qcode?=?$this->put_file_img($this->dirurl,$qcodeurl);
????????????if(!$qcode){
????????????????$this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
????????????}
????????}
????????//?獲取標簽
????????preg_match('/(.*?)/',$file,$tag);
????????$tag?=?$tag?$tag[1]:'';
????????//?圖片
????????preg_match_all('//',$content[0],$images);
????????//?儲存原地址和下載后地址
????????$old?=?array();
????????$new?=?array();
????????//?去除重復圖片地址
????????$images?=?array_unique($images[1]);
????????if($images){
????????????foreach($images?as?$v){
????????????????$filename?=?$this->put_file_img($this->dirurl,$v);
????????????????if($filename){
????????????????????//?圖片保存成功?替換地址
????????????????????$old[]?=?$v;
????????????????????$new[]?=?$filename;
????????????????}else{
????????????????????//?失敗記錄日志
????????????????????$this->put_error_log($this->dirurl,$this->wximgerr.$v);
????????????????}
????????????}
????????????$old[]?=?'data-src';
????????????$new[]?=?'src';
????????????$content?=?str_replace($old,$new,$content[0]);
????????}
???????//?替換音頻
???????$content?=?str_replace("preview.html","player.html",$content);?
???????//?獲取閱讀點(diǎn)贊評論等信息
???????$comment?=?$this->get_comment_article($url);
$data?=?array('content'=>$content,'title'=>$title,'time'=>$time,'wxgzh'=>$wxgzh,'wxh'=>$wxh,'qcode'=>$qcode?:'','tag'=>$tag?:'','comment'=>$comment);
????????return?json_encode(array('data'=>$data,'code'=>200,'msg'=>'ok'));
????}
????/*?抓取保存圖片函數
?????*?return
?????*?$filename??string??圖片地址
?????*/
????function?put_file_img($dir='',$image='')
????{
????????//?判斷圖片的保存類(lèi)型?截取后四位地址
????????$exts?=?array('jpeg','png','jpg');
????????$filename?=?$dir.'/'.uniqid().time().rand(10000,99999);
????????$ext?=?substr($image,-5);
????????$ext?=?explode('=',$ext);
????????if(in_array($ext[1],$exts)?!==?false){
????????????$filename?.=?'.'.$ext[1];
????????}else{
????????????$filename?.=?'.gif';
????????}
????????$souce?=?file_get_contents($image);
????????if(file_put_contents($filename,$souce)){
????????????return?$filename;
????????}else{
????????????return?false;
????????}
????}
????/*?獲取微信公眾號文章的【點(diǎn)贊】【閱讀】【評論】
?????*?方法:將地址中的部分參數替換即可。
?????*?????1、s??????替換為?mp/getcomment?
?????*?????2、最后=??替換為?%3D
?????*?return
?????*?read_num??閱讀數
?????*?like_num??點(diǎn)贊數
?????*?comment???評論詳情
?????*/
????function?get_comment_article($url='')
????{
????????$url?=?substr($url,0,-1);
????????$url?=?str_replace('/s','/mp/getcomment',$url).'%3D';
????????return?file_get_contents($url);
????}
????/*?錯誤日志記錄
?????*?$dir??string??文件路徑
?????*?$data?string??寫(xiě)入內容
?????*/
????function?put_error_log($dir,$data)
????{
????????file_put_contents($dir.'/error.log',date('Y-m-d?H:i:s',time()).$data.PHP_EOL,FILE_APPEND);
????}
????/*?創(chuàng )建文件夾
?????*?$dir?string?文件夾路徑
?????*/
????function?put_dir($dir=''){
$bool?=?true;
????????if(!is_dir($dir)){
????????????if(!mkdir($dir,777,TRUE)){
$bool?=?false;
????????????????$this->put_error_log($dir,$this->direrr.$dir);
????????????}
????????}
return?$bool;
????}
}
使用方法:
$url?=?'';
$article?=?new?DownWxArticle();
$article->get_file_article($url,'',true);
微信公眾號歷史消息頁(yè)面的鏈接地址將持續更新
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 198 次瀏覽 ? 2021-06-05 23:10
我從2014年開(kāi)始做微信公眾號內容的批量采集,最初的目的是為了制造一個(gè)html5垃圾郵件網(wǎng)站。當時(shí)垃圾站采集到達的微信公眾號的內容很容易在公眾號傳播。當時(shí)批量采集特別好做,采集入口就是公眾號的歷史新聞頁(yè)面。這個(gè)條目現在是一樣的,但越來(lái)越難采集。 采集 方法也在很多版本中進(jìn)行了更新。后來(lái)到了2015年,html5垃圾站就不做了。取而代之的是采集目標針對本地新聞資訊公眾號,前端展示被做成了一個(gè)app。于是一個(gè)可以自動(dòng)采集公號內容的新聞APP就形成了。曾經(jīng)擔心微信技術(shù)升級一天后,采集內容不可用,我的新聞應用程序失敗。但是隨著(zhù)微信的不斷技術(shù)升級,采集方式也得到了升級,這讓我越來(lái)越有信心。只要公眾號歷史消息頁(yè)面存在,就可以批量采集內容。所以今天整理了一下,決定寫(xiě)下采集方法。我的方法來(lái)自于很多同事的分享精神,所以我會(huì )延續這種精神,分享我的成果。
本文文章會(huì )持續更新,所見(jiàn)即所得。
首先我們來(lái)看一個(gè)微信公眾號歷史消息頁(yè)面的鏈接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
現在根據不同的微信個(gè)人賬號,會(huì )有兩個(gè)不同的歷史消息頁(yè)面地址。下面是另一個(gè)歷史消息頁(yè)面的地址。第一種地址的鏈接在anyproxy中會(huì )顯示302跳轉:
https://mp.weixin.qq.com/mp/pr ... irect
第一個(gè)鏈接地址的頁(yè)面樣式:
第二個(gè)鏈接地址的頁(yè)面樣式:
根據目前的信息,這兩種頁(yè)面格式在不同的微信賬號中出現不規則。有的微信賬號永遠是第一頁(yè)格式,有的永遠是第二頁(yè)格式。
上面的鏈接是微信公眾號歷史新聞頁(yè)面的真實(shí)鏈接,但是當我們在瀏覽器中輸入這個(gè)鏈接時(shí),會(huì )顯示:請從微信客戶(hù)端訪(fǎng)問(wèn)。這是因為鏈接地址實(shí)際上需要幾個(gè)參數才能正常顯示內容。來(lái)看看可以正常顯示內容的完整鏈接:
//第一種鏈接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二種
http://mp.weixin.qq.com/mp/pro ... r%3D1
該地址是通過(guò)微信客戶(hù)端打開(kāi)歷史消息頁(yè)面后,使用后面介紹的代理服務(wù)器軟件獲取的。這里有幾個(gè)參數:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的參數是:__biz;uin=;key=;pass_ticket=;這4個(gè)參數。
__biz 是公眾號的類(lèi)似id的參數。每個(gè)公眾號都有一個(gè)微信。目前公眾號的biz變動(dòng)的可能性很??;
剩下的3個(gè)參數與用戶(hù)id和tokenticket的含義有關(guān)。這3個(gè)參數的值在微信客戶(hù)端生成后會(huì )自動(dòng)添加到地址欄。所以我們認為采集公眾號必須通過(guò)微信客戶(hù)端。在之前的微信版本中,這3個(gè)參數也可以一次性獲取,在有效期內可以使用多個(gè)公眾號。在當前版本中,每次訪(fǎng)問(wèn)公眾號都會(huì )更改參數值。
我現在使用的方法只需要關(guān)注__biz參數即可。
我的采集系統由以下部分組成:
1、A 微信客戶(hù)端:可以是安裝了微信應用的手機,也可以是電腦中的安卓模擬器。批量采集測試的ios微信客戶(hù)端崩潰率高于A(yíng)ndroid系統。為了降低成本,我使用了Android模擬器。
2、A微信個(gè)人號:對于采集內容,不僅需要一個(gè)微信客戶(hù)端,還需要一個(gè)采集專(zhuān)用的微信個(gè)人號,因為這個(gè)微信號不能做其他事情。
3、本地代理服務(wù)器系統:目前使用的方法是通過(guò)Anyproxy代理服務(wù)器將公眾號歷史消息頁(yè)面中的文章列表發(fā)送到自己的服務(wù)器。具體安裝方法后面會(huì )詳細介紹。
4、文章List分析入庫系統:本人使用php語(yǔ)言編寫(xiě),下面文章將詳細介紹如何分析文章lists并建立采集queues實(shí)現批量采集內容.
步驟
一、 安裝模擬器或使用手機安裝微信客戶(hù)端APP,申請微信個(gè)人賬號并登錄APP。這個(gè)就不多介紹了,大家自己做。
二、代理服務(wù)器系統安裝
目前我使用 Anyproxy、AnyProxy。這個(gè)軟件的特點(diǎn)是可以獲取https鏈接的內容。 2016年初,微信公眾號和微信文章開(kāi)始使用https鏈接。而Anyproxy可以通過(guò)修改規則配置,在公眾號頁(yè)面插入腳本代碼。下面將介紹安裝和配置過(guò)程。
1、Install NodeJS
2、在命令行或終端運行npm install -g anyproxy,mac系統需要添加sudo;
3、生成RootCA,https需要這個(gè)證書(shū):運行命令sudo anyproxy --root(windows可能不需要sudo);
4、 啟動(dòng) anyproxy 運行命令:sudo anyproxy -i;參數-i表示解析HTTPS;
5、安裝證書(shū),在手機或者安卓模擬器安裝證書(shū):
6、Set proxy:安卓模擬器的代理服務(wù)器地址是wifi鏈接的網(wǎng)關(guān)。通過(guò)dhcp設置為static后就可以看到網(wǎng)關(guān)地址了。閱讀后不要忘記將其設置為自動(dòng)。手機中的代理服務(wù)器地址就是運行anyproxy的電腦的ip地址。代理服務(wù)器默認端口為8001;
現在打開(kāi)微信,點(diǎn)擊任意公眾號歷史消息或者文章,就可以看到在終端滾動(dòng)的響應碼。如果沒(méi)有出現,請檢查手機的代理設置是否正確。
現在打開(kāi)瀏覽器地址localhost:8002,可以看到anyproxy的web界面。微信點(diǎn)擊打開(kāi)一個(gè)歷史消息頁(yè)面,然后在瀏覽器的web界面查看,歷史消息頁(yè)面的地址會(huì )滾動(dòng)。
/mp/getmasssendmsg開(kāi)頭的網(wǎng)址是微信歷史消息頁(yè)面。左邊的小鎖表示這個(gè)頁(yè)面是 https 加密的?,F在我們點(diǎn)擊這一行;
========2017 年 1 月 11 日更新==========
一些以/mp/getmasssendmsg開(kāi)頭的微信網(wǎng)址會(huì )有302跳轉到以/mp/profile_ext?action=home開(kāi)頭的地址。所以點(diǎn)擊這個(gè)地址可以看到內容。
如果右側出現html文件內容,則表示解密成功。如果沒(méi)有內容,請檢查anyproxy運行方式是否有參數i,是否生成CA證書(shū),是否在手機上正確安裝了證書(shū)。
現在我們手機中的所有內容都可以明文通過(guò)代理服務(wù)器了。接下來(lái),我們需要修改代理服務(wù)器的配置,以便獲取公眾號的內容。
一、找到配置文件:
mac系統中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;對于windows系統,不知道還請見(jiàn)諒。應該可以根據類(lèi)似mac的文件夾地址找到這個(gè)目錄。
二、修改文件 rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函數
修改函數內容(請注意詳細閱讀注釋?zhuān)@里只是介紹原理,了解后根據自己的情況修改內容):
========2017 年 1 月 11 日更新==========
因為有兩種頁(yè)面格式,相同的頁(yè)面格式總是在不同的微信賬號中顯示,但是為了兼容兩種頁(yè)面格式,下面的代碼會(huì )保留兩種頁(yè)面格式的判斷。您也可以按照從您自己的頁(yè)面表單中刪除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
if(serverResData.toString() !== ""){
try {//防止報錯退出程序
var reg = /msgList = (.*?);\r\n/;//定義歷史消息正則匹配規則
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);//錯誤捕捉
}
callback(serverResData);//直接返回第二頁(yè)json內容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代碼就是利用anyproxy修改返回頁(yè)面的內容,向頁(yè)面注入腳本,將頁(yè)面內容發(fā)送到服務(wù)器的功能。利用這個(gè)原理批量處理采集公眾號內容和閱讀量。該腳本中自定義了一個(gè)函數,詳細說(shuō)明如下:
在 rule_default.js 文件末尾添加以下代碼:
function HttpPost(str,url,path) {//將json發(fā)送到服務(wù)器,str為json內容,url為歷史消息頁(yè)面地址,path是接收程序的路徑和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意沒(méi)有http://,這是服務(wù)器的域名。
port: 80,
path: path,//接收程序的路徑和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是規則修改的主要部分。您需要將json內容發(fā)送到您自己的服務(wù)器,并從服務(wù)器獲取到下一頁(yè)的跳轉地址。這涉及到四個(gè)php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在詳細介紹這4個(gè)php文件之前,為了提高采集系統性能,降低崩潰率,我們還可以做一些修改:
Android模擬器經(jīng)常訪(fǎng)問(wèn)一些地址,會(huì )導致anyproxy崩潰,找到函數replaceRequestOption:function(req,option),修改函數內容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的規則文件的修改配置。配置修改完成后,重啟anyproxy。在mac系統下,按control+c中斷程序,然后輸入命令sudo anyproxy -i啟動(dòng);如果報錯,程序可能無(wú)法干凈退出,端口被占用。這時(shí)候輸入命令ps -a查看占用的pid,然后輸入命令“kill -9 pid”將pid替換為查詢(xún)到的pid號。殺掉進(jìn)程后,就可以啟動(dòng)anyproxy了。再次請原諒我不熟悉windows命令。
接下來(lái)詳細介紹服務(wù)器端接收程序的設計原理:
?。ㄒ韵麓a不能直接使用,只介紹原理,部分需要根據自己的服務(wù)器數據庫框架編寫(xiě))
1、getMsgJson.php:該程序負責接收歷史消息的json,解析并存入數據庫
<p> 查看全部
微信公眾號歷史消息頁(yè)面的鏈接地址將持續更新
我從2014年開(kāi)始做微信公眾號內容的批量采集,最初的目的是為了制造一個(gè)html5垃圾郵件網(wǎng)站。當時(shí)垃圾站采集到達的微信公眾號的內容很容易在公眾號傳播。當時(shí)批量采集特別好做,采集入口就是公眾號的歷史新聞頁(yè)面。這個(gè)條目現在是一樣的,但越來(lái)越難采集。 采集 方法也在很多版本中進(jìn)行了更新。后來(lái)到了2015年,html5垃圾站就不做了。取而代之的是采集目標針對本地新聞資訊公眾號,前端展示被做成了一個(gè)app。于是一個(gè)可以自動(dòng)采集公號內容的新聞APP就形成了。曾經(jīng)擔心微信技術(shù)升級一天后,采集內容不可用,我的新聞應用程序失敗。但是隨著(zhù)微信的不斷技術(shù)升級,采集方式也得到了升級,這讓我越來(lái)越有信心。只要公眾號歷史消息頁(yè)面存在,就可以批量采集內容。所以今天整理了一下,決定寫(xiě)下采集方法。我的方法來(lái)自于很多同事的分享精神,所以我會(huì )延續這種精神,分享我的成果。
本文文章會(huì )持續更新,所見(jiàn)即所得。
首先我們來(lái)看一個(gè)微信公眾號歷史消息頁(yè)面的鏈接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
現在根據不同的微信個(gè)人賬號,會(huì )有兩個(gè)不同的歷史消息頁(yè)面地址。下面是另一個(gè)歷史消息頁(yè)面的地址。第一種地址的鏈接在anyproxy中會(huì )顯示302跳轉:
https://mp.weixin.qq.com/mp/pr ... irect
第一個(gè)鏈接地址的頁(yè)面樣式:

第二個(gè)鏈接地址的頁(yè)面樣式:

根據目前的信息,這兩種頁(yè)面格式在不同的微信賬號中出現不規則。有的微信賬號永遠是第一頁(yè)格式,有的永遠是第二頁(yè)格式。
上面的鏈接是微信公眾號歷史新聞頁(yè)面的真實(shí)鏈接,但是當我們在瀏覽器中輸入這個(gè)鏈接時(shí),會(huì )顯示:請從微信客戶(hù)端訪(fǎng)問(wèn)。這是因為鏈接地址實(shí)際上需要幾個(gè)參數才能正常顯示內容。來(lái)看看可以正常顯示內容的完整鏈接:
//第一種鏈接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二種
http://mp.weixin.qq.com/mp/pro ... r%3D1
該地址是通過(guò)微信客戶(hù)端打開(kāi)歷史消息頁(yè)面后,使用后面介紹的代理服務(wù)器軟件獲取的。這里有幾個(gè)參數:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的參數是:__biz;uin=;key=;pass_ticket=;這4個(gè)參數。
__biz 是公眾號的類(lèi)似id的參數。每個(gè)公眾號都有一個(gè)微信。目前公眾號的biz變動(dòng)的可能性很??;
剩下的3個(gè)參數與用戶(hù)id和tokenticket的含義有關(guān)。這3個(gè)參數的值在微信客戶(hù)端生成后會(huì )自動(dòng)添加到地址欄。所以我們認為采集公眾號必須通過(guò)微信客戶(hù)端。在之前的微信版本中,這3個(gè)參數也可以一次性獲取,在有效期內可以使用多個(gè)公眾號。在當前版本中,每次訪(fǎng)問(wèn)公眾號都會(huì )更改參數值。
我現在使用的方法只需要關(guān)注__biz參數即可。
我的采集系統由以下部分組成:
1、A 微信客戶(hù)端:可以是安裝了微信應用的手機,也可以是電腦中的安卓模擬器。批量采集測試的ios微信客戶(hù)端崩潰率高于A(yíng)ndroid系統。為了降低成本,我使用了Android模擬器。

2、A微信個(gè)人號:對于采集內容,不僅需要一個(gè)微信客戶(hù)端,還需要一個(gè)采集專(zhuān)用的微信個(gè)人號,因為這個(gè)微信號不能做其他事情。
3、本地代理服務(wù)器系統:目前使用的方法是通過(guò)Anyproxy代理服務(wù)器將公眾號歷史消息頁(yè)面中的文章列表發(fā)送到自己的服務(wù)器。具體安裝方法后面會(huì )詳細介紹。
4、文章List分析入庫系統:本人使用php語(yǔ)言編寫(xiě),下面文章將詳細介紹如何分析文章lists并建立采集queues實(shí)現批量采集內容.
步驟
一、 安裝模擬器或使用手機安裝微信客戶(hù)端APP,申請微信個(gè)人賬號并登錄APP。這個(gè)就不多介紹了,大家自己做。
二、代理服務(wù)器系統安裝
目前我使用 Anyproxy、AnyProxy。這個(gè)軟件的特點(diǎn)是可以獲取https鏈接的內容。 2016年初,微信公眾號和微信文章開(kāi)始使用https鏈接。而Anyproxy可以通過(guò)修改規則配置,在公眾號頁(yè)面插入腳本代碼。下面將介紹安裝和配置過(guò)程。
1、Install NodeJS
2、在命令行或終端運行npm install -g anyproxy,mac系統需要添加sudo;
3、生成RootCA,https需要這個(gè)證書(shū):運行命令sudo anyproxy --root(windows可能不需要sudo);
4、 啟動(dòng) anyproxy 運行命令:sudo anyproxy -i;參數-i表示解析HTTPS;
5、安裝證書(shū),在手機或者安卓模擬器安裝證書(shū):
6、Set proxy:安卓模擬器的代理服務(wù)器地址是wifi鏈接的網(wǎng)關(guān)。通過(guò)dhcp設置為static后就可以看到網(wǎng)關(guān)地址了。閱讀后不要忘記將其設置為自動(dòng)。手機中的代理服務(wù)器地址就是運行anyproxy的電腦的ip地址。代理服務(wù)器默認端口為8001;

現在打開(kāi)微信,點(diǎn)擊任意公眾號歷史消息或者文章,就可以看到在終端滾動(dòng)的響應碼。如果沒(méi)有出現,請檢查手機的代理設置是否正確。

現在打開(kāi)瀏覽器地址localhost:8002,可以看到anyproxy的web界面。微信點(diǎn)擊打開(kāi)一個(gè)歷史消息頁(yè)面,然后在瀏覽器的web界面查看,歷史消息頁(yè)面的地址會(huì )滾動(dòng)。

/mp/getmasssendmsg開(kāi)頭的網(wǎng)址是微信歷史消息頁(yè)面。左邊的小鎖表示這個(gè)頁(yè)面是 https 加密的?,F在我們點(diǎn)擊這一行;
========2017 年 1 月 11 日更新==========
一些以/mp/getmasssendmsg開(kāi)頭的微信網(wǎng)址會(huì )有302跳轉到以/mp/profile_ext?action=home開(kāi)頭的地址。所以點(diǎn)擊這個(gè)地址可以看到內容。

如果右側出現html文件內容,則表示解密成功。如果沒(méi)有內容,請檢查anyproxy運行方式是否有參數i,是否生成CA證書(shū),是否在手機上正確安裝了證書(shū)。
現在我們手機中的所有內容都可以明文通過(guò)代理服務(wù)器了。接下來(lái),我們需要修改代理服務(wù)器的配置,以便獲取公眾號的內容。
一、找到配置文件:
mac系統中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;對于windows系統,不知道還請見(jiàn)諒。應該可以根據類(lèi)似mac的文件夾地址找到這個(gè)目錄。
二、修改文件 rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函數
修改函數內容(請注意詳細閱讀注釋?zhuān)@里只是介紹原理,了解后根據自己的情況修改內容):
========2017 年 1 月 11 日更新==========
因為有兩種頁(yè)面格式,相同的頁(yè)面格式總是在不同的微信賬號中顯示,但是為了兼容兩種頁(yè)面格式,下面的代碼會(huì )保留兩種頁(yè)面格式的判斷。您也可以按照從您自己的頁(yè)面表單中刪除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
if(serverResData.toString() !== ""){
try {//防止報錯退出程序
var reg = /msgList = (.*?);\r\n/;//定義歷史消息正則匹配規則
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);//錯誤捕捉
}
callback(serverResData);//直接返回第二頁(yè)json內容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代碼就是利用anyproxy修改返回頁(yè)面的內容,向頁(yè)面注入腳本,將頁(yè)面內容發(fā)送到服務(wù)器的功能。利用這個(gè)原理批量處理采集公眾號內容和閱讀量。該腳本中自定義了一個(gè)函數,詳細說(shuō)明如下:
在 rule_default.js 文件末尾添加以下代碼:
function HttpPost(str,url,path) {//將json發(fā)送到服務(wù)器,str為json內容,url為歷史消息頁(yè)面地址,path是接收程序的路徑和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意沒(méi)有http://,這是服務(wù)器的域名。
port: 80,
path: path,//接收程序的路徑和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是規則修改的主要部分。您需要將json內容發(fā)送到您自己的服務(wù)器,并從服務(wù)器獲取到下一頁(yè)的跳轉地址。這涉及到四個(gè)php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在詳細介紹這4個(gè)php文件之前,為了提高采集系統性能,降低崩潰率,我們還可以做一些修改:
Android模擬器經(jīng)常訪(fǎng)問(wèn)一些地址,會(huì )導致anyproxy崩潰,找到函數replaceRequestOption:function(req,option),修改函數內容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的規則文件的修改配置。配置修改完成后,重啟anyproxy。在mac系統下,按control+c中斷程序,然后輸入命令sudo anyproxy -i啟動(dòng);如果報錯,程序可能無(wú)法干凈退出,端口被占用。這時(shí)候輸入命令ps -a查看占用的pid,然后輸入命令“kill -9 pid”將pid替換為查詢(xún)到的pid號。殺掉進(jìn)程后,就可以啟動(dòng)anyproxy了。再次請原諒我不熟悉windows命令。
接下來(lái)詳細介紹服務(wù)器端接收程序的設計原理:
?。ㄒ韵麓a不能直接使用,只介紹原理,部分需要根據自己的服務(wù)器數據庫框架編寫(xiě))
1、getMsgJson.php:該程序負責接收歷史消息的json,解析并存入數據庫
<p>
沒(méi)有哪個(gè)app只投放廣告這一塊,就是朋友圈廣告
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2021-06-01 00:03
querylist采集微信公眾號文章數據,
沒(méi)有哪個(gè)app只投放廣告這一塊。要看你投放的是什么app,投放的什么廣告方式。不過(guò)確實(shí)有些app只投放廣告不做自身品牌推廣的。
我能想到的就是“seo+aso”
我能想到的就是朋友圈廣告了,但是小游戲目前是做不了的,其他一些app廣告的用戶(hù)已經(jīng)足夠覆蓋到的,甚至不需要推廣,
樓上那位觀(guān)點(diǎn)其實(shí)蠻對的。但是如果樓主只想看朋友圈廣告。
app營(yíng)銷(xiāo),廣告營(yíng)銷(xiāo),提高app商戶(hù)知名度,變現,然后才是品牌推廣。
朋友圈廣告大品牌推廣有效果,多數產(chǎn)品有10-50%roi。
相信這個(gè)問(wèn)題目前大多數app都會(huì )存在這個(gè)疑問(wèn),對于初期手機廣告市場(chǎng)最有效的推廣方式之一就是朋友圈廣告了。而對于app開(kāi)發(fā)者來(lái)說(shuō)選擇合適的廣告形式,選擇靠譜的廣告公司就尤為重要了??梢酝ㄟ^(guò)三個(gè)維度來(lái)考量廣告推廣的效果:廣告覆蓋人群精準、內容有趣與實(shí)用性、廣告點(diǎn)擊量廣告覆蓋人群越精準、內容有趣與實(shí)用性越好,而廣告點(diǎn)擊量越高,品牌知名度就越高。我司可根據以上方面定制出適合的朋友圈廣告形式。
每個(gè)app推廣方式不一樣但都是通過(guò)一個(gè)渠道把你的產(chǎn)品推到目標用戶(hù)群體中,所以不同的app推廣方式也肯定不同,說(shuō)到底還是選擇適合自己的app推廣渠道來(lái)實(shí)現轉化率, 查看全部
沒(méi)有哪個(gè)app只投放廣告這一塊,就是朋友圈廣告
querylist采集微信公眾號文章數據,
沒(méi)有哪個(gè)app只投放廣告這一塊。要看你投放的是什么app,投放的什么廣告方式。不過(guò)確實(shí)有些app只投放廣告不做自身品牌推廣的。
我能想到的就是“seo+aso”
我能想到的就是朋友圈廣告了,但是小游戲目前是做不了的,其他一些app廣告的用戶(hù)已經(jīng)足夠覆蓋到的,甚至不需要推廣,
樓上那位觀(guān)點(diǎn)其實(shí)蠻對的。但是如果樓主只想看朋友圈廣告。
app營(yíng)銷(xiāo),廣告營(yíng)銷(xiāo),提高app商戶(hù)知名度,變現,然后才是品牌推廣。
朋友圈廣告大品牌推廣有效果,多數產(chǎn)品有10-50%roi。
相信這個(gè)問(wèn)題目前大多數app都會(huì )存在這個(gè)疑問(wèn),對于初期手機廣告市場(chǎng)最有效的推廣方式之一就是朋友圈廣告了。而對于app開(kāi)發(fā)者來(lái)說(shuō)選擇合適的廣告形式,選擇靠譜的廣告公司就尤為重要了??梢酝ㄟ^(guò)三個(gè)維度來(lái)考量廣告推廣的效果:廣告覆蓋人群精準、內容有趣與實(shí)用性、廣告點(diǎn)擊量廣告覆蓋人群越精準、內容有趣與實(shí)用性越好,而廣告點(diǎn)擊量越高,品牌知名度就越高。我司可根據以上方面定制出適合的朋友圈廣告形式。
每個(gè)app推廣方式不一樣但都是通過(guò)一個(gè)渠道把你的產(chǎn)品推到目標用戶(hù)群體中,所以不同的app推廣方式也肯定不同,說(shuō)到底還是選擇適合自己的app推廣渠道來(lái)實(shí)現轉化率,
選選擇擇自自建建圖圖文文文章章的方方法法示示例例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 87 次瀏覽 ? 2021-07-17 01:36
我通過(guò)微信公眾號微信公眾平臺獲取公眾號公眾號document文章章的一個(gè)例子。我自己維護了一個(gè)公眾號,但是因為個(gè)人關(guān)系,時(shí)間久了。沒(méi)有更新。今天上來(lái)緬懷,卻偶然發(fā)現了微信公眾號文章的獲取方式。之前獲取的方式很多,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不太好,但是操作簡(jiǎn)單易懂。所以。首先,您需要在微信公眾平臺上擁有一個(gè)帳戶(hù)。微信公眾平臺:/登錄后,進(jìn)入首頁(yè)點(diǎn)擊新建新建群發(fā)。 選擇選擇自建圖文::好像是公眾號操作教學(xué)進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接彈出選擇框,我們在框中輸入輸入對應的公眾號號碼名稱(chēng),會(huì )出現對應的文章列表。是不是很意外?您可以打開(kāi)控制臺并檢查是否打開(kāi)了請求的接口?;貜?,里面是我們需要的文字文章章鏈鏈接 確認數據后,我們需要對這個(gè)界面進(jìn)行分析分析。感覺(jué)非常簡(jiǎn)單。 GET 請求攜帶一些參數。 Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。當我們輸入官方賬號名稱(chēng)時(shí),點(diǎn)擊搜索。
可以看到搜索界面被觸發(fā),返回fakeid。這個(gè)接口需要的參數不多。接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。但是,仍然需要使用現有的cookies來(lái)避免免費登錄。 我沒(méi)有測試過(guò)當前cookie的有效期??赡苄枰皶r(shí)更新 cookie。測試代碼:1 import requests2 import json34 Cookie ='請改成自己的Cookie,獲取方式:直接復制' 5 url = "weixin com/cgi-bin/appmsg"6 headers = {7 "Cookie": Cookie,8 "User-Agent":'Mozilla/5 0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537 369}1011 keyword ='pythonlx' # 公眾號:可定制的12 token = '你的token' # 獲取方法:直接復制如上 13 search_url = 'weixin com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query=1415 doc = requests get(search_url,headers=headers) text16 jstext = json加載(文檔)17 fakeid = jstext['list'][0]['fakeid']1819 data = {20"token": token,21"lang": "zh_CN",22"f": "json" , 23"ajax":"1",24"action":"list_ex",25"begin":0,26"count":"5",27"query":"",28"fakeid":fakeid,29 "type": "9",30}31 json_test = requests get(url, headers=headers, params=data) text32 json_test = json load(json_test)33 print(json_test) 這會(huì )得到最新的10篇文章文章了, 如果你想獲得更多的組織ry文章,可以修改data中的“begin”參數,0是第一頁(yè),是第二頁(yè),10是第三頁(yè)(以此類(lèi)推)但是就像如果你想在一個(gè)大規模:請給自己安排一個(gè)穩定的Agent,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被封的可能性。以上就是本文的全部?jì)热?,希望對大家的學(xué)習有所幫助,也希望大家多多支持。 查看全部
選選擇擇自自建建圖圖文文文章章的方方法法示示例例
我通過(guò)微信公眾號微信公眾平臺獲取公眾號公眾號document文章章的一個(gè)例子。我自己維護了一個(gè)公眾號,但是因為個(gè)人關(guān)系,時(shí)間久了。沒(méi)有更新。今天上來(lái)緬懷,卻偶然發(fā)現了微信公眾號文章的獲取方式。之前獲取的方式很多,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不太好,但是操作簡(jiǎn)單易懂。所以。首先,您需要在微信公眾平臺上擁有一個(gè)帳戶(hù)。微信公眾平臺:/登錄后,進(jìn)入首頁(yè)點(diǎn)擊新建新建群發(fā)。 選擇選擇自建圖文::好像是公眾號操作教學(xué)進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接彈出選擇框,我們在框中輸入輸入對應的公眾號號碼名稱(chēng),會(huì )出現對應的文章列表。是不是很意外?您可以打開(kāi)控制臺并檢查是否打開(kāi)了請求的接口?;貜?,里面是我們需要的文字文章章鏈鏈接 確認數據后,我們需要對這個(gè)界面進(jìn)行分析分析。感覺(jué)非常簡(jiǎn)單。 GET 請求攜帶一些參數。 Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。當我們輸入官方賬號名稱(chēng)時(shí),點(diǎn)擊搜索。
可以看到搜索界面被觸發(fā),返回fakeid。這個(gè)接口需要的參數不多。接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。但是,仍然需要使用現有的cookies來(lái)避免免費登錄。 我沒(méi)有測試過(guò)當前cookie的有效期??赡苄枰皶r(shí)更新 cookie。測試代碼:1 import requests2 import json34 Cookie ='請改成自己的Cookie,獲取方式:直接復制' 5 url = "weixin com/cgi-bin/appmsg"6 headers = {7 "Cookie": Cookie,8 "User-Agent":'Mozilla/5 0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537 369}1011 keyword ='pythonlx' # 公眾號:可定制的12 token = '你的token' # 獲取方法:直接復制如上 13 search_url = 'weixin com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query=1415 doc = requests get(search_url,headers=headers) text16 jstext = json加載(文檔)17 fakeid = jstext['list'][0]['fakeid']1819 data = {20"token": token,21"lang": "zh_CN",22"f": "json" , 23"ajax":"1",24"action":"list_ex",25"begin":0,26"count":"5",27"query":"",28"fakeid":fakeid,29 "type": "9",30}31 json_test = requests get(url, headers=headers, params=data) text32 json_test = json load(json_test)33 print(json_test) 這會(huì )得到最新的10篇文章文章了, 如果你想獲得更多的組織ry文章,可以修改data中的“begin”參數,0是第一頁(yè),是第二頁(yè),10是第三頁(yè)(以此類(lèi)推)但是就像如果你想在一個(gè)大規模:請給自己安排一個(gè)穩定的Agent,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被封的可能性。以上就是本文的全部?jì)热?,希望對大家的學(xué)習有所幫助,也希望大家多多支持。
爬取所有可以發(fā)送的鏈接;每一篇文章都一個(gè)querylist中
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2021-07-16 20:24
querylist采集微信公眾號文章源代碼;從歷史新聞文章中爬取所有可以發(fā)送的鏈接;每一篇文章都存入一個(gè)querylist中。flag*flag=[];//發(fā)送請求的賬號flag_list[list]=[];//爬取器的賬號flag_list_combined;//發(fā)送請求的目標鏈接,這里應該可以是一個(gè)網(wǎng)址,也可以是一個(gè)頁(yè)面;flag_list_unique;//目標鏈接的唯一標識,文章來(lái)源標識userdefault[]userdefaults=[userdefaultsinit];flag[userdefaults]=[];這樣一些文章就有了對應userdefaults中userdefault列表的值,wechat_code就相當于一個(gè)鍵值對[]。
#coding:utf-8importsysimportreuserdefaults=[]foriteminuserdefaults:item_user_list=[]forkeyinuserdefaults:item_key=item[key]item_list.append(key)item_list=[]whiletrue:list=sys.argv[1]whilelist:want_item=want_item_list[0]item_list.append('[id]'+want_item)item_list.append(item_user_list[0])//發(fā)送請求want_item=want_item_list[1]list.append('[email]'+want_item+'\n')//結束爬取list.append('[date]'+want_item+'\n')//發(fā)送請求endroute=';list=[{querylist:[{wechat_code:553}]}];after>end'expires=[]//清除時(shí)間戳,表示該請求的時(shí)間戳是否結束foriteminlist:print('after',item.datetime(),'after',item.expires)print('date',item.datetime(),'s')//這里需要加上具體的時(shí)間戳print('fmt',item.fmt(),':',fmt)if__name__=='__main__':userdefaults=[]whiletrue:list=sys.argv[1]whilelist:print('format',"")//把list轉化為json格式的對象wechat_code=sys.argv[1]//這一步需要把format或者formattemperfectenter('wechat_code')轉化為unicodeuserdefaults.append('[id]'+wechat_code+'\n')item_list.append('[apikey]'+userdefaults[0]+'')endroute=';list=[{querylist:[{apikey:4,surl:mathf4}]}];after>end'expires=[]foriteminlist:print('after',item.datetime(),'after。 查看全部
爬取所有可以發(fā)送的鏈接;每一篇文章都一個(gè)querylist中
querylist采集微信公眾號文章源代碼;從歷史新聞文章中爬取所有可以發(fā)送的鏈接;每一篇文章都存入一個(gè)querylist中。flag*flag=[];//發(fā)送請求的賬號flag_list[list]=[];//爬取器的賬號flag_list_combined;//發(fā)送請求的目標鏈接,這里應該可以是一個(gè)網(wǎng)址,也可以是一個(gè)頁(yè)面;flag_list_unique;//目標鏈接的唯一標識,文章來(lái)源標識userdefault[]userdefaults=[userdefaultsinit];flag[userdefaults]=[];這樣一些文章就有了對應userdefaults中userdefault列表的值,wechat_code就相當于一個(gè)鍵值對[]。
#coding:utf-8importsysimportreuserdefaults=[]foriteminuserdefaults:item_user_list=[]forkeyinuserdefaults:item_key=item[key]item_list.append(key)item_list=[]whiletrue:list=sys.argv[1]whilelist:want_item=want_item_list[0]item_list.append('[id]'+want_item)item_list.append(item_user_list[0])//發(fā)送請求want_item=want_item_list[1]list.append('[email]'+want_item+'\n')//結束爬取list.append('[date]'+want_item+'\n')//發(fā)送請求endroute=';list=[{querylist:[{wechat_code:553}]}];after>end'expires=[]//清除時(shí)間戳,表示該請求的時(shí)間戳是否結束foriteminlist:print('after',item.datetime(),'after',item.expires)print('date',item.datetime(),'s')//這里需要加上具體的時(shí)間戳print('fmt',item.fmt(),':',fmt)if__name__=='__main__':userdefaults=[]whiletrue:list=sys.argv[1]whilelist:print('format',"")//把list轉化為json格式的對象wechat_code=sys.argv[1]//這一步需要把format或者formattemperfectenter('wechat_code')轉化為unicodeuserdefaults.append('[id]'+wechat_code+'\n')item_list.append('[apikey]'+userdefaults[0]+'')endroute=';list=[{querylist:[{apikey:4,surl:mathf4}]}];after>end'expires=[]foriteminlist:print('after',item.datetime(),'after。
h5頁(yè)面采集微信公眾號文章列表列表,websocket通訊協(xié)議采集
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 281 次瀏覽 ? 2021-07-11 21:03
querylist采集微信公眾號文章列表;h5頁(yè)面采集爬取微信公眾號文章列表;websocket通訊協(xié)議采集微信公眾號文章列表,或人工自動(dòng)發(fā)現。本文重點(diǎn)說(shuō)說(shuō)h5頁(yè)面采集微信公眾號文章列表。下載微信公眾號文章列表鏈接:-file-download-extractor簡(jiǎn)單代碼如下:開(kāi)發(fā)者工具目錄結構如下:以上代碼經(jīng)過(guò)測試,對需要爬取的文章鏈接提取得較為完整,現發(fā)出來(lái)供大家學(xué)習。
歡迎大家收藏。最后提供一個(gè)微信公眾號文章列表爬取地址供大家學(xué)習,請將鏈接復制以下方式:javascript鏈接png動(dòng)圖鏈接微信公眾號文章列表列表地址(在本文后發(fā)出)微信公眾號:制造工程師。
-file-download-extractor-for-wechat?id=5475這篇文章爬微信公眾號列表列表頁(yè),
用手機直接用瀏覽器登錄【微信公眾平臺】,輸入內容點(diǎn)擊發(fā)送按鈕即可爬取公眾號文章詳情頁(yè)。
,一起交流
我看到樓上有的說(shuō)爬取的文章列表可以下載,但我通過(guò)這個(gè)方法不能下載,
谷歌瀏覽器直接就可以
像我們要保存微信公眾號的文章列表網(wǎng)址,請看如下代碼:importrequestsimportjsonimportsysdefget_link_list(url):cookie={"token":"000003c43ef44104d74cd9d000","user_agent":"mozilla/5。0(windowsnt6。
1;win64;x64)applewebkit/537。36(khtml,likegecko)chrome/68。3323。149safari/537。36"}response=requests。get(url)。textreturnresponse。text[1]。encode("utf-8")defcopy_link_list(url):returnrequests。
get(url)。textitems=[]foriinchrome。executor。forward():forjinchrome。executor。forward():items。append(text(i)+':'+i+':'+str(j)+':'+str(i))defdownload_msg(url):url1=sys。
argv[0]url2=requests。get(url)。texturl3=sys。argv[1]return(url1+url2+url3)。 查看全部
h5頁(yè)面采集微信公眾號文章列表列表,websocket通訊協(xié)議采集
querylist采集微信公眾號文章列表;h5頁(yè)面采集爬取微信公眾號文章列表;websocket通訊協(xié)議采集微信公眾號文章列表,或人工自動(dòng)發(fā)現。本文重點(diǎn)說(shuō)說(shuō)h5頁(yè)面采集微信公眾號文章列表。下載微信公眾號文章列表鏈接:-file-download-extractor簡(jiǎn)單代碼如下:開(kāi)發(fā)者工具目錄結構如下:以上代碼經(jīng)過(guò)測試,對需要爬取的文章鏈接提取得較為完整,現發(fā)出來(lái)供大家學(xué)習。
歡迎大家收藏。最后提供一個(gè)微信公眾號文章列表爬取地址供大家學(xué)習,請將鏈接復制以下方式:javascript鏈接png動(dòng)圖鏈接微信公眾號文章列表列表地址(在本文后發(fā)出)微信公眾號:制造工程師。
-file-download-extractor-for-wechat?id=5475這篇文章爬微信公眾號列表列表頁(yè),
用手機直接用瀏覽器登錄【微信公眾平臺】,輸入內容點(diǎn)擊發(fā)送按鈕即可爬取公眾號文章詳情頁(yè)。
,一起交流
我看到樓上有的說(shuō)爬取的文章列表可以下載,但我通過(guò)這個(gè)方法不能下載,
谷歌瀏覽器直接就可以
像我們要保存微信公眾號的文章列表網(wǎng)址,請看如下代碼:importrequestsimportjsonimportsysdefget_link_list(url):cookie={"token":"000003c43ef44104d74cd9d000","user_agent":"mozilla/5。0(windowsnt6。
1;win64;x64)applewebkit/537。36(khtml,likegecko)chrome/68。3323。149safari/537。36"}response=requests。get(url)。textreturnresponse。text[1]。encode("utf-8")defcopy_link_list(url):returnrequests。
get(url)。textitems=[]foriinchrome。executor。forward():forjinchrome。executor。forward():items。append(text(i)+':'+i+':'+str(j)+':'+str(i))defdownload_msg(url):url1=sys。
argv[0]url2=requests。get(url)。texturl3=sys。argv[1]return(url1+url2+url3)。
針對什么類(lèi)型的公眾號,用什么漏斗獎勵機制?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 104 次瀏覽 ? 2021-07-08 01:03
querylist采集微信公眾號文章內容。針對什么類(lèi)型的公眾號,用什么類(lèi)型的漏斗獎勵機制。我就是個(gè)小白。關(guān)注微信公眾號,每天推送下一篇文章,早上更新下一篇。
優(yōu)點(diǎn)是可以根據興趣愛(ài)好分類(lèi)排列文章,用戶(hù)沒(méi)有分類(lèi)的情況下,依舊可以閱讀完整的文章,缺點(diǎn)是傳播廣度不夠,很多文章沒(méi)有分類(lèi)會(huì )很難推廣,
1.時(shí)效性強,文章靠提供優(yōu)質(zhì)內容2.排版整潔,主要是為了seo,可以拿去做首頁(yè)的排版3.重視質(zhì)量,從文章中心點(diǎn)來(lái)衡量是否有價(jià)值和有意義4.反饋體系不強大5.交互體系不強大,
站在微信的角度看,最需要的功能是一個(gè)分發(fā)平臺,拉攏平臺的更多用戶(hù)。這不僅僅是推送的問(wèn)題,更有內容策略上的問(wèn)題。推送一下讓用戶(hù)看看,對于做電商類(lèi),引流類(lèi),app類(lèi),小程序類(lèi)的平臺,都意義重大。
首先,個(gè)人認為是規模問(wèn)題;推送可以用爬蟲(chóng),先抓取,然后再推送,時(shí)效性高、數量也多。公眾號做新推送,傳播范圍太窄;至于文章標題,其實(shí)一篇能引發(fā)效用的內容還是少數,即使有吸引點(diǎn)也并不是大部分人都需要讀的(這就跟標題黨有異曲同工之妙了)。其次,可以提高分發(fā)內容的質(zhì)量,畢竟在那么短的推送時(shí)間內,平臺是要保持關(guān)注的(盡管現在因為有各種垃圾推送已經(jīng)很少了)。 查看全部
針對什么類(lèi)型的公眾號,用什么漏斗獎勵機制?
querylist采集微信公眾號文章內容。針對什么類(lèi)型的公眾號,用什么類(lèi)型的漏斗獎勵機制。我就是個(gè)小白。關(guān)注微信公眾號,每天推送下一篇文章,早上更新下一篇。
優(yōu)點(diǎn)是可以根據興趣愛(ài)好分類(lèi)排列文章,用戶(hù)沒(méi)有分類(lèi)的情況下,依舊可以閱讀完整的文章,缺點(diǎn)是傳播廣度不夠,很多文章沒(méi)有分類(lèi)會(huì )很難推廣,
1.時(shí)效性強,文章靠提供優(yōu)質(zhì)內容2.排版整潔,主要是為了seo,可以拿去做首頁(yè)的排版3.重視質(zhì)量,從文章中心點(diǎn)來(lái)衡量是否有價(jià)值和有意義4.反饋體系不強大5.交互體系不強大,
站在微信的角度看,最需要的功能是一個(gè)分發(fā)平臺,拉攏平臺的更多用戶(hù)。這不僅僅是推送的問(wèn)題,更有內容策略上的問(wèn)題。推送一下讓用戶(hù)看看,對于做電商類(lèi),引流類(lèi),app類(lèi),小程序類(lèi)的平臺,都意義重大。
首先,個(gè)人認為是規模問(wèn)題;推送可以用爬蟲(chóng),先抓取,然后再推送,時(shí)效性高、數量也多。公眾號做新推送,傳播范圍太窄;至于文章標題,其實(shí)一篇能引發(fā)效用的內容還是少數,即使有吸引點(diǎn)也并不是大部分人都需要讀的(這就跟標題黨有異曲同工之妙了)。其次,可以提高分發(fā)內容的質(zhì)量,畢竟在那么短的推送時(shí)間內,平臺是要保持關(guān)注的(盡管現在因為有各種垃圾推送已經(jīng)很少了)。
querylist采集微信公眾號文章的微信分發(fā)基本就是這樣
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-07-05 05:01
querylist采集微信公眾號文章內容,一般來(lái)說(shuō)都是做分詞處理的,自己把文章里面的關(guān)鍵詞提取出來(lái)放到wordlist里面去做replace,這樣的話(huà)seed會(huì )大一些,性能好一些。
目前公眾號文章的微信分發(fā)基本就是這樣:第一步是微信首頁(yè)上的相關(guān)信息,第二步才是文章頁(yè)面。所以只需要將api下發(fā)到微信的服務(wù)器,通過(guò)服務(wù)器端將api分發(fā)給文章頁(yè)面。所以微信公眾號才會(huì )推薦公眾號文章。知乎上代碼丟了,有些地方可能要和微信搞點(diǎn)不同,文章內容沒(méi)有遷移過(guò)來(lái),不能發(fā)的。
我也遇到這個(gè)問(wèn)題,經(jīng)過(guò)研究發(fā)現,要使用wifi進(jìn)行網(wǎng)絡(luò )請求。其中關(guān)鍵信息先獲取在服務(wù)器,然后將獲取的的信息保存在本地并返回給手機,最后再將本地收到的關(guān)鍵字發(fā)送到服務(wù)器。手機在接收到文章內容后,按照匹配規則來(lái)進(jìn)行解析,對合適的文章加載到excel里并推送到微信公眾號里。問(wèn)題已解決。雖然還未能完美實(shí)現,不過(guò)好在已解決。
很久前遇到過(guò)類(lèi)似問(wèn)題,真的不知道如何解決。后來(lái)發(fā)現大量用wx接口的就在互聯(lián)網(wǎng)上發(fā)布文章的,發(fā)布一篇首頁(yè)文章首先要分析上一篇文章是否有規律,如果有規律那可以在通訊錄、好友動(dòng)態(tài)、群、多媒體圖文、公眾號菜單等全部加上這個(gè)鏈接,這樣就會(huì )有最新一篇排行榜的功能,如果沒(méi)有規律的那就沒(méi)辦法了。 查看全部
querylist采集微信公眾號文章的微信分發(fā)基本就是這樣
querylist采集微信公眾號文章內容,一般來(lái)說(shuō)都是做分詞處理的,自己把文章里面的關(guān)鍵詞提取出來(lái)放到wordlist里面去做replace,這樣的話(huà)seed會(huì )大一些,性能好一些。
目前公眾號文章的微信分發(fā)基本就是這樣:第一步是微信首頁(yè)上的相關(guān)信息,第二步才是文章頁(yè)面。所以只需要將api下發(fā)到微信的服務(wù)器,通過(guò)服務(wù)器端將api分發(fā)給文章頁(yè)面。所以微信公眾號才會(huì )推薦公眾號文章。知乎上代碼丟了,有些地方可能要和微信搞點(diǎn)不同,文章內容沒(méi)有遷移過(guò)來(lái),不能發(fā)的。
我也遇到這個(gè)問(wèn)題,經(jīng)過(guò)研究發(fā)現,要使用wifi進(jìn)行網(wǎng)絡(luò )請求。其中關(guān)鍵信息先獲取在服務(wù)器,然后將獲取的的信息保存在本地并返回給手機,最后再將本地收到的關(guān)鍵字發(fā)送到服務(wù)器。手機在接收到文章內容后,按照匹配規則來(lái)進(jìn)行解析,對合適的文章加載到excel里并推送到微信公眾號里。問(wèn)題已解決。雖然還未能完美實(shí)現,不過(guò)好在已解決。
很久前遇到過(guò)類(lèi)似問(wèn)題,真的不知道如何解決。后來(lái)發(fā)現大量用wx接口的就在互聯(lián)網(wǎng)上發(fā)布文章的,發(fā)布一篇首頁(yè)文章首先要分析上一篇文章是否有規律,如果有規律那可以在通訊錄、好友動(dòng)態(tài)、群、多媒體圖文、公眾號菜單等全部加上這個(gè)鏈接,這樣就會(huì )有最新一篇排行榜的功能,如果沒(méi)有規律的那就沒(méi)辦法了。
python爬取搜狗微信公眾號文章永久鏈接(圖)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 186 次瀏覽 ? 2021-07-04 03:27
python爬取搜狗微信公眾號文章永久鏈接
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息
固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url)
# 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content
with open("urli.jpg", "wb") as f:
f.write(url_img)
# f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//div[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i)
# 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"]
except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"]
if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10)
# time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s)
# time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name}) 查看全部
python爬取搜狗微信公眾號文章永久鏈接(圖)
python爬取搜狗微信公眾號文章永久鏈接
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息




固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url)
# 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content
with open("urli.jpg", "wb") as f:
f.write(url_img)
# f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//div[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i)
# 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"]
except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"]
if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10)
# time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s)
# time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
搜狗微信上當天信息排名指定輸入關(guān)鍵字怎么做?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 116 次瀏覽 ? 2021-07-04 03:22
這個(gè)文章主要介紹python如何抓取搜狗微信公眾號文章永久鏈接。小編覺(jué)得還不錯?,F在分享給大家,給大家一個(gè)參考。跟著(zhù)小編一起來(lái)看看吧。
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息
固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url) # 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i) # 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公眾號文章permanent鏈接的詳細內容。更多詳情請關(guān)注Gxl其他相關(guān)文章! 查看全部
搜狗微信上當天信息排名指定輸入關(guān)鍵字怎么做?
這個(gè)文章主要介紹python如何抓取搜狗微信公眾號文章永久鏈接。小編覺(jué)得還不錯?,F在分享給大家,給大家一個(gè)參考。跟著(zhù)小編一起來(lái)看看吧。
本文主要講解思路,代碼部分請自行解決
獲取搜狗微信當天信息排名
指定輸入關(guān)鍵字,通過(guò)scrapy抓取公眾號
登錄微信公眾號鏈接獲取cookie信息
由于微信公眾平臺模擬登錄未解決,需要手動(dòng)登錄實(shí)時(shí)獲取cookie信息




固定鏈接可以在這里轉換
代碼部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------請輸入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信訪(fǎng)問(wèn)頻率會(huì )過(guò)快導致需要輸入驗證碼
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判斷url 是否是需要輸入驗證碼
res = re.search("from", response.url) # 需要驗證碼驗證
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("請輸入驗證碼:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要驗證碼驗證
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d條" % i) # 轉化永久鏈接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:請求失敗,登陸失敗, 請重新登陸*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最終鏈接為:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("與所選文章不同放棄")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("與所選公眾號不一致放棄")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公眾號文章permanent鏈接的詳細內容。更多詳情請關(guān)注Gxl其他相關(guān)文章!
不用提交詞典的方法用的是該方法合并詞典
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 118 次瀏覽 ? 2021-07-01 04:02
querylist采集微信公眾號文章推薦信息的時(shí)候,只要把詞匯前綴去掉就可以得到這個(gè)關(guān)鍵詞的取值了。所以你上面那句代碼的問(wèn)題應該是還沒(méi)有去掉詞匯前綴。search_vars=preg_match_search(filter_variable,capsule_example)然后就去查對應關(guān)鍵詞對應的詞典了。
取出搜索值search_vars查詞匯對應的詞典這樣子
python有一個(gè)filter_variable參數可以滿(mǎn)足題主需求,
直接在循環(huán)里面遞歸查吧。querylist+groupby不推薦。最終結果一定要合并詞典,
再從詞庫里查詞,
python+matplotlib=不會(huì )遞歸你還在這里折騰干嘛!推薦個(gè)工具:支持第三方庫的運行器spidercreate_class
pipinstallsort_url
其實(shí)都可以用knn來(lái)滿(mǎn)足要求,不過(guò)可能all_capital指定了一個(gè)區間。
importmatplotlib.pyplotaspltfromfilter_mapimportsort_urls
補充一個(gè)可以用groupby實(shí)現,需要自己編程實(shí)現,這是我上課時(shí)候自己寫(xiě)的例子,實(shí)際運行效果,每一步都會(huì )記錄詞頻sort_urls_with_idx:#一個(gè)列表,分別是每個(gè)關(guān)鍵詞出現的概率defsort_urls(url,idx):#不用提交詞典bot=sort_urls(url,idx)whiletrue:#以下每個(gè)關(guān)鍵詞window=idx。
pop()count_urls=idx[0]comment=idx[1]window=[idx[0],idx[1]]print(window。extend(range(。
4),window.size,even(numberofrange(1,1
0),numberofnumberofnumberofnumberofspecified_urls)))print(window.extend(range
4),range(1,1
0),even(numberofnumberofnumberofspecified_urls)))returncomment現在查詞頻的方法用的是該方法,然后jieba,一般也要數據格式化,當然,也可以用,不用記錄語(yǔ)料內容, 查看全部
不用提交詞典的方法用的是該方法合并詞典
querylist采集微信公眾號文章推薦信息的時(shí)候,只要把詞匯前綴去掉就可以得到這個(gè)關(guān)鍵詞的取值了。所以你上面那句代碼的問(wèn)題應該是還沒(méi)有去掉詞匯前綴。search_vars=preg_match_search(filter_variable,capsule_example)然后就去查對應關(guān)鍵詞對應的詞典了。
取出搜索值search_vars查詞匯對應的詞典這樣子
python有一個(gè)filter_variable參數可以滿(mǎn)足題主需求,
直接在循環(huán)里面遞歸查吧。querylist+groupby不推薦。最終結果一定要合并詞典,
再從詞庫里查詞,
python+matplotlib=不會(huì )遞歸你還在這里折騰干嘛!推薦個(gè)工具:支持第三方庫的運行器spidercreate_class
pipinstallsort_url
其實(shí)都可以用knn來(lái)滿(mǎn)足要求,不過(guò)可能all_capital指定了一個(gè)區間。
importmatplotlib.pyplotaspltfromfilter_mapimportsort_urls
補充一個(gè)可以用groupby實(shí)現,需要自己編程實(shí)現,這是我上課時(shí)候自己寫(xiě)的例子,實(shí)際運行效果,每一步都會(huì )記錄詞頻sort_urls_with_idx:#一個(gè)列表,分別是每個(gè)關(guān)鍵詞出現的概率defsort_urls(url,idx):#不用提交詞典bot=sort_urls(url,idx)whiletrue:#以下每個(gè)關(guān)鍵詞window=idx。
pop()count_urls=idx[0]comment=idx[1]window=[idx[0],idx[1]]print(window。extend(range(。
4),window.size,even(numberofrange(1,1
0),numberofnumberofnumberofnumberofspecified_urls)))print(window.extend(range
4),range(1,1
0),even(numberofnumberofnumberofspecified_urls)))returncomment現在查詞頻的方法用的是該方法,然后jieba,一般也要數據格式化,當然,也可以用,不用記錄語(yǔ)料內容,
下篇文章:python爬蟲(chóng)如何爬取微信公眾號文章(二)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 107 次瀏覽 ? 2021-06-23 21:35
第二部分文章:python爬蟲(chóng)如何抓取微信公眾號文章(二)
下一篇如何連接python爬蟲(chóng)實(shí)現微信公眾號文章每日推送
因為最近在法庭實(shí)習,需要一些公眾號資料,然后做成網(wǎng)頁(yè)展示,方便查看。之前寫(xiě)過(guò)一些爬蟲(chóng),但是都是爬網(wǎng)站數據。這一次本以為會(huì )很容易,但是遇到了很多麻煩。分享給大家。
1、 使用爬蟲(chóng)爬取數據最基本也是最重要的一點(diǎn)就是找到目標網(wǎng)站的url地址,然后遍歷地址一個(gè)一個(gè)或者多線(xiàn)程爬取。一般后續的爬取地址主要有兩種獲取方式,一種是根據頁(yè)面分頁(yè)計算出URL地址的規律,通常后跟參數page=num,另一種是過(guò)濾掉當前的標簽頁(yè)面,取出URL作為后續的爬取地址。遺憾的是,這兩種方法都不能在微信公眾號中使用。原因是公眾號的文章地址之間沒(méi)有關(guān)聯(lián),不可能通過(guò)一個(gè)文章地址找到所有文章地址。
2、 那我們如何獲取公眾號文章地址的歷史記錄呢?一種方法是通過(guò)搜狗微信網(wǎng)站搜索目標公眾號,可以看到最近的文章,但只是最近的無(wú)法獲取歷史文章。如果你想每天爬一次,可以用這個(gè)方法每天爬一個(gè)。圖片是這樣的:
3、當然了,我們需要的結果很多,所以還是得想辦法把所有的歷史文本都弄出來(lái),廢話(huà)少說(shuō),直入正題:
首先要注冊一個(gè)微信公眾號(訂閱號),可以注冊個(gè)人,比較簡(jiǎn)單,步驟網(wǎng)上都有,這里就不介紹了。 (如果之前有的話(huà),就不需要注冊了)
注冊后,登錄微信公眾平臺,在首頁(yè)左欄的管理下,有一個(gè)素材管理,如圖:
點(diǎn)擊素材管理,然后選擇圖文信息,然后點(diǎn)擊右側新建圖文素材:
轉到新頁(yè)面并單擊頂部的超鏈接:
然后在彈窗中選擇查找文章,輸入要爬取的公眾號名稱(chēng),搜索:
然后點(diǎn)擊搜索到的公眾號,可以看到它的所有歷史文章:
4、找到history文章后,我們如何編寫(xiě)一個(gè)程序來(lái)獲取所有的URL地址? ,首先我們來(lái)分析一下瀏覽器在點(diǎn)擊公眾號名稱(chēng)時(shí)做了什么,調出查看頁(yè)面,點(diǎn)擊網(wǎng)絡(luò ),先清除所有數據,然后點(diǎn)擊目標公眾號,可以看到如下界面:
點(diǎn)擊字符串后,再點(diǎn)擊標題:
找到將軍。這里的Request Url就是我們的程序需要請求的地址格式。我們需要把它拼接起來(lái)。里面的參數在下面的Query String Parameters里面比較清楚:
這些參數的含義很容易理解。唯一需要說(shuō)明的是,fakeid 是公眾號的唯一標識。每個(gè)官方賬號都不一樣。如果爬取其他公眾號,只需要修改這個(gè)參數即可。隨機可以省略。
另外一個(gè)重要的部分是Request Headers,里面收錄了cookie、User-Agent等重要信息,在下面的代碼中會(huì )用到:
5、 經(jīng)過(guò)以上分析,就可以開(kāi)始寫(xiě)代碼了。
需要的第一個(gè)參數:
#目標urlurl = "./cgi-bin/appmsg"#使用cookies,跳過(guò)登錄操作headers = {"Cookie": "ua_id=YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU=; pgv_pvi=232_58780000000bRx0cVU=; pgv_pvi=232_58780000000000a = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39SU7awJMxhDVb4AbVXJM =; mm_lang = zh_CN的 “” 用戶(hù)代理 “:” 的Mozilla / 5
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}
根據自己的cookie和token進(jìn)行修改,然后發(fā)送請求獲取響應,去掉每個(gè)文章的title和url,代碼如下:
content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers = headers, params=data).json() # 返回一個(gè)json,里面收錄content_json["app_msg_list"]中item每頁(yè)的數據:#提取每頁(yè)的標題文章和對應的url items = [ ] items.append(item["title"]) items.append(item["link"]) content_list.append(items)
第一個(gè) for 循環(huán)是抓取的頁(yè)面數。首先需要看好公眾號歷史記錄文章列表中的總頁(yè)數。這個(gè)數字只能小于頁(yè)數。更改數據["begin"],表示從前幾條開(kāi)始,每次5條,注意爬取太多和太頻繁,否則會(huì )被ip和cookies攔截,嚴重的話(huà),公眾號會(huì )被封號的,請多多關(guān)照。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .被屏蔽了。
然后按如下方式保存標題和網(wǎng)址:
name=["title","link"]test=pd.DataFrame(columns=name,data=content_list)test.to_csv("XXX.csv",mode="a",encoding="utf-8 ")print("保存成功")
完整的程序如下:
# -*- coding: utf-8 -*-import requestsimport timeimport csvimport pandas as pd# Target urlurl = "./cgi-bin/appmsg"# 使用cookies跳過(guò)登錄操作 headers = { “曲奇”:“ua_id = YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU =; pgv_pvi = 2045358080; pgv_si = s4132856832; UUID = 48da56b488e5c697909a13dfac91a819; bizuin = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%40smail.nju。 ; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39S U7awJMxhDVb4AbVXJM =; mm_lang = zh_CN "," User-Agent ":" Mozilla / 5 .
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers=headers, params=data).json() # 返回一個(gè)json,里面收錄每個(gè)頁(yè)面的數據for item in content_json["app_msg_list"]: # 提取每個(gè)頁(yè)面的標題文章和對應的url items = [] items.
append(item["title"]) 項。追加(項目[“鏈接”])內容列表。 append(items) print(i)name=["title","link"]test=pd.數據幀(列=名稱(chēng),數據=內容列表)測試。 to_csv("xingzhengzhifa.csv",mode="a",encoding="utf-8")print("保存成功")
最后保存的文件如圖:
獲取每個(gè)文章的url后,可以遍歷爬取每個(gè)文章的內容。關(guān)于爬取文章內容的部分將在下一篇博文中介紹。
補充內容:
關(guān)于如何從小伙伴那里獲取文章封面圖片和摘要的問(wèn)題,查看瀏覽器可以看到返回的json數據中收錄了很多信息,包括封面圖片和摘要
只需要 items.append(item["digest"]) 來(lái)保存文章summary。其他字段如發(fā)布時(shí)間可獲取。
關(guān)于獲取閱讀數和點(diǎn)贊數的問(wèn)題,沒(méi)有辦法通過(guò)本題的方法獲取,因為網(wǎng)頁(yè)公眾號文章沒(méi)有閱讀數以及點(diǎn)贊數。這需要使用電腦版微信或者手機版微信通過(guò)抓包工具獲取。
關(guān)于ip代理,統計頁(yè)數,多次保存,我在公眾號文章中介紹過(guò),有需要的可以看看 查看全部
下篇文章:python爬蟲(chóng)如何爬取微信公眾號文章(二)
第二部分文章:python爬蟲(chóng)如何抓取微信公眾號文章(二)
下一篇如何連接python爬蟲(chóng)實(shí)現微信公眾號文章每日推送
因為最近在法庭實(shí)習,需要一些公眾號資料,然后做成網(wǎng)頁(yè)展示,方便查看。之前寫(xiě)過(guò)一些爬蟲(chóng),但是都是爬網(wǎng)站數據。這一次本以為會(huì )很容易,但是遇到了很多麻煩。分享給大家。
1、 使用爬蟲(chóng)爬取數據最基本也是最重要的一點(diǎn)就是找到目標網(wǎng)站的url地址,然后遍歷地址一個(gè)一個(gè)或者多線(xiàn)程爬取。一般后續的爬取地址主要有兩種獲取方式,一種是根據頁(yè)面分頁(yè)計算出URL地址的規律,通常后跟參數page=num,另一種是過(guò)濾掉當前的標簽頁(yè)面,取出URL作為后續的爬取地址。遺憾的是,這兩種方法都不能在微信公眾號中使用。原因是公眾號的文章地址之間沒(méi)有關(guān)聯(lián),不可能通過(guò)一個(gè)文章地址找到所有文章地址。
2、 那我們如何獲取公眾號文章地址的歷史記錄呢?一種方法是通過(guò)搜狗微信網(wǎng)站搜索目標公眾號,可以看到最近的文章,但只是最近的無(wú)法獲取歷史文章。如果你想每天爬一次,可以用這個(gè)方法每天爬一個(gè)。圖片是這樣的:
3、當然了,我們需要的結果很多,所以還是得想辦法把所有的歷史文本都弄出來(lái),廢話(huà)少說(shuō),直入正題:
首先要注冊一個(gè)微信公眾號(訂閱號),可以注冊個(gè)人,比較簡(jiǎn)單,步驟網(wǎng)上都有,這里就不介紹了。 (如果之前有的話(huà),就不需要注冊了)
注冊后,登錄微信公眾平臺,在首頁(yè)左欄的管理下,有一個(gè)素材管理,如圖:
點(diǎn)擊素材管理,然后選擇圖文信息,然后點(diǎn)擊右側新建圖文素材:
轉到新頁(yè)面并單擊頂部的超鏈接:
然后在彈窗中選擇查找文章,輸入要爬取的公眾號名稱(chēng),搜索:
然后點(diǎn)擊搜索到的公眾號,可以看到它的所有歷史文章:
4、找到history文章后,我們如何編寫(xiě)一個(gè)程序來(lái)獲取所有的URL地址? ,首先我們來(lái)分析一下瀏覽器在點(diǎn)擊公眾號名稱(chēng)時(shí)做了什么,調出查看頁(yè)面,點(diǎn)擊網(wǎng)絡(luò ),先清除所有數據,然后點(diǎn)擊目標公眾號,可以看到如下界面:
點(diǎn)擊字符串后,再點(diǎn)擊標題:
找到將軍。這里的Request Url就是我們的程序需要請求的地址格式。我們需要把它拼接起來(lái)。里面的參數在下面的Query String Parameters里面比較清楚:
這些參數的含義很容易理解。唯一需要說(shuō)明的是,fakeid 是公眾號的唯一標識。每個(gè)官方賬號都不一樣。如果爬取其他公眾號,只需要修改這個(gè)參數即可。隨機可以省略。
另外一個(gè)重要的部分是Request Headers,里面收錄了cookie、User-Agent等重要信息,在下面的代碼中會(huì )用到:
5、 經(jīng)過(guò)以上分析,就可以開(kāi)始寫(xiě)代碼了。
需要的第一個(gè)參數:
#目標urlurl = "./cgi-bin/appmsg"#使用cookies,跳過(guò)登錄操作headers = {"Cookie": "ua_id=YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU=; pgv_pvi=232_58780000000bRx0cVU=; pgv_pvi=232_58780000000000a = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39SU7awJMxhDVb4AbVXJM =; mm_lang = zh_CN的 “” 用戶(hù)代理 “:” 的Mozilla / 5
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}
根據自己的cookie和token進(jìn)行修改,然后發(fā)送請求獲取響應,去掉每個(gè)文章的title和url,代碼如下:
content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers = headers, params=data).json() # 返回一個(gè)json,里面收錄content_json["app_msg_list"]中item每頁(yè)的數據:#提取每頁(yè)的標題文章和對應的url items = [ ] items.append(item["title"]) items.append(item["link"]) content_list.append(items)
第一個(gè) for 循環(huán)是抓取的頁(yè)面數。首先需要看好公眾號歷史記錄文章列表中的總頁(yè)數。這個(gè)數字只能小于頁(yè)數。更改數據["begin"],表示從前幾條開(kāi)始,每次5條,注意爬取太多和太頻繁,否則會(huì )被ip和cookies攔截,嚴重的話(huà),公眾號會(huì )被封號的,請多多關(guān)照。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .被屏蔽了。
然后按如下方式保存標題和網(wǎng)址:
name=["title","link"]test=pd.DataFrame(columns=name,data=content_list)test.to_csv("XXX.csv",mode="a",encoding="utf-8 ")print("保存成功")
完整的程序如下:
# -*- coding: utf-8 -*-import requestsimport timeimport csvimport pandas as pd# Target urlurl = "./cgi-bin/appmsg"# 使用cookies跳過(guò)登錄操作 headers = { “曲奇”:“ua_id = YF6RyP41YQa2QyQHAAAAAGXPy_he8M8KkNCUbRx0cVU =; pgv_pvi = 2045358080; pgv_si = s4132856832; UUID = 48da56b488e5c697909a13dfac91a819; bizuin = 3231163757;門(mén)票= 5bd41c51e53cfce785e5c188f94240aac8fad8e3; TICKET_ID = gh_d5e73af61440;證書(shū)= bVSKoAHHVIldcRZp10_fd7p2aTEXrTi6; noticeLoginFlag = 1; remember_acct = mf1832192%40smail.nju。 ; data_bizuin = 3231163757; data_ticket = XKgzAcTceBFDNN6cFXa4TZAVMlMlxhorD7A0r3vzCDkS ++ pgSpr55NFkQIN3N + / v; slave_sid = bU0yeTNOS2VxcEg5RktUQlZhd2xheVc5bjhoQTVhOHdhMnN2SlVIZGRtU3hvVXJpTWdWakVqcHowd3RuVF9HY19Udm1PbVpQMGVfcnhHVGJQQTVzckpQY042QlZZbnJzel9oam5SdjRFR0tGc0c1eExKQU9ybjgxVnZVZVBtSmVnc29ZcUJWVmNWWEFEaGtk; slave_user = gh_d5e73af61440; XID = 93074c5a87a2e98ddb9e527aa204d0c7; openid2ticket_obaWXwJGb9VV9FiHPMcNq7OZzlzY = lw6SBHGUDQf1lFHqOeShfg39S U7awJMxhDVb4AbVXJM =; mm_lang = zh_CN "," User-Agent ":" Mozilla / 5 .
0 (Windows NT 10. 0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",}data = {"token ": "1378111188", "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "5", "query": "", "fakeid": "MzU5MDUzMTk5Nw==", "type": "9",}content_list = []for i in range(20): data["begin"] = i*5 time.sleep(3) # 使用get方法提交 content_json = requests.get(url, headers=headers, params=data).json() # 返回一個(gè)json,里面收錄每個(gè)頁(yè)面的數據for item in content_json["app_msg_list"]: # 提取每個(gè)頁(yè)面的標題文章和對應的url items = [] items.
append(item["title"]) 項。追加(項目[“鏈接”])內容列表。 append(items) print(i)name=["title","link"]test=pd.數據幀(列=名稱(chēng),數據=內容列表)測試。 to_csv("xingzhengzhifa.csv",mode="a",encoding="utf-8")print("保存成功")
最后保存的文件如圖:
獲取每個(gè)文章的url后,可以遍歷爬取每個(gè)文章的內容。關(guān)于爬取文章內容的部分將在下一篇博文中介紹。
補充內容:
關(guān)于如何從小伙伴那里獲取文章封面圖片和摘要的問(wèn)題,查看瀏覽器可以看到返回的json數據中收錄了很多信息,包括封面圖片和摘要
只需要 items.append(item["digest"]) 來(lái)保存文章summary。其他字段如發(fā)布時(shí)間可獲取。
關(guān)于獲取閱讀數和點(diǎn)贊數的問(wèn)題,沒(méi)有辦法通過(guò)本題的方法獲取,因為網(wǎng)頁(yè)公眾號文章沒(méi)有閱讀數以及點(diǎn)贊數。這需要使用電腦版微信或者手機版微信通過(guò)抓包工具獲取。
關(guān)于ip代理,統計頁(yè)數,多次保存,我在公眾號文章中介紹過(guò),有需要的可以看看
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 144 次瀏覽 ? 2021-06-22 01:35
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
public void getMsgExt(String str,String url) {
// TODO Auto-generated method stub
String biz = "";
String sn = "";
Map queryStrs = HttpUrlParser.parseUrl(url);
if(queryStrs != null){
biz = queryStrs.get("__biz");
biz = biz + "==";
sn = queryStrs.get("sn");
sn = "%" + sn + "%";
}
/**
* $sql = "select * from `文章表` where `biz`='".$biz."'
* and `content_url` like '%".$sn."%'" limit 0,1;
* 根據biz和sn找到對應的文章
*/
Post post = postMapper.selectByBizAndSn(biz, sn);
if(post == null){
System.out.println("biz:"+biz);
System.out.println("sn:"+sn);
tmpListMapper.deleteByLoad(1);
return;
}
// System.out.println("json數據:"+str);
Integer read_num;
Integer like_num;
try{
read_num = JsonPath.read(str, "['appmsgstat']['read_num']");//閱讀量
like_num = JsonPath.read(str, "['appmsgstat']['like_num']");//點(diǎn)贊量
}catch(Exception e){
read_num = 123;//閱讀量
like_num = 321;//點(diǎn)贊量
System.out.println("read_num:"+read_num);
System.out.println("like_num:"+like_num);
System.out.println(e.getMessage());
}
/**
* 在這里同樣根據sn在采集隊列表中刪除對應的文章,代表這篇文章可以移出采集隊列了
* $sql = "delete from `隊列表` where `content_url` like '%".$sn."%'"
*/
tmpListMapper.deleteBySn(sn);
//然后將閱讀量和點(diǎn)贊量更新到文章表中。
post.setReadnum(read_num);
post.setLikenum(like_num);
postMapper.updateByPrimaryKey(post);
}
通過(guò)處理跳轉將js注入微信的方法:
public String getWxHis() {
String url = "";
// TODO Auto-generated method stub
/**
* 當前頁(yè)面為公眾號歷史消息時(shí),讀取這個(gè)程序
* 在采集隊列表中有一個(gè)load字段,當值等于1時(shí)代表正在被讀取
* 首先刪除采集隊列表中load=1的行
* 然后從隊列表中任意select一行
*/
tmpListMapper.deleteByLoad(1);
TmpList queue = tmpListMapper.selectRandomOne();
System.out.println("queue is null?"+queue);
if(queue == null){//隊列表為空
/**
* 隊列表如果空了,就從存儲公眾號biz的表中取得一個(gè)biz,
* 這里我在公眾號表中設置了一個(gè)采集時(shí)間的time字段,按照正序排列之后,
* 就得到時(shí)間戳最小的一個(gè)公眾號記錄,并取得它的biz
*/
WeiXin weiXin = weiXinMapper.selectOne();
String biz = weiXin.getBiz();
url = "https://mp.weixin.qq.com/mp/pr ... ot%3B + biz +
"#wechat_redirect";//拼接公眾號歷史消息url地址(第二種頁(yè)面形式)
//更新剛才提到的公眾號表中的采集時(shí)間time字段為當前時(shí)間戳。
weiXin.setCollect(System.currentTimeMillis());
int result = weiXinMapper.updateByPrimaryKey(weiXin);
System.out.println("getHis weiXin updateResult:"+result);
}else{
//取得當前這一行的content_url字段
url = queue.getContentUrl();
//將load字段update為1
tmpListMapper.updateByContentUrl(url);
}
//將下一個(gè)將要跳轉的$url變成js腳本,由anyproxy注入到微信頁(yè)面中。
//echo "setTimeout(function(){window.location.href='".$url."';},2000);";
int randomTime = new Random().nextInt(3) + 3;
String jsCode = "setTimeout(function(){window.location.href='"+url+"';},"+randomTime*1000+");";
return jsCode;
}
以上是對代理服務(wù)器截獲的數據進(jìn)行處理的流程。有一個(gè)問(wèn)題需要注意。程序會(huì )循環(huán)訪(fǎng)問(wèn)數據庫中的每個(gè)收錄公眾號,甚至會(huì )再次訪(fǎng)問(wèn)存儲的文章,以不斷更新文章Count和like count的讀數。如果需要抓大量公眾號,建議修改添加任務(wù)隊列的代碼,添加條件限制。否則,公眾號多輪重復抓取數據會(huì )極大影響效率。
到目前為止,我們已經(jīng)抓取了微信公眾號的所有文章鏈接,并且這個(gè)鏈接是一個(gè)可以在瀏覽器中打開(kāi)的永久鏈接。下一步就是編寫(xiě)爬蟲(chóng)程序,從數據庫中抓取鏈接,爬取文章內容等信息。
我用webmagic寫(xiě)了一個(gè)爬蟲(chóng),輕量級好用。
public class SpiderModel implements PageProcessor{
private static PostMapper postMapper;
private static List posts;
// 抓取網(wǎng)站的相關(guān)配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
// TODO Auto-generated method stub
return this.site;
}
public void process(Page page) {
// TODO Auto-generated method stub
Post post = posts.remove(0);
String content = page.getHtml().xpath("//div[@id='js_content']").get();
//存在和諧文章 此處做判定如果有直接刪除記錄或設置表示位表示文章被和諧
if(content == null){
System.out.println("文章已和諧!");
//postMapper.deleteByPrimaryKey(post.getId());
return;
}
String contentSnap = content.replaceAll("data-src", "src").replaceAll("preview.html", "player.html");//快照
String contentTxt = HtmlToWord.stripHtml(content);//純文本內容
Selectable metaContent = page.getHtml().xpath("//div[@id='meta_content']");
String pubTime = null;
String wxname = null;
String author = null;
if(metaContent != null){
pubTime = metaContent.xpath("//em[@id='post-date']").get();
if(pubTime != null){
pubTime = HtmlToWord.stripHtml(pubTime);//文章發(fā)布時(shí)間
}
wxname = metaContent.xpath("//a[@id='post-user']").get();
if(wxname != null){
wxname = HtmlToWord.stripHtml(wxname);//公眾號名稱(chēng)
}
author = metaContent.xpath("//em[@class='rich_media_meta rich_media_meta_text' and @id!='post-date']").get();
if(author != null){
author = HtmlToWord.stripHtml(author);//文章作者
}
}
// System.out.println("發(fā)布時(shí)間:"+pubTime);
// System.out.println("公眾號名稱(chēng):"+wxname);
// System.out.println("文章作者:"+author);
String title = post.getTitle().replaceAll("?", "");//文章標題
String digest = post.getDigest();//文章摘要
int likeNum = post.getLikenum();//文章點(diǎn)贊數
int readNum = post.getReadnum();//文章閱讀數
String contentUrl = post.getContentUrl();//文章鏈接
WechatInfoBean wechatBean = new WechatInfoBean();
wechatBean.setTitle(title);
wechatBean.setContent(contentTxt);//純文本內容
wechatBean.setSourceCode(contentSnap);//快照
wechatBean.setLikeCount(likeNum);
wechatBean.setViewCount(readNum);
wechatBean.setAbstractText(digest);//摘要
wechatBean.setUrl(contentUrl);
wechatBean.setPublishTime(pubTime);
wechatBean.setSiteName(wxname);//站點(diǎn)名稱(chēng) 公眾號名稱(chēng)
wechatBean.setAuthor(author);
wechatBean.setMediaType("微信公眾號");//來(lái)源媒體類(lèi)型
WechatStorage.saveWechatInfo(wechatBean);
//標示文章已經(jīng)被爬取
post.setIsSpider(1);
postMapper.updateByPrimaryKey(post);
}
public static void startSpider(List inposts,PostMapper myPostMapper,String... urls){
long startTime, endTime;
startTime = System.currentTimeMillis();
postMapper = myPostMapper;
posts = inposts;
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
SpiderModel spiderModel = new SpiderModel();
Spider mySpider = Spider.create(spiderModel).addUrl(urls);
mySpider.setDownloader(httpClientDownloader);
try {
SpiderMonitor.instance().register(mySpider);
mySpider.thread(1).run();
} catch (JMException e) {
e.printStackTrace();
}
endTime = System.currentTimeMillis();
System.out.println("爬取時(shí)間" + ((endTime - startTime) / 1000) + "秒--");
}
}
其他與邏輯無(wú)關(guān)的數據存儲代碼將不再發(fā)布。這里我將代理服務(wù)器抓取的數據存放在mysql中,將我的爬蟲(chóng)程序抓取到的數據存放在mongodb中。
以下是我爬取的公眾號信息:
查看全部
用webmagic寫(xiě)的爬蟲(chóng)程序從數據庫中拿鏈接爬取文章內容等信息
public void getMsgExt(String str,String url) {
// TODO Auto-generated method stub
String biz = "";
String sn = "";
Map queryStrs = HttpUrlParser.parseUrl(url);
if(queryStrs != null){
biz = queryStrs.get("__biz");
biz = biz + "==";
sn = queryStrs.get("sn");
sn = "%" + sn + "%";
}
/**
* $sql = "select * from `文章表` where `biz`='".$biz."'
* and `content_url` like '%".$sn."%'" limit 0,1;
* 根據biz和sn找到對應的文章
*/
Post post = postMapper.selectByBizAndSn(biz, sn);
if(post == null){
System.out.println("biz:"+biz);
System.out.println("sn:"+sn);
tmpListMapper.deleteByLoad(1);
return;
}
// System.out.println("json數據:"+str);
Integer read_num;
Integer like_num;
try{
read_num = JsonPath.read(str, "['appmsgstat']['read_num']");//閱讀量
like_num = JsonPath.read(str, "['appmsgstat']['like_num']");//點(diǎn)贊量
}catch(Exception e){
read_num = 123;//閱讀量
like_num = 321;//點(diǎn)贊量
System.out.println("read_num:"+read_num);
System.out.println("like_num:"+like_num);
System.out.println(e.getMessage());
}
/**
* 在這里同樣根據sn在采集隊列表中刪除對應的文章,代表這篇文章可以移出采集隊列了
* $sql = "delete from `隊列表` where `content_url` like '%".$sn."%'"
*/
tmpListMapper.deleteBySn(sn);
//然后將閱讀量和點(diǎn)贊量更新到文章表中。
post.setReadnum(read_num);
post.setLikenum(like_num);
postMapper.updateByPrimaryKey(post);
}
通過(guò)處理跳轉將js注入微信的方法:
public String getWxHis() {
String url = "";
// TODO Auto-generated method stub
/**
* 當前頁(yè)面為公眾號歷史消息時(shí),讀取這個(gè)程序
* 在采集隊列表中有一個(gè)load字段,當值等于1時(shí)代表正在被讀取
* 首先刪除采集隊列表中load=1的行
* 然后從隊列表中任意select一行
*/
tmpListMapper.deleteByLoad(1);
TmpList queue = tmpListMapper.selectRandomOne();
System.out.println("queue is null?"+queue);
if(queue == null){//隊列表為空
/**
* 隊列表如果空了,就從存儲公眾號biz的表中取得一個(gè)biz,
* 這里我在公眾號表中設置了一個(gè)采集時(shí)間的time字段,按照正序排列之后,
* 就得到時(shí)間戳最小的一個(gè)公眾號記錄,并取得它的biz
*/
WeiXin weiXin = weiXinMapper.selectOne();
String biz = weiXin.getBiz();
url = "https://mp.weixin.qq.com/mp/pr ... ot%3B + biz +
"#wechat_redirect";//拼接公眾號歷史消息url地址(第二種頁(yè)面形式)
//更新剛才提到的公眾號表中的采集時(shí)間time字段為當前時(shí)間戳。
weiXin.setCollect(System.currentTimeMillis());
int result = weiXinMapper.updateByPrimaryKey(weiXin);
System.out.println("getHis weiXin updateResult:"+result);
}else{
//取得當前這一行的content_url字段
url = queue.getContentUrl();
//將load字段update為1
tmpListMapper.updateByContentUrl(url);
}
//將下一個(gè)將要跳轉的$url變成js腳本,由anyproxy注入到微信頁(yè)面中。
//echo "setTimeout(function(){window.location.href='".$url."';},2000);";
int randomTime = new Random().nextInt(3) + 3;
String jsCode = "setTimeout(function(){window.location.href='"+url+"';},"+randomTime*1000+");";
return jsCode;
}
以上是對代理服務(wù)器截獲的數據進(jìn)行處理的流程。有一個(gè)問(wèn)題需要注意。程序會(huì )循環(huán)訪(fǎng)問(wèn)數據庫中的每個(gè)收錄公眾號,甚至會(huì )再次訪(fǎng)問(wèn)存儲的文章,以不斷更新文章Count和like count的讀數。如果需要抓大量公眾號,建議修改添加任務(wù)隊列的代碼,添加條件限制。否則,公眾號多輪重復抓取數據會(huì )極大影響效率。
到目前為止,我們已經(jīng)抓取了微信公眾號的所有文章鏈接,并且這個(gè)鏈接是一個(gè)可以在瀏覽器中打開(kāi)的永久鏈接。下一步就是編寫(xiě)爬蟲(chóng)程序,從數據庫中抓取鏈接,爬取文章內容等信息。
我用webmagic寫(xiě)了一個(gè)爬蟲(chóng),輕量級好用。
public class SpiderModel implements PageProcessor{
private static PostMapper postMapper;
private static List posts;
// 抓取網(wǎng)站的相關(guān)配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
// TODO Auto-generated method stub
return this.site;
}
public void process(Page page) {
// TODO Auto-generated method stub
Post post = posts.remove(0);
String content = page.getHtml().xpath("//div[@id='js_content']").get();
//存在和諧文章 此處做判定如果有直接刪除記錄或設置表示位表示文章被和諧
if(content == null){
System.out.println("文章已和諧!");
//postMapper.deleteByPrimaryKey(post.getId());
return;
}
String contentSnap = content.replaceAll("data-src", "src").replaceAll("preview.html", "player.html");//快照
String contentTxt = HtmlToWord.stripHtml(content);//純文本內容
Selectable metaContent = page.getHtml().xpath("//div[@id='meta_content']");
String pubTime = null;
String wxname = null;
String author = null;
if(metaContent != null){
pubTime = metaContent.xpath("//em[@id='post-date']").get();
if(pubTime != null){
pubTime = HtmlToWord.stripHtml(pubTime);//文章發(fā)布時(shí)間
}
wxname = metaContent.xpath("//a[@id='post-user']").get();
if(wxname != null){
wxname = HtmlToWord.stripHtml(wxname);//公眾號名稱(chēng)
}
author = metaContent.xpath("//em[@class='rich_media_meta rich_media_meta_text' and @id!='post-date']").get();
if(author != null){
author = HtmlToWord.stripHtml(author);//文章作者
}
}
// System.out.println("發(fā)布時(shí)間:"+pubTime);
// System.out.println("公眾號名稱(chēng):"+wxname);
// System.out.println("文章作者:"+author);
String title = post.getTitle().replaceAll("?", "");//文章標題
String digest = post.getDigest();//文章摘要
int likeNum = post.getLikenum();//文章點(diǎn)贊數
int readNum = post.getReadnum();//文章閱讀數
String contentUrl = post.getContentUrl();//文章鏈接
WechatInfoBean wechatBean = new WechatInfoBean();
wechatBean.setTitle(title);
wechatBean.setContent(contentTxt);//純文本內容
wechatBean.setSourceCode(contentSnap);//快照
wechatBean.setLikeCount(likeNum);
wechatBean.setViewCount(readNum);
wechatBean.setAbstractText(digest);//摘要
wechatBean.setUrl(contentUrl);
wechatBean.setPublishTime(pubTime);
wechatBean.setSiteName(wxname);//站點(diǎn)名稱(chēng) 公眾號名稱(chēng)
wechatBean.setAuthor(author);
wechatBean.setMediaType("微信公眾號");//來(lái)源媒體類(lèi)型
WechatStorage.saveWechatInfo(wechatBean);
//標示文章已經(jīng)被爬取
post.setIsSpider(1);
postMapper.updateByPrimaryKey(post);
}
public static void startSpider(List inposts,PostMapper myPostMapper,String... urls){
long startTime, endTime;
startTime = System.currentTimeMillis();
postMapper = myPostMapper;
posts = inposts;
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
SpiderModel spiderModel = new SpiderModel();
Spider mySpider = Spider.create(spiderModel).addUrl(urls);
mySpider.setDownloader(httpClientDownloader);
try {
SpiderMonitor.instance().register(mySpider);
mySpider.thread(1).run();
} catch (JMException e) {
e.printStackTrace();
}
endTime = System.currentTimeMillis();
System.out.println("爬取時(shí)間" + ((endTime - startTime) / 1000) + "秒--");
}
}
其他與邏輯無(wú)關(guān)的數據存儲代碼將不再發(fā)布。這里我將代理服務(wù)器抓取的數據存放在mysql中,將我的爬蟲(chóng)程序抓取到的數據存放在mongodb中。
以下是我爬取的公眾號信息:


querylist采集微信公眾號文章,可以這樣:生成腳本
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 304 次瀏覽 ? 2021-06-20 19:48
querylist采集微信公眾號文章,可以這樣:1.webqq登錄公眾號后臺,授權2.選擇webqq選項,然后上傳圖片到服務(wù)器生成webqqpost對象3.獲取webqqpost對象實(shí)現抓包分析,分析公眾號后臺,
你自己也可以采集-no-can-source/index.html
主要需要:apikey生成腳本(抓包app分析包,endgame中抓包找到的唯一標識,
可以自己抓,
querylistapi
querylist關(guān)注公眾號里面的文章,如果有回復消息后,就可以獲取采集結果,
可以采集微信公眾號的文章,也可以根據搜索內容判斷,我覺(jué)得不過(guò)這個(gè)做成網(wǎng)站,必須要有微信開(kāi)放接口,比如服務(wù)號,或者公眾號在微信平臺有實(shí)名認證,具有一定的權限,就可以接入querylistapi,就可以接入微信公眾號采集流程,只要網(wǎng)站有接入querylistapi的功能,就可以實(shí)現,樓主可以看看杭州數云網(wǎng)絡(luò )這家公司不錯,有接入querylistapi。
我想知道為什么會(huì )有這樣的采集需求?querylist是公眾號文章對接的接口,好多公眾號是自己的app,可以以app應用形式接入即可,另外題主也可以試試草料二維碼平臺,也有類(lèi)似需求,這是我之前用他接的訂閱號文章。 查看全部
querylist采集微信公眾號文章,可以這樣:生成腳本
querylist采集微信公眾號文章,可以這樣:1.webqq登錄公眾號后臺,授權2.選擇webqq選項,然后上傳圖片到服務(wù)器生成webqqpost對象3.獲取webqqpost對象實(shí)現抓包分析,分析公眾號后臺,
你自己也可以采集-no-can-source/index.html
主要需要:apikey生成腳本(抓包app分析包,endgame中抓包找到的唯一標識,
可以自己抓,
querylistapi
querylist關(guān)注公眾號里面的文章,如果有回復消息后,就可以獲取采集結果,
可以采集微信公眾號的文章,也可以根據搜索內容判斷,我覺(jué)得不過(guò)這個(gè)做成網(wǎng)站,必須要有微信開(kāi)放接口,比如服務(wù)號,或者公眾號在微信平臺有實(shí)名認證,具有一定的權限,就可以接入querylistapi,就可以接入微信公眾號采集流程,只要網(wǎng)站有接入querylistapi的功能,就可以實(shí)現,樓主可以看看杭州數云網(wǎng)絡(luò )這家公司不錯,有接入querylistapi。
我想知道為什么會(huì )有這樣的采集需求?querylist是公眾號文章對接的接口,好多公眾號是自己的app,可以以app應用形式接入即可,另外題主也可以試試草料二維碼平臺,也有類(lèi)似需求,這是我之前用他接的訂閱號文章。
Python爬蟲(chóng)、數據分析、網(wǎng)站開(kāi)發(fā)等案例教程視頻免費在線(xiàn)觀(guān)看
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 295 次瀏覽 ? 2021-06-20 19:43
前言
本文中的文字圖片過(guò)濾網(wǎng)絡(luò )可用于學(xué)習、交流,不具有任何商業(yè)用途。如有任何問(wèn)題,請及時(shí)聯(lián)系我們處理。
Python爬蟲(chóng)、數據分析、網(wǎng)站development等案例教程視頻免費在線(xiàn)觀(guān)看
https://space.bilibili.com/523606542
基本的開(kāi)發(fā)環(huán)境。爬取兩個(gè)公眾號的文章:
1.藍光編程公眾號擁有的爬取文章
2、爬取所有關(guān)于python文章的公眾號
爬取藍光編程公眾號擁有的文章
1、登錄公眾號后點(diǎn)擊圖片和文字
2、打開(kāi)開(kāi)發(fā)者工具
3、點(diǎn)擊超鏈接
加載相關(guān)數據時(shí),有一個(gè)數據包,包括文章title、鏈接、摘要、發(fā)布時(shí)間等,您也可以選擇其他公眾號進(jìn)行抓取,但這需要您有一個(gè)微信公眾號帳戶(hù)。
添加cookie
import?pprint
import?time
import?requests
import?csv
f?=?open('青燈公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(0,?40,?5):
????url?=?f'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
????headers?=?{
????????'cookie':?'加cookie',
????????'referer':?'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=1252678642&lang=zh_CN',
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????html_data?=?response.json()
????pprint.pprint(response.json())
????lis?=?html_data['app_msg_list']
????for?li?in?lis:
????????title?=?li['title']
????????link_url?=?li['link']
????????update_time?=?li['update_time']
????????timeArray?=?time.localtime(int(update_time))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?link_url,
????????}
????????csv_writer.writerow(dit)
????????print(dit)
抓取所有關(guān)于python文章的公眾賬號
1、搜狗搜索python選擇微信
注意:如果不登錄,只能抓取前十頁(yè)數據。登錄后可以爬取2W多文章。
2.直接爬取靜態(tài)網(wǎng)頁(yè)的標題、公眾號、文章地址、發(fā)布時(shí)間。
import?time
import?requests
import?parsel
import?csv
f?=?open('公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'公眾號',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(1,?2447):
????url?=?f'https://weixin.sogou.com/weixin?query=python&_sug_type_=&s_from=input&_sug_=n&type=2&page={page}&ie=utf8'
????headers?=?{
????????'Cookie':?'自己的cookie',
????????'Host':?'weixin.sogou.com',
????????'Referer':?'https://www.sogou.com/web?query=python&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1396&sst0=1610779538290&lkt=0%2C0%2C0&sugsuv=1590216228113568&sugtime=1610779538290',
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????selector?=?parsel.Selector(response.text)
????lis?=?selector.css('.news-list?li')
????for?li?in?lis:
????????title_list?=?li.css('.txt-box?h3?a::text').getall()
????????num?=?len(title_list)
????????if?num?==?1:
????????????title_str?=?'python'?+?title_list[0]
????????else:
????????????title_str?=?'python'.join(title_list)
????????href?=?li.css('.txt-box?h3?a::attr(href)').get()
????????article_url?=?'https://weixin.sogou.com'?+?href
????????name?=?li.css('.s-p?a::text').get()
????????date?=?li.css('.s-p::attr(t)').get()
????????timeArray?=?time.localtime(int(date))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title_str,
????????????'公眾號':?name,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?article_url,
????????}
????????csv_writer.writerow(dit)
????????print(title_str,?name,?otherStyleTime,?article_url)
本文同步分享到博客“松鼠愛(ài)餅干”(CSDN)。 查看全部
Python爬蟲(chóng)、數據分析、網(wǎng)站開(kāi)發(fā)等案例教程視頻免費在線(xiàn)觀(guān)看
前言
本文中的文字圖片過(guò)濾網(wǎng)絡(luò )可用于學(xué)習、交流,不具有任何商業(yè)用途。如有任何問(wèn)題,請及時(shí)聯(lián)系我們處理。
Python爬蟲(chóng)、數據分析、網(wǎng)站development等案例教程視頻免費在線(xiàn)觀(guān)看
https://space.bilibili.com/523606542

基本的開(kāi)發(fā)環(huán)境。爬取兩個(gè)公眾號的文章:
1.藍光編程公眾號擁有的爬取文章
2、爬取所有關(guān)于python文章的公眾號
爬取藍光編程公眾號擁有的文章
1、登錄公眾號后點(diǎn)擊圖片和文字

2、打開(kāi)開(kāi)發(fā)者工具

3、點(diǎn)擊超鏈接

加載相關(guān)數據時(shí),有一個(gè)數據包,包括文章title、鏈接、摘要、發(fā)布時(shí)間等,您也可以選擇其他公眾號進(jìn)行抓取,但這需要您有一個(gè)微信公眾號帳戶(hù)。
添加cookie
import?pprint
import?time
import?requests
import?csv
f?=?open('青燈公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(0,?40,?5):
????url?=?f'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
????headers?=?{
????????'cookie':?'加cookie',
????????'referer':?'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=1252678642&lang=zh_CN',
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????html_data?=?response.json()
????pprint.pprint(response.json())
????lis?=?html_data['app_msg_list']
????for?li?in?lis:
????????title?=?li['title']
????????link_url?=?li['link']
????????update_time?=?li['update_time']
????????timeArray?=?time.localtime(int(update_time))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?link_url,
????????}
????????csv_writer.writerow(dit)
????????print(dit)
抓取所有關(guān)于python文章的公眾賬號
1、搜狗搜索python選擇微信

注意:如果不登錄,只能抓取前十頁(yè)數據。登錄后可以爬取2W多文章。
2.直接爬取靜態(tài)網(wǎng)頁(yè)的標題、公眾號、文章地址、發(fā)布時(shí)間。
import?time
import?requests
import?parsel
import?csv
f?=?open('公眾號文章.csv',?mode='a',?encoding='utf-8',?newline='')
csv_writer?=?csv.DictWriter(f,?fieldnames=['標題',?'公眾號',?'文章發(fā)布時(shí)間',?'文章地址'])
csv_writer.writeheader()
for?page?in?range(1,?2447):
????url?=?f'https://weixin.sogou.com/weixin?query=python&_sug_type_=&s_from=input&_sug_=n&type=2&page={page}&ie=utf8'
????headers?=?{
????????'Cookie':?'自己的cookie',
????????'Host':?'weixin.sogou.com',
????????'Referer':?'https://www.sogou.com/web?query=python&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1396&sst0=1610779538290&lkt=0%2C0%2C0&sugsuv=1590216228113568&sugtime=1610779538290',
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36',
????}
????response?=?requests.get(url=url,?headers=headers)
????selector?=?parsel.Selector(response.text)
????lis?=?selector.css('.news-list?li')
????for?li?in?lis:
????????title_list?=?li.css('.txt-box?h3?a::text').getall()
????????num?=?len(title_list)
????????if?num?==?1:
????????????title_str?=?'python'?+?title_list[0]
????????else:
????????????title_str?=?'python'.join(title_list)
????????href?=?li.css('.txt-box?h3?a::attr(href)').get()
????????article_url?=?'https://weixin.sogou.com'?+?href
????????name?=?li.css('.s-p?a::text').get()
????????date?=?li.css('.s-p::attr(t)').get()
????????timeArray?=?time.localtime(int(date))
????????otherStyleTime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?timeArray)
????????dit?=?{
????????????'標題':?title_str,
????????????'公眾號':?name,
????????????'文章發(fā)布時(shí)間':?otherStyleTime,
????????????'文章地址':?article_url,
????????}
????????csv_writer.writerow(dit)
????????print(title_str,?name,?otherStyleTime,?article_url)

本文同步分享到博客“松鼠愛(ài)餅干”(CSDN)。
微信開(kāi)放平臺推文之類(lèi)的話(huà)考慮是否用關(guān)鍵字共享
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 126 次瀏覽 ? 2021-06-20 19:42
querylist采集微信公眾號文章textdatareader采集qq空間文章微信開(kāi)放平臺推文之類(lèi)是公司產(chǎn)品的會(huì )先成立項目組或者部門(mén)研究相關(guān)需求,分析需求是否合理。然后設計個(gè)基礎設計,寫(xiě)個(gè)helloworld。這邊所謂的人均壓力都不算大,實(shí)際上手發(fā)現沒(méi)啥。數據的話(huà)考慮是否用關(guān)鍵字共享不過(guò)也可以根據需求放一些圖片存緩存。
需要處理到瀏覽器那邊就用gulp+vuepress等。業(yè)務(wù)類(lèi)分為公眾號\移動(dòng)端\h5\微信小程序等我做的項目是用微信公眾號來(lái)測試,完全沒(méi)有開(kāi)發(fā)微信接口測試。因為功能測試不過(guò),所以把調試的功能公開(kāi)給了運營(yíng)人員,看他們自己后期的測試。最后項目開(kāi)發(fā)中段才開(kāi)始考慮量化算法。給總經(jīng)理們整點(diǎn)投票表決什么的以便安排人手。
我一般是先搞定業(yè)務(wù)問(wèn)題,然后挑戰一些很容易通過(guò)數據挖掘模型的功能。工作量因人而異,不會(huì )整天加班,看出的問(wèn)題也不會(huì )有回報。后端的話(huà)excel+hive+sql+springmvc就可以辦到。nosql這種不用考慮了,不過(guò)如果需要融合mongodb,請先給我自己買(mǎi)個(gè)mongodb。上市公司業(yè)務(wù)多的話(huà),開(kāi)個(gè)spark吧,采用一下spark的集群管理以及水平擴展思路。
量化方向主要是excel,hive等,傳統統計方向的話(huà),r應該可以,因為很多公司在做這個(gè)了,大數據這塊,excel占大頭了,有的會(huì )用mapreduce這類(lèi), 查看全部
微信開(kāi)放平臺推文之類(lèi)的話(huà)考慮是否用關(guān)鍵字共享
querylist采集微信公眾號文章textdatareader采集qq空間文章微信開(kāi)放平臺推文之類(lèi)是公司產(chǎn)品的會(huì )先成立項目組或者部門(mén)研究相關(guān)需求,分析需求是否合理。然后設計個(gè)基礎設計,寫(xiě)個(gè)helloworld。這邊所謂的人均壓力都不算大,實(shí)際上手發(fā)現沒(méi)啥。數據的話(huà)考慮是否用關(guān)鍵字共享不過(guò)也可以根據需求放一些圖片存緩存。
需要處理到瀏覽器那邊就用gulp+vuepress等。業(yè)務(wù)類(lèi)分為公眾號\移動(dòng)端\h5\微信小程序等我做的項目是用微信公眾號來(lái)測試,完全沒(méi)有開(kāi)發(fā)微信接口測試。因為功能測試不過(guò),所以把調試的功能公開(kāi)給了運營(yíng)人員,看他們自己后期的測試。最后項目開(kāi)發(fā)中段才開(kāi)始考慮量化算法。給總經(jīng)理們整點(diǎn)投票表決什么的以便安排人手。
我一般是先搞定業(yè)務(wù)問(wèn)題,然后挑戰一些很容易通過(guò)數據挖掘模型的功能。工作量因人而異,不會(huì )整天加班,看出的問(wèn)題也不會(huì )有回報。后端的話(huà)excel+hive+sql+springmvc就可以辦到。nosql這種不用考慮了,不過(guò)如果需要融合mongodb,請先給我自己買(mǎi)個(gè)mongodb。上市公司業(yè)務(wù)多的話(huà),開(kāi)個(gè)spark吧,采用一下spark的集群管理以及水平擴展思路。
量化方向主要是excel,hive等,傳統統計方向的話(huà),r應該可以,因為很多公司在做這個(gè)了,大數據這塊,excel占大頭了,有的會(huì )用mapreduce這類(lèi),
querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 409 次瀏覽 ? 2021-06-20 06:33
每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
請允許我強制投放一波廣告:
因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
一個(gè)喜歡小寵物但養不起貓的碼農,下班后很高興來(lái)看看??梢躁P(guān)注哦!
為保證視頻安全,避免丟失,請樓主為視頻添加水印。
獲取官方賬號信息
標題、摘要、封面、文章URL
步驟:
1、先自己申請公眾號
2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
4、抓包獲取信息并定位請求的url
通過(guò)查看信息,找到了我們需要的關(guān)鍵內容:title、abstract、cover和文章URL,確認這是我們需要的URL,點(diǎn)擊下一頁(yè),多次獲取url,發(fā)現只有 random 和 begin 的參數發(fā)生了變化
這樣就確定了主要信息網(wǎng)址。
讓我們開(kāi)始吧:
原來(lái)我們需要修改的參數是:token、random、cookie
獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
# -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
獲取結果(成功):
獲取文章內視頻:實(shí)現批量下載
分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
與獲取的其他信息無(wú)關(guān),只能強制。
這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
視頻下載:
def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
然后所有的信息都完成了,進(jìn)行代碼組裝。
一個(gè)。獲取公眾號信息
B.過(guò)濾單篇文章文章information
c.獲取視頻信息
d。拼接視頻頁(yè)面下載地址
e.下載視頻并保存
代碼實(shí)驗結果:
獲取公眾號:標題、摘要、封面、視頻、
可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
危險動(dòng)作,請勿操作!記??!記??!記??!
獲取代碼請回復公眾號:20191210或公眾號
查看全部
querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!

請允許我強制投放一波廣告:
因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
一個(gè)喜歡小寵物但養不起貓的碼農,下班后很高興來(lái)看看??梢躁P(guān)注哦!
為保證視頻安全,避免丟失,請樓主為視頻添加水印。
獲取官方賬號信息
標題、摘要、封面、文章URL
步驟:
1、先自己申請公眾號
2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接

3、彈出搜索框,搜索你需要的公眾號,查看歷史文章


4、抓包獲取信息并定位請求的url

通過(guò)查看信息,找到了我們需要的關(guān)鍵內容:title、abstract、cover和文章URL,確認這是我們需要的URL,點(diǎn)擊下一頁(yè),多次獲取url,發(fā)現只有 random 和 begin 的參數發(fā)生了變化

這樣就確定了主要信息網(wǎng)址。
讓我們開(kāi)始吧:
原來(lái)我們需要修改的參數是:token、random、cookie
獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
# -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
獲取結果(成功):

獲取文章內視頻:實(shí)現批量下載
分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:

打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:


嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
與獲取的其他信息無(wú)關(guān),只能強制。
這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
視頻下載:
def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
然后所有的信息都完成了,進(jìn)行代碼組裝。
一個(gè)。獲取公眾號信息
B.過(guò)濾單篇文章文章information
c.獲取視頻信息
d。拼接視頻頁(yè)面下載地址
e.下載視頻并保存
代碼實(shí)驗結果:



獲取公眾號:標題、摘要、封面、視頻、
可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
危險動(dòng)作,請勿操作!記??!記??!記??!
獲取代碼請回復公眾號:20191210或公眾號

querylist采集微信公眾號文章源碼(我會(huì )截圖分享)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 230 次瀏覽 ? 2021-06-14 00:02
querylist采集微信公眾號文章源碼我會(huì )截圖分享,里面有請輸入xxxxv這樣的語(yǔ)句。本人目前初學(xué)中,水平有限。如有錯誤,希望指正。僅代表個(gè)人解決了"常見(jiàn)文章庫提取問(wèn)題。輸入"某源碼庫"提取微信公眾號文章的標題",","目標格式"這樣的問(wèn)題。到此,下一篇文章"個(gè)人實(shí)現自動(dòng)回復管理系統"在中途就會(huì )全部搞定。
我通過(guò)分析此圖,認為可行性非常小,性能太差。再者很不方便,首頁(yè)與每篇文章之間的跳轉不方便(別人發(fā)送過(guò)一次)。
文章源代碼的提取的通過(guò)分析公眾號的h5地址就可以找到了,可以獲取整個(gè)公眾號的下載地址和公眾號每篇文章的鏈接地址,
有必要么,
當然可以啊,而且這個(gè)工具是已經(jīng)實(shí)現了的,
比較有必要,最起碼我們公司用這個(gè)文章提取工具都實(shí)現了我們的需求。
可以呀,
可以的,我目前想自己實(shí)現也是這么找。當然要得到微信公眾號的文章源碼,
文章源代碼提取肯定會(huì )有些封裝的接口,如果想使用原來(lái)接口我們可以分析一下源代碼來(lái)提取。
根據微信公眾號中的文章標題,也可以自己設計過(guò)濾器這么做, 查看全部
querylist采集微信公眾號文章源碼(我會(huì )截圖分享)
querylist采集微信公眾號文章源碼我會(huì )截圖分享,里面有請輸入xxxxv這樣的語(yǔ)句。本人目前初學(xué)中,水平有限。如有錯誤,希望指正。僅代表個(gè)人解決了"常見(jiàn)文章庫提取問(wèn)題。輸入"某源碼庫"提取微信公眾號文章的標題",","目標格式"這樣的問(wèn)題。到此,下一篇文章"個(gè)人實(shí)現自動(dòng)回復管理系統"在中途就會(huì )全部搞定。
我通過(guò)分析此圖,認為可行性非常小,性能太差。再者很不方便,首頁(yè)與每篇文章之間的跳轉不方便(別人發(fā)送過(guò)一次)。
文章源代碼的提取的通過(guò)分析公眾號的h5地址就可以找到了,可以獲取整個(gè)公眾號的下載地址和公眾號每篇文章的鏈接地址,
有必要么,
當然可以啊,而且這個(gè)工具是已經(jīng)實(shí)現了的,
比較有必要,最起碼我們公司用這個(gè)文章提取工具都實(shí)現了我們的需求。
可以呀,
可以的,我目前想自己實(shí)現也是這么找。當然要得到微信公眾號的文章源碼,
文章源代碼提取肯定會(huì )有些封裝的接口,如果想使用原來(lái)接口我們可以分析一下源代碼來(lái)提取。
根據微信公眾號中的文章標題,也可以自己設計過(guò)濾器這么做,
querylist采集微信公眾號文章聚合,可以試試weichat100,
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 191 次瀏覽 ? 2021-06-12 02:01
querylist采集微信公眾號文章內容的話(huà),個(gè)人認為應該是通過(guò)redis做querylist的querylist進(jìn)行抓取,可以通過(guò)mongodb等關(guān)系型數據庫存儲和管理。但是建議樓主可以采用feed聚合服務(wù),比如說(shuō)微信公眾號的文章或者小程序的推文,直接開(kāi)發(fā)一個(gè)feed服務(wù)端來(lái)進(jìn)行抓取的!。
feed對方需要發(fā)送get請求參與到redis里面。
可以試試weichat100,給你一個(gè)試試:/
百度搜索關(guān)鍵詞微信公眾號文章聚合,開(kāi)發(fā)項目很多。最直接簡(jiǎn)單的方法,其實(shí)你可以用瀏覽器打開(kāi),去看那個(gè),
高并發(fā)嗎?答案,
兩種可能,一種是你的服務(wù)器負載不足,經(jīng)常上線(xiàn),最近沒(méi)有任何數據抓取?;蛘呤琼?yè)面過(guò)于復雜或者附加屬性過(guò)多,這個(gè)個(gè)人覺(jué)得還是跟語(yǔ)言有關(guān),目前ruby,python等語(yǔ)言的效率都會(huì )相對較高。
是我對高并發(fā)要求太高了嗎?同意樓上說(shuō)的那個(gè)回答。
對服務(wù)器配置要求是真高,如果你有錢(qián),你可以找個(gè)節點(diǎn)或者購買(mǎi)相應服務(wù),比如你自己做個(gè)集群啥的。其他大家的回答都是為了說(shuō)明對你有幫助,對于那個(gè)使用redis來(lái)進(jìn)行querylist進(jìn)行抓取的方案,由于querylist不是微信開(kāi)發(fā)的,而是為了crud而生,所以,redis本身有數據的持久化機制,不需要數據庫操作。 查看全部
querylist采集微信公眾號文章聚合,可以試試weichat100,
querylist采集微信公眾號文章內容的話(huà),個(gè)人認為應該是通過(guò)redis做querylist的querylist進(jìn)行抓取,可以通過(guò)mongodb等關(guān)系型數據庫存儲和管理。但是建議樓主可以采用feed聚合服務(wù),比如說(shuō)微信公眾號的文章或者小程序的推文,直接開(kāi)發(fā)一個(gè)feed服務(wù)端來(lái)進(jìn)行抓取的!。
feed對方需要發(fā)送get請求參與到redis里面。
可以試試weichat100,給你一個(gè)試試:/
百度搜索關(guān)鍵詞微信公眾號文章聚合,開(kāi)發(fā)項目很多。最直接簡(jiǎn)單的方法,其實(shí)你可以用瀏覽器打開(kāi),去看那個(gè),
高并發(fā)嗎?答案,
兩種可能,一種是你的服務(wù)器負載不足,經(jīng)常上線(xiàn),最近沒(méi)有任何數據抓取?;蛘呤琼?yè)面過(guò)于復雜或者附加屬性過(guò)多,這個(gè)個(gè)人覺(jué)得還是跟語(yǔ)言有關(guān),目前ruby,python等語(yǔ)言的效率都會(huì )相對較高。
是我對高并發(fā)要求太高了嗎?同意樓上說(shuō)的那個(gè)回答。
對服務(wù)器配置要求是真高,如果你有錢(qián),你可以找個(gè)節點(diǎn)或者購買(mǎi)相應服務(wù),比如你自己做個(gè)集群啥的。其他大家的回答都是為了說(shuō)明對你有幫助,對于那個(gè)使用redis來(lái)進(jìn)行querylist進(jìn)行抓取的方案,由于querylist不是微信開(kāi)發(fā)的,而是為了crud而生,所以,redis本身有數據的持久化機制,不需要數據庫操作。
【魔獸世界】谷歌微信公眾號文章接口獲取方法
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 218 次瀏覽 ? 2021-06-11 00:05
一、網(wǎng)上方法:
1.使用訂閱賬號功能中的查詢(xún)鏈接,(此鏈接現在采取了嚴重的反抄襲措施,訂閱賬號在抓取幾十個(gè)頁(yè)面時(shí)會(huì )被屏蔽,僅供參考)
詳情請訪(fǎng)問(wèn)此鏈接:/4652.html
2.微信搜索使用搜狗搜索(此方法只能查看每個(gè)微信公眾號文章的前10條)
詳情請訪(fǎng)問(wèn)此鏈接:/qiqiyingse/article/details/70050113
3.先搶公眾號界面,訪(fǎng)問(wèn)界面獲取所有文章連接
二、環(huán)境配置及材料準備
1.需要安裝python selenium模塊包,使用selenium中的webdriver驅動(dòng)瀏覽器獲取cookie,達到登錄效果;
2.使用webdriver功能需要安裝瀏覽器對應的驅動(dòng)插件。我在這里測試的是 Google Chrome。
3.微信公眾號申請(個(gè)人訂閱號申請門(mén)檻低,服務(wù)號需要營(yíng)業(yè)執照等)
4、.微信公眾號文章界面地址可在微信公眾號后臺新建圖文消息,可通過(guò)超鏈接功能獲??;
通過(guò)搜索關(guān)鍵字獲取所有相關(guān)公眾號信息,但我只取第一個(gè)進(jìn)行測試,其他感興趣的人也可以全部獲取
5.獲取要爬取的公眾號的fakeid
6.選擇要爬取的公眾號,獲取文章接口地址
從 selenium 導入 webdriver
導入時(shí)間
導入json
導入請求
重新導入
隨機導入
user=""
password="weikuan3344520"
gzlist=['熊貓']
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
def weChat_login():
#定義一個(gè)空字典來(lái)存儲cookies的內容
post={}
#使用網(wǎng)絡(luò )驅動(dòng)程序啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='C:\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('/')
#等待 5 秒
time.sleep(5)
print("輸入微信公眾號賬號和密碼...")
#清除帳號框中的內容
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").clear()
#自動(dòng)填寫(xiě)登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").send_keys(user)
#清空密碼框內容
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").clear()
#自動(dòng)填寫(xiě)登錄密碼
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").send_keys(password)
//這是重點(diǎn),最近改版后
#自動(dòng)輸入密碼后,需要手動(dòng)點(diǎn)擊記住我
print("請點(diǎn)擊登錄界面:記住您的賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕登錄
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
#用手機掃描二維碼!
print("請用手機掃描二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新加載公眾號登錄頁(yè)面,登錄后會(huì )顯示公眾號后臺首頁(yè),從返回的內容中獲取cookies信息
driver.get('/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取的cookies為列表形式,將cookies轉換為json形式存放在名為cookie的本地文本中
對于 cookie_items 中的 cookie_item:
post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt','w+', encoding='utf-8') as f:
f.write(cookie_str)
print("Cookies 信息已保存在本地")
#抓取微信公眾號文章并存入本地文本
def get_content(query):
#query 是要抓取的公眾號名稱(chēng)
#公眾號首頁(yè)
url =''
#設置標題
標題 = {
"主機":"",
"用戶(hù)代理": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取的cookie
with open('cookie.txt','r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄后微信公眾號首頁(yè)url改為:/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號接口地址
search_url ='/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,共有三個(gè)變量:微信公眾號token、隨機數random、搜索微信公眾號名稱(chēng)
query_id = {
'action':'search_biz',
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'查詢(xún)':查詢(xún),
'開(kāi)始':'0',
'計數':'5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入cookies、params、headers等相關(guān)參數信息
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,以后爬取公眾號文章需要這個(gè)字段
fakeid = list.get('fakeid')
#微信公眾號文章界面地址
appmsg_url ='/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、爬取文章的fakeid公眾號、隨機數random
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin': '0',#不同的頁(yè)面,這個(gè)參數改變,改變規則是每頁(yè)加5
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
#打開(kāi)搜索到的微信公眾號文章list頁(yè)面
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#Get 文章total number
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5個(gè)條目,獲取文章頁(yè)總數,爬取時(shí)需要頁(yè)面爬取
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,后續每頁(yè)加5
開(kāi)始 = 0
當 num + 1> 0 :
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin':'{}'.format(str(begin)),
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
print('翻頁(yè):--------------',begin)
#獲取文章每個(gè)頁(yè)面的標題和鏈接地址,寫(xiě)入本地文本
query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list = query_fakeid_response.json().get('app_msg_list')
對于 fakeid_list 中的項目:
content_link=item.get('link')
content_title=item.get('title')
fileName=query+'.txt'
with open(fileName,'a',encoding='utf-8') as fh:
fh.write(content_title+":\n"+content_link+"\n")
數量 -= 1
begin = int(begin)
開(kāi)始+=5
time.sleep(2)
如果 __name__=='__main__':
試試:
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
weChat_login()
#登錄后使用微信公眾號文章interface爬取文章
在 gzlist 中查詢(xún):
#抓取微信公眾號文章并存入本地文本 查看全部
【魔獸世界】谷歌微信公眾號文章接口獲取方法
一、網(wǎng)上方法:
1.使用訂閱賬號功能中的查詢(xún)鏈接,(此鏈接現在采取了嚴重的反抄襲措施,訂閱賬號在抓取幾十個(gè)頁(yè)面時(shí)會(huì )被屏蔽,僅供參考)
詳情請訪(fǎng)問(wèn)此鏈接:/4652.html
2.微信搜索使用搜狗搜索(此方法只能查看每個(gè)微信公眾號文章的前10條)
詳情請訪(fǎng)問(wèn)此鏈接:/qiqiyingse/article/details/70050113
3.先搶公眾號界面,訪(fǎng)問(wèn)界面獲取所有文章連接
二、環(huán)境配置及材料準備
1.需要安裝python selenium模塊包,使用selenium中的webdriver驅動(dòng)瀏覽器獲取cookie,達到登錄效果;
2.使用webdriver功能需要安裝瀏覽器對應的驅動(dòng)插件。我在這里測試的是 Google Chrome。
3.微信公眾號申請(個(gè)人訂閱號申請門(mén)檻低,服務(wù)號需要營(yíng)業(yè)執照等)
4、.微信公眾號文章界面地址可在微信公眾號后臺新建圖文消息,可通過(guò)超鏈接功能獲??;


通過(guò)搜索關(guān)鍵字獲取所有相關(guān)公眾號信息,但我只取第一個(gè)進(jìn)行測試,其他感興趣的人也可以全部獲取


5.獲取要爬取的公眾號的fakeid


6.選擇要爬取的公眾號,獲取文章接口地址


從 selenium 導入 webdriver
導入時(shí)間
導入json
導入請求
重新導入
隨機導入
user=""
password="weikuan3344520"
gzlist=['熊貓']
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
def weChat_login():
#定義一個(gè)空字典來(lái)存儲cookies的內容
post={}
#使用網(wǎng)絡(luò )驅動(dòng)程序啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='C:\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('/')
#等待 5 秒
time.sleep(5)
print("輸入微信公眾號賬號和密碼...")
#清除帳號框中的內容
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").clear()
#自動(dòng)填寫(xiě)登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@name='account'][@type='text']").send_keys(user)
#清空密碼框內容
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").clear()
#自動(dòng)填寫(xiě)登錄密碼
driver.find_element_by_xpath("./*//input[@name='password'][@type='password']").send_keys(password)
//這是重點(diǎn),最近改版后
#自動(dòng)輸入密碼后,需要手動(dòng)點(diǎn)擊記住我
print("請點(diǎn)擊登錄界面:記住您的賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕登錄
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
#用手機掃描二維碼!
print("請用手機掃描二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新加載公眾號登錄頁(yè)面,登錄后會(huì )顯示公眾號后臺首頁(yè),從返回的內容中獲取cookies信息
driver.get('/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取的cookies為列表形式,將cookies轉換為json形式存放在名為cookie的本地文本中
對于 cookie_items 中的 cookie_item:
post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt','w+', encoding='utf-8') as f:
f.write(cookie_str)
print("Cookies 信息已保存在本地")
#抓取微信公眾號文章并存入本地文本
def get_content(query):
#query 是要抓取的公眾號名稱(chēng)
#公眾號首頁(yè)
url =''
#設置標題
標題 = {
"主機":"",
"用戶(hù)代理": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取的cookie
with open('cookie.txt','r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄后微信公眾號首頁(yè)url改為:/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號接口地址
search_url ='/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,共有三個(gè)變量:微信公眾號token、隨機數random、搜索微信公眾號名稱(chēng)
query_id = {
'action':'search_biz',
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'查詢(xún)':查詢(xún),
'開(kāi)始':'0',
'計數':'5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入cookies、params、headers等相關(guān)參數信息
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,以后爬取公眾號文章需要這個(gè)字段
fakeid = list.get('fakeid')
#微信公眾號文章界面地址
appmsg_url ='/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、爬取文章的fakeid公眾號、隨機數random
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin': '0',#不同的頁(yè)面,這個(gè)參數改變,改變規則是每頁(yè)加5
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
#打開(kāi)搜索到的微信公眾號文章list頁(yè)面
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#Get 文章total number
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5個(gè)條目,獲取文章頁(yè)總數,爬取時(shí)需要頁(yè)面爬取
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,后續每頁(yè)加5
開(kāi)始 = 0
當 num + 1> 0 :
query_id_data = {
'token':令牌,
'lang':'zh_CN',
'f':'json',
'ajax': '1',
'random': random.random(),
'action':'list_ex',
'begin':'{}'.format(str(begin)),
'計數':'5',
'查詢(xún)':'',
'fakeid':fakeid,
'類(lèi)型':'9'
}
print('翻頁(yè):--------------',begin)
#獲取文章每個(gè)頁(yè)面的標題和鏈接地址,寫(xiě)入本地文本
query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list = query_fakeid_response.json().get('app_msg_list')
對于 fakeid_list 中的項目:
content_link=item.get('link')
content_title=item.get('title')
fileName=query+'.txt'
with open(fileName,'a',encoding='utf-8') as fh:
fh.write(content_title+":\n"+content_link+"\n")
數量 -= 1
begin = int(begin)
開(kāi)始+=5
time.sleep(2)
如果 __name__=='__main__':
試試:
#登錄微信公眾號,登錄后獲取cookie信息,保存在本地文本
weChat_login()
#登錄后使用微信公眾號文章interface爬取文章
在 gzlist 中查詢(xún):
#抓取微信公眾號文章并存入本地文本
刷新搜狗微信公眾號文章列表列表的步驟暫時(shí)不知道
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 260 次瀏覽 ? 2021-06-08 02:48
最近有采集微信公號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于list地址的獲取,我們以后再研究。
在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。
以下是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),有待進(jìn)一步完善。
/**
?*?Created?by?PhpStorm.
?*?User:?Administrator
?*?Date:?2017/2/6
?*?Time:?10:54
?*?author:?gm
?*?微信公眾號文章采集類(lèi)
?*/
class?DownWxArticle?{
private???$mpwxurl?=?'http://mp.weixin.qq.com';
private???$wxgzherr=?'公眾號二維碼下載失敗=>';
private???$wximgerr=?'圖片下載失敗=>';
private???$direrr??=?'文件夾創(chuàng )建失??!';
private???$fileerr?=?'資源不存在!';
private???$dirurl??=?'';
????/*?抓取微信公眾號文章
?*?$qcode????boolean?公眾號二維碼?false=>不下載?true=>下載
?*?return
?*?$content??string??內容
?*?$tile?????string??標題
?*?$time?????int?????時(shí)間戳
?*?$wxggh????string??微信公眾號
?*?$wxh??????string??微信號
?*?$qcode????string??公眾號二維碼
?*?$tag??????string??標簽?原創(chuàng )
?*/
????function?get_file_article($url,$dir='',$qcode=false)
????{
$this->dirurl?=?$dir?:'/Uploads/'.date('Ymd',time());
????????if(!$this->put_dir($this->dirurl)){
exit(json_encode(array('msg'=>$this->direrr,'code'=>500)));
}
????????$file?=?file_get_contents($url);
????????if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
????????????exit(json_encode(array('msg'=>$this->fileerr,'code'=>500)));
????????}
????????//?內容主體
????????preg_match('/[sS]*?/',$file,$content);
????????//?標題
????????preg_match('/(.*?)/',$file,$title);
????????$title?=?$title?$title[1]:'';
????????//?時(shí)間
????????preg_match('/(.*?)/',$file,$time);
????????$time?=?$time?strtotime($time[1]):'';
????????//?公眾號
????????preg_match('/(.*?)</a>/',$file,$wxgzh);
????????$wxgzh?=?$wxgzh?$wxgzh[1]:'';
????????//?微信號
????????preg_match('/([sS]*?)/',$file,$wxh);
????????$wxh???=?$wxh?$wxh[1]:'';
????????//?公眾號二維碼
????????if($qcode){
????????????preg_match('/window.sg_qr_code="(.*?)";/',$file,$qcode);
????????????$qcodeurl?=?str_replace('x26amp;','&',$this->mpwxurl.$qcode[1]);
????????????$qcode?=?$this->put_file_img($this->dirurl,$qcodeurl);
????????????if(!$qcode){
????????????????$this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
????????????}
????????}
????????//?獲取標簽
????????preg_match('/(.*?)/',$file,$tag);
????????$tag?=?$tag?$tag[1]:'';
????????//?圖片
????????preg_match_all('//',$content[0],$images);
????????//?儲存原地址和下載后地址
????????$old?=?array();
????????$new?=?array();
????????//?去除重復圖片地址
????????$images?=?array_unique($images[1]);
????????if($images){
????????????foreach($images?as?$v){
????????????????$filename?=?$this->put_file_img($this->dirurl,$v);
????????????????if($filename){
????????????????????//?圖片保存成功?替換地址
????????????????????$old[]?=?$v;
????????????????????$new[]?=?$filename;
????????????????}else{
????????????????????//?失敗記錄日志
????????????????????$this->put_error_log($this->dirurl,$this->wximgerr.$v);
????????????????}
????????????}
????????????$old[]?=?'data-src';
????????????$new[]?=?'src';
????????????$content?=?str_replace($old,$new,$content[0]);
????????}
???????//?替換音頻
???????$content?=?str_replace("preview.html","player.html",$content);?
???????//?獲取閱讀點(diǎn)贊評論等信息
???????$comment?=?$this->get_comment_article($url);
$data?=?array('content'=>$content,'title'=>$title,'time'=>$time,'wxgzh'=>$wxgzh,'wxh'=>$wxh,'qcode'=>$qcode?:'','tag'=>$tag?:'','comment'=>$comment);
????????return?json_encode(array('data'=>$data,'code'=>200,'msg'=>'ok'));
????}
????/*?抓取保存圖片函數
?????*?return
?????*?$filename??string??圖片地址
?????*/
????function?put_file_img($dir='',$image='')
????{
????????//?判斷圖片的保存類(lèi)型?截取后四位地址
????????$exts?=?array('jpeg','png','jpg');
????????$filename?=?$dir.'/'.uniqid().time().rand(10000,99999);
????????$ext?=?substr($image,-5);
????????$ext?=?explode('=',$ext);
????????if(in_array($ext[1],$exts)?!==?false){
????????????$filename?.=?'.'.$ext[1];
????????}else{
????????????$filename?.=?'.gif';
????????}
????????$souce?=?file_get_contents($image);
????????if(file_put_contents($filename,$souce)){
????????????return?$filename;
????????}else{
????????????return?false;
????????}
????}
????/*?獲取微信公眾號文章的【點(diǎn)贊】【閱讀】【評論】
?????*?方法:將地址中的部分參數替換即可。
?????*?????1、s??????替換為?mp/getcomment?
?????*?????2、最后=??替換為?%3D
?????*?return
?????*?read_num??閱讀數
?????*?like_num??點(diǎn)贊數
?????*?comment???評論詳情
?????*/
????function?get_comment_article($url='')
????{
????????$url?=?substr($url,0,-1);
????????$url?=?str_replace('/s','/mp/getcomment',$url).'%3D';
????????return?file_get_contents($url);
????}
????/*?錯誤日志記錄
?????*?$dir??string??文件路徑
?????*?$data?string??寫(xiě)入內容
?????*/
????function?put_error_log($dir,$data)
????{
????????file_put_contents($dir.'/error.log',date('Y-m-d?H:i:s',time()).$data.PHP_EOL,FILE_APPEND);
????}
????/*?創(chuàng )建文件夾
?????*?$dir?string?文件夾路徑
?????*/
????function?put_dir($dir=''){
$bool?=?true;
????????if(!is_dir($dir)){
????????????if(!mkdir($dir,777,TRUE)){
$bool?=?false;
????????????????$this->put_error_log($dir,$this->direrr.$dir);
????????????}
????????}
return?$bool;
????}
}
使用方法:
$url?=?'';
$article?=?new?DownWxArticle();
$article->get_file_article($url,'',true); 查看全部
刷新搜狗微信公眾號文章列表列表的步驟暫時(shí)不知道
最近有采集微信公號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于list地址的獲取,我們以后再研究。
在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。
以下是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),有待進(jìn)一步完善。
/**
?*?Created?by?PhpStorm.
?*?User:?Administrator
?*?Date:?2017/2/6
?*?Time:?10:54
?*?author:?gm
?*?微信公眾號文章采集類(lèi)
?*/
class?DownWxArticle?{
private???$mpwxurl?=?'http://mp.weixin.qq.com';
private???$wxgzherr=?'公眾號二維碼下載失敗=>';
private???$wximgerr=?'圖片下載失敗=>';
private???$direrr??=?'文件夾創(chuàng )建失??!';
private???$fileerr?=?'資源不存在!';
private???$dirurl??=?'';
????/*?抓取微信公眾號文章
?*?$qcode????boolean?公眾號二維碼?false=>不下載?true=>下載
?*?return
?*?$content??string??內容
?*?$tile?????string??標題
?*?$time?????int?????時(shí)間戳
?*?$wxggh????string??微信公眾號
?*?$wxh??????string??微信號
?*?$qcode????string??公眾號二維碼
?*?$tag??????string??標簽?原創(chuàng )
?*/
????function?get_file_article($url,$dir='',$qcode=false)
????{
$this->dirurl?=?$dir?:'/Uploads/'.date('Ymd',time());
????????if(!$this->put_dir($this->dirurl)){
exit(json_encode(array('msg'=>$this->direrr,'code'=>500)));
}
????????$file?=?file_get_contents($url);
????????if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
????????????exit(json_encode(array('msg'=>$this->fileerr,'code'=>500)));
????????}
????????//?內容主體
????????preg_match('/[sS]*?/',$file,$content);
????????//?標題
????????preg_match('/(.*?)/',$file,$title);
????????$title?=?$title?$title[1]:'';
????????//?時(shí)間
????????preg_match('/(.*?)/',$file,$time);
????????$time?=?$time?strtotime($time[1]):'';
????????//?公眾號
????????preg_match('/(.*?)</a>/',$file,$wxgzh);
????????$wxgzh?=?$wxgzh?$wxgzh[1]:'';
????????//?微信號
????????preg_match('/([sS]*?)/',$file,$wxh);
????????$wxh???=?$wxh?$wxh[1]:'';
????????//?公眾號二維碼
????????if($qcode){
????????????preg_match('/window.sg_qr_code="(.*?)";/',$file,$qcode);
????????????$qcodeurl?=?str_replace('x26amp;','&',$this->mpwxurl.$qcode[1]);
????????????$qcode?=?$this->put_file_img($this->dirurl,$qcodeurl);
????????????if(!$qcode){
????????????????$this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
????????????}
????????}
????????//?獲取標簽
????????preg_match('/(.*?)/',$file,$tag);
????????$tag?=?$tag?$tag[1]:'';
????????//?圖片
????????preg_match_all('//',$content[0],$images);
????????//?儲存原地址和下載后地址
????????$old?=?array();
????????$new?=?array();
????????//?去除重復圖片地址
????????$images?=?array_unique($images[1]);
????????if($images){
????????????foreach($images?as?$v){
????????????????$filename?=?$this->put_file_img($this->dirurl,$v);
????????????????if($filename){
????????????????????//?圖片保存成功?替換地址
????????????????????$old[]?=?$v;
????????????????????$new[]?=?$filename;
????????????????}else{
????????????????????//?失敗記錄日志
????????????????????$this->put_error_log($this->dirurl,$this->wximgerr.$v);
????????????????}
????????????}
????????????$old[]?=?'data-src';
????????????$new[]?=?'src';
????????????$content?=?str_replace($old,$new,$content[0]);
????????}
???????//?替換音頻
???????$content?=?str_replace("preview.html","player.html",$content);?
???????//?獲取閱讀點(diǎn)贊評論等信息
???????$comment?=?$this->get_comment_article($url);
$data?=?array('content'=>$content,'title'=>$title,'time'=>$time,'wxgzh'=>$wxgzh,'wxh'=>$wxh,'qcode'=>$qcode?:'','tag'=>$tag?:'','comment'=>$comment);
????????return?json_encode(array('data'=>$data,'code'=>200,'msg'=>'ok'));
????}
????/*?抓取保存圖片函數
?????*?return
?????*?$filename??string??圖片地址
?????*/
????function?put_file_img($dir='',$image='')
????{
????????//?判斷圖片的保存類(lèi)型?截取后四位地址
????????$exts?=?array('jpeg','png','jpg');
????????$filename?=?$dir.'/'.uniqid().time().rand(10000,99999);
????????$ext?=?substr($image,-5);
????????$ext?=?explode('=',$ext);
????????if(in_array($ext[1],$exts)?!==?false){
????????????$filename?.=?'.'.$ext[1];
????????}else{
????????????$filename?.=?'.gif';
????????}
????????$souce?=?file_get_contents($image);
????????if(file_put_contents($filename,$souce)){
????????????return?$filename;
????????}else{
????????????return?false;
????????}
????}
????/*?獲取微信公眾號文章的【點(diǎn)贊】【閱讀】【評論】
?????*?方法:將地址中的部分參數替換即可。
?????*?????1、s??????替換為?mp/getcomment?
?????*?????2、最后=??替換為?%3D
?????*?return
?????*?read_num??閱讀數
?????*?like_num??點(diǎn)贊數
?????*?comment???評論詳情
?????*/
????function?get_comment_article($url='')
????{
????????$url?=?substr($url,0,-1);
????????$url?=?str_replace('/s','/mp/getcomment',$url).'%3D';
????????return?file_get_contents($url);
????}
????/*?錯誤日志記錄
?????*?$dir??string??文件路徑
?????*?$data?string??寫(xiě)入內容
?????*/
????function?put_error_log($dir,$data)
????{
????????file_put_contents($dir.'/error.log',date('Y-m-d?H:i:s',time()).$data.PHP_EOL,FILE_APPEND);
????}
????/*?創(chuàng )建文件夾
?????*?$dir?string?文件夾路徑
?????*/
????function?put_dir($dir=''){
$bool?=?true;
????????if(!is_dir($dir)){
????????????if(!mkdir($dir,777,TRUE)){
$bool?=?false;
????????????????$this->put_error_log($dir,$this->direrr.$dir);
????????????}
????????}
return?$bool;
????}
}
使用方法:
$url?=?'';
$article?=?new?DownWxArticle();
$article->get_file_article($url,'',true);
微信公眾號歷史消息頁(yè)面的鏈接地址將持續更新
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 198 次瀏覽 ? 2021-06-05 23:10
我從2014年開(kāi)始做微信公眾號內容的批量采集,最初的目的是為了制造一個(gè)html5垃圾郵件網(wǎng)站。當時(shí)垃圾站采集到達的微信公眾號的內容很容易在公眾號傳播。當時(shí)批量采集特別好做,采集入口就是公眾號的歷史新聞頁(yè)面。這個(gè)條目現在是一樣的,但越來(lái)越難采集。 采集 方法也在很多版本中進(jìn)行了更新。后來(lái)到了2015年,html5垃圾站就不做了。取而代之的是采集目標針對本地新聞資訊公眾號,前端展示被做成了一個(gè)app。于是一個(gè)可以自動(dòng)采集公號內容的新聞APP就形成了。曾經(jīng)擔心微信技術(shù)升級一天后,采集內容不可用,我的新聞應用程序失敗。但是隨著(zhù)微信的不斷技術(shù)升級,采集方式也得到了升級,這讓我越來(lái)越有信心。只要公眾號歷史消息頁(yè)面存在,就可以批量采集內容。所以今天整理了一下,決定寫(xiě)下采集方法。我的方法來(lái)自于很多同事的分享精神,所以我會(huì )延續這種精神,分享我的成果。
本文文章會(huì )持續更新,所見(jiàn)即所得。
首先我們來(lái)看一個(gè)微信公眾號歷史消息頁(yè)面的鏈接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
現在根據不同的微信個(gè)人賬號,會(huì )有兩個(gè)不同的歷史消息頁(yè)面地址。下面是另一個(gè)歷史消息頁(yè)面的地址。第一種地址的鏈接在anyproxy中會(huì )顯示302跳轉:
https://mp.weixin.qq.com/mp/pr ... irect
第一個(gè)鏈接地址的頁(yè)面樣式:
第二個(gè)鏈接地址的頁(yè)面樣式:
根據目前的信息,這兩種頁(yè)面格式在不同的微信賬號中出現不規則。有的微信賬號永遠是第一頁(yè)格式,有的永遠是第二頁(yè)格式。
上面的鏈接是微信公眾號歷史新聞頁(yè)面的真實(shí)鏈接,但是當我們在瀏覽器中輸入這個(gè)鏈接時(shí),會(huì )顯示:請從微信客戶(hù)端訪(fǎng)問(wèn)。這是因為鏈接地址實(shí)際上需要幾個(gè)參數才能正常顯示內容。來(lái)看看可以正常顯示內容的完整鏈接:
//第一種鏈接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二種
http://mp.weixin.qq.com/mp/pro ... r%3D1
該地址是通過(guò)微信客戶(hù)端打開(kāi)歷史消息頁(yè)面后,使用后面介紹的代理服務(wù)器軟件獲取的。這里有幾個(gè)參數:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的參數是:__biz;uin=;key=;pass_ticket=;這4個(gè)參數。
__biz 是公眾號的類(lèi)似id的參數。每個(gè)公眾號都有一個(gè)微信。目前公眾號的biz變動(dòng)的可能性很??;
剩下的3個(gè)參數與用戶(hù)id和tokenticket的含義有關(guān)。這3個(gè)參數的值在微信客戶(hù)端生成后會(huì )自動(dòng)添加到地址欄。所以我們認為采集公眾號必須通過(guò)微信客戶(hù)端。在之前的微信版本中,這3個(gè)參數也可以一次性獲取,在有效期內可以使用多個(gè)公眾號。在當前版本中,每次訪(fǎng)問(wèn)公眾號都會(huì )更改參數值。
我現在使用的方法只需要關(guān)注__biz參數即可。
我的采集系統由以下部分組成:
1、A 微信客戶(hù)端:可以是安裝了微信應用的手機,也可以是電腦中的安卓模擬器。批量采集測試的ios微信客戶(hù)端崩潰率高于A(yíng)ndroid系統。為了降低成本,我使用了Android模擬器。
2、A微信個(gè)人號:對于采集內容,不僅需要一個(gè)微信客戶(hù)端,還需要一個(gè)采集專(zhuān)用的微信個(gè)人號,因為這個(gè)微信號不能做其他事情。
3、本地代理服務(wù)器系統:目前使用的方法是通過(guò)Anyproxy代理服務(wù)器將公眾號歷史消息頁(yè)面中的文章列表發(fā)送到自己的服務(wù)器。具體安裝方法后面會(huì )詳細介紹。
4、文章List分析入庫系統:本人使用php語(yǔ)言編寫(xiě),下面文章將詳細介紹如何分析文章lists并建立采集queues實(shí)現批量采集內容.
步驟
一、 安裝模擬器或使用手機安裝微信客戶(hù)端APP,申請微信個(gè)人賬號并登錄APP。這個(gè)就不多介紹了,大家自己做。
二、代理服務(wù)器系統安裝
目前我使用 Anyproxy、AnyProxy。這個(gè)軟件的特點(diǎn)是可以獲取https鏈接的內容。 2016年初,微信公眾號和微信文章開(kāi)始使用https鏈接。而Anyproxy可以通過(guò)修改規則配置,在公眾號頁(yè)面插入腳本代碼。下面將介紹安裝和配置過(guò)程。
1、Install NodeJS
2、在命令行或終端運行npm install -g anyproxy,mac系統需要添加sudo;
3、生成RootCA,https需要這個(gè)證書(shū):運行命令sudo anyproxy --root(windows可能不需要sudo);
4、 啟動(dòng) anyproxy 運行命令:sudo anyproxy -i;參數-i表示解析HTTPS;
5、安裝證書(shū),在手機或者安卓模擬器安裝證書(shū):
6、Set proxy:安卓模擬器的代理服務(wù)器地址是wifi鏈接的網(wǎng)關(guān)。通過(guò)dhcp設置為static后就可以看到網(wǎng)關(guān)地址了。閱讀后不要忘記將其設置為自動(dòng)。手機中的代理服務(wù)器地址就是運行anyproxy的電腦的ip地址。代理服務(wù)器默認端口為8001;
現在打開(kāi)微信,點(diǎn)擊任意公眾號歷史消息或者文章,就可以看到在終端滾動(dòng)的響應碼。如果沒(méi)有出現,請檢查手機的代理設置是否正確。
現在打開(kāi)瀏覽器地址localhost:8002,可以看到anyproxy的web界面。微信點(diǎn)擊打開(kāi)一個(gè)歷史消息頁(yè)面,然后在瀏覽器的web界面查看,歷史消息頁(yè)面的地址會(huì )滾動(dòng)。
/mp/getmasssendmsg開(kāi)頭的網(wǎng)址是微信歷史消息頁(yè)面。左邊的小鎖表示這個(gè)頁(yè)面是 https 加密的?,F在我們點(diǎn)擊這一行;
========2017 年 1 月 11 日更新==========
一些以/mp/getmasssendmsg開(kāi)頭的微信網(wǎng)址會(huì )有302跳轉到以/mp/profile_ext?action=home開(kāi)頭的地址。所以點(diǎn)擊這個(gè)地址可以看到內容。
如果右側出現html文件內容,則表示解密成功。如果沒(méi)有內容,請檢查anyproxy運行方式是否有參數i,是否生成CA證書(shū),是否在手機上正確安裝了證書(shū)。
現在我們手機中的所有內容都可以明文通過(guò)代理服務(wù)器了。接下來(lái),我們需要修改代理服務(wù)器的配置,以便獲取公眾號的內容。
一、找到配置文件:
mac系統中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;對于windows系統,不知道還請見(jiàn)諒。應該可以根據類(lèi)似mac的文件夾地址找到這個(gè)目錄。
二、修改文件 rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函數
修改函數內容(請注意詳細閱讀注釋?zhuān)@里只是介紹原理,了解后根據自己的情況修改內容):
========2017 年 1 月 11 日更新==========
因為有兩種頁(yè)面格式,相同的頁(yè)面格式總是在不同的微信賬號中顯示,但是為了兼容兩種頁(yè)面格式,下面的代碼會(huì )保留兩種頁(yè)面格式的判斷。您也可以按照從您自己的頁(yè)面表單中刪除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
if(serverResData.toString() !== ""){
try {//防止報錯退出程序
var reg = /msgList = (.*?);\r\n/;//定義歷史消息正則匹配規則
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);//錯誤捕捉
}
callback(serverResData);//直接返回第二頁(yè)json內容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代碼就是利用anyproxy修改返回頁(yè)面的內容,向頁(yè)面注入腳本,將頁(yè)面內容發(fā)送到服務(wù)器的功能。利用這個(gè)原理批量處理采集公眾號內容和閱讀量。該腳本中自定義了一個(gè)函數,詳細說(shuō)明如下:
在 rule_default.js 文件末尾添加以下代碼:
function HttpPost(str,url,path) {//將json發(fā)送到服務(wù)器,str為json內容,url為歷史消息頁(yè)面地址,path是接收程序的路徑和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意沒(méi)有http://,這是服務(wù)器的域名。
port: 80,
path: path,//接收程序的路徑和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是規則修改的主要部分。您需要將json內容發(fā)送到您自己的服務(wù)器,并從服務(wù)器獲取到下一頁(yè)的跳轉地址。這涉及到四個(gè)php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在詳細介紹這4個(gè)php文件之前,為了提高采集系統性能,降低崩潰率,我們還可以做一些修改:
Android模擬器經(jīng)常訪(fǎng)問(wèn)一些地址,會(huì )導致anyproxy崩潰,找到函數replaceRequestOption:function(req,option),修改函數內容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的規則文件的修改配置。配置修改完成后,重啟anyproxy。在mac系統下,按control+c中斷程序,然后輸入命令sudo anyproxy -i啟動(dòng);如果報錯,程序可能無(wú)法干凈退出,端口被占用。這時(shí)候輸入命令ps -a查看占用的pid,然后輸入命令“kill -9 pid”將pid替換為查詢(xún)到的pid號。殺掉進(jìn)程后,就可以啟動(dòng)anyproxy了。再次請原諒我不熟悉windows命令。
接下來(lái)詳細介紹服務(wù)器端接收程序的設計原理:
?。ㄒ韵麓a不能直接使用,只介紹原理,部分需要根據自己的服務(wù)器數據庫框架編寫(xiě))
1、getMsgJson.php:該程序負責接收歷史消息的json,解析并存入數據庫
<p> 查看全部
微信公眾號歷史消息頁(yè)面的鏈接地址將持續更新
我從2014年開(kāi)始做微信公眾號內容的批量采集,最初的目的是為了制造一個(gè)html5垃圾郵件網(wǎng)站。當時(shí)垃圾站采集到達的微信公眾號的內容很容易在公眾號傳播。當時(shí)批量采集特別好做,采集入口就是公眾號的歷史新聞頁(yè)面。這個(gè)條目現在是一樣的,但越來(lái)越難采集。 采集 方法也在很多版本中進(jìn)行了更新。后來(lái)到了2015年,html5垃圾站就不做了。取而代之的是采集目標針對本地新聞資訊公眾號,前端展示被做成了一個(gè)app。于是一個(gè)可以自動(dòng)采集公號內容的新聞APP就形成了。曾經(jīng)擔心微信技術(shù)升級一天后,采集內容不可用,我的新聞應用程序失敗。但是隨著(zhù)微信的不斷技術(shù)升級,采集方式也得到了升級,這讓我越來(lái)越有信心。只要公眾號歷史消息頁(yè)面存在,就可以批量采集內容。所以今天整理了一下,決定寫(xiě)下采集方法。我的方法來(lái)自于很多同事的分享精神,所以我會(huì )延續這種精神,分享我的成果。
本文文章會(huì )持續更新,所見(jiàn)即所得。
首先我們來(lái)看一個(gè)微信公眾號歷史消息頁(yè)面的鏈接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
現在根據不同的微信個(gè)人賬號,會(huì )有兩個(gè)不同的歷史消息頁(yè)面地址。下面是另一個(gè)歷史消息頁(yè)面的地址。第一種地址的鏈接在anyproxy中會(huì )顯示302跳轉:
https://mp.weixin.qq.com/mp/pr ... irect
第一個(gè)鏈接地址的頁(yè)面樣式:

第二個(gè)鏈接地址的頁(yè)面樣式:

根據目前的信息,這兩種頁(yè)面格式在不同的微信賬號中出現不規則。有的微信賬號永遠是第一頁(yè)格式,有的永遠是第二頁(yè)格式。
上面的鏈接是微信公眾號歷史新聞頁(yè)面的真實(shí)鏈接,但是當我們在瀏覽器中輸入這個(gè)鏈接時(shí),會(huì )顯示:請從微信客戶(hù)端訪(fǎng)問(wèn)。這是因為鏈接地址實(shí)際上需要幾個(gè)參數才能正常顯示內容。來(lái)看看可以正常顯示內容的完整鏈接:
//第一種鏈接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二種
http://mp.weixin.qq.com/mp/pro ... r%3D1
該地址是通過(guò)微信客戶(hù)端打開(kāi)歷史消息頁(yè)面后,使用后面介紹的代理服務(wù)器軟件獲取的。這里有幾個(gè)參數:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的參數是:__biz;uin=;key=;pass_ticket=;這4個(gè)參數。
__biz 是公眾號的類(lèi)似id的參數。每個(gè)公眾號都有一個(gè)微信。目前公眾號的biz變動(dòng)的可能性很??;
剩下的3個(gè)參數與用戶(hù)id和tokenticket的含義有關(guān)。這3個(gè)參數的值在微信客戶(hù)端生成后會(huì )自動(dòng)添加到地址欄。所以我們認為采集公眾號必須通過(guò)微信客戶(hù)端。在之前的微信版本中,這3個(gè)參數也可以一次性獲取,在有效期內可以使用多個(gè)公眾號。在當前版本中,每次訪(fǎng)問(wèn)公眾號都會(huì )更改參數值。
我現在使用的方法只需要關(guān)注__biz參數即可。
我的采集系統由以下部分組成:
1、A 微信客戶(hù)端:可以是安裝了微信應用的手機,也可以是電腦中的安卓模擬器。批量采集測試的ios微信客戶(hù)端崩潰率高于A(yíng)ndroid系統。為了降低成本,我使用了Android模擬器。

2、A微信個(gè)人號:對于采集內容,不僅需要一個(gè)微信客戶(hù)端,還需要一個(gè)采集專(zhuān)用的微信個(gè)人號,因為這個(gè)微信號不能做其他事情。
3、本地代理服務(wù)器系統:目前使用的方法是通過(guò)Anyproxy代理服務(wù)器將公眾號歷史消息頁(yè)面中的文章列表發(fā)送到自己的服務(wù)器。具體安裝方法后面會(huì )詳細介紹。
4、文章List分析入庫系統:本人使用php語(yǔ)言編寫(xiě),下面文章將詳細介紹如何分析文章lists并建立采集queues實(shí)現批量采集內容.
步驟
一、 安裝模擬器或使用手機安裝微信客戶(hù)端APP,申請微信個(gè)人賬號并登錄APP。這個(gè)就不多介紹了,大家自己做。
二、代理服務(wù)器系統安裝
目前我使用 Anyproxy、AnyProxy。這個(gè)軟件的特點(diǎn)是可以獲取https鏈接的內容。 2016年初,微信公眾號和微信文章開(kāi)始使用https鏈接。而Anyproxy可以通過(guò)修改規則配置,在公眾號頁(yè)面插入腳本代碼。下面將介紹安裝和配置過(guò)程。
1、Install NodeJS
2、在命令行或終端運行npm install -g anyproxy,mac系統需要添加sudo;
3、生成RootCA,https需要這個(gè)證書(shū):運行命令sudo anyproxy --root(windows可能不需要sudo);
4、 啟動(dòng) anyproxy 運行命令:sudo anyproxy -i;參數-i表示解析HTTPS;
5、安裝證書(shū),在手機或者安卓模擬器安裝證書(shū):
6、Set proxy:安卓模擬器的代理服務(wù)器地址是wifi鏈接的網(wǎng)關(guān)。通過(guò)dhcp設置為static后就可以看到網(wǎng)關(guān)地址了。閱讀后不要忘記將其設置為自動(dòng)。手機中的代理服務(wù)器地址就是運行anyproxy的電腦的ip地址。代理服務(wù)器默認端口為8001;

現在打開(kāi)微信,點(diǎn)擊任意公眾號歷史消息或者文章,就可以看到在終端滾動(dòng)的響應碼。如果沒(méi)有出現,請檢查手機的代理設置是否正確。

現在打開(kāi)瀏覽器地址localhost:8002,可以看到anyproxy的web界面。微信點(diǎn)擊打開(kāi)一個(gè)歷史消息頁(yè)面,然后在瀏覽器的web界面查看,歷史消息頁(yè)面的地址會(huì )滾動(dòng)。

/mp/getmasssendmsg開(kāi)頭的網(wǎng)址是微信歷史消息頁(yè)面。左邊的小鎖表示這個(gè)頁(yè)面是 https 加密的?,F在我們點(diǎn)擊這一行;
========2017 年 1 月 11 日更新==========
一些以/mp/getmasssendmsg開(kāi)頭的微信網(wǎng)址會(huì )有302跳轉到以/mp/profile_ext?action=home開(kāi)頭的地址。所以點(diǎn)擊這個(gè)地址可以看到內容。

如果右側出現html文件內容,則表示解密成功。如果沒(méi)有內容,請檢查anyproxy運行方式是否有參數i,是否生成CA證書(shū),是否在手機上正確安裝了證書(shū)。
現在我們手機中的所有內容都可以明文通過(guò)代理服務(wù)器了。接下來(lái),我們需要修改代理服務(wù)器的配置,以便獲取公眾號的內容。
一、找到配置文件:
mac系統中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;對于windows系統,不知道還請見(jiàn)諒。應該可以根據類(lèi)似mac的文件夾地址找到這個(gè)目錄。
二、修改文件 rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函數
修改函數內容(請注意詳細閱讀注釋?zhuān)@里只是介紹原理,了解后根據自己的情況修改內容):
========2017 年 1 月 11 日更新==========
因為有兩種頁(yè)面格式,相同的頁(yè)面格式總是在不同的微信賬號中顯示,但是為了兼容兩種頁(yè)面格式,下面的代碼會(huì )保留兩種頁(yè)面格式的判斷。您也可以按照從您自己的頁(yè)面表單中刪除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
if(serverResData.toString() !== ""){
try {//防止報錯退出程序
var reg = /msgList = (.*?);\r\n/;//定義歷史消息正則匹配規則
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);//錯誤捕捉
}
callback(serverResData);//直接返回第二頁(yè)json內容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
var ret = reg.exec(serverResData.toString());//轉換變量為string
HttpPost(ret[1],req.url,"getMsgJson.php");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代碼就是利用anyproxy修改返回頁(yè)面的內容,向頁(yè)面注入腳本,將頁(yè)面內容發(fā)送到服務(wù)器的功能。利用這個(gè)原理批量處理采集公眾號內容和閱讀量。該腳本中自定義了一個(gè)函數,詳細說(shuō)明如下:
在 rule_default.js 文件末尾添加以下代碼:
function HttpPost(str,url,path) {//將json發(fā)送到服務(wù)器,str為json內容,url為歷史消息頁(yè)面地址,path是接收程序的路徑和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意沒(méi)有http://,這是服務(wù)器的域名。
port: 80,
path: path,//接收程序的路徑和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是規則修改的主要部分。您需要將json內容發(fā)送到您自己的服務(wù)器,并從服務(wù)器獲取到下一頁(yè)的跳轉地址。這涉及到四個(gè)php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在詳細介紹這4個(gè)php文件之前,為了提高采集系統性能,降低崩潰率,我們還可以做一些修改:
Android模擬器經(jīng)常訪(fǎng)問(wèn)一些地址,會(huì )導致anyproxy崩潰,找到函數replaceRequestOption:function(req,option),修改函數內容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的規則文件的修改配置。配置修改完成后,重啟anyproxy。在mac系統下,按control+c中斷程序,然后輸入命令sudo anyproxy -i啟動(dòng);如果報錯,程序可能無(wú)法干凈退出,端口被占用。這時(shí)候輸入命令ps -a查看占用的pid,然后輸入命令“kill -9 pid”將pid替換為查詢(xún)到的pid號。殺掉進(jìn)程后,就可以啟動(dòng)anyproxy了。再次請原諒我不熟悉windows命令。
接下來(lái)詳細介紹服務(wù)器端接收程序的設計原理:
?。ㄒ韵麓a不能直接使用,只介紹原理,部分需要根據自己的服務(wù)器數據庫框架編寫(xiě))
1、getMsgJson.php:該程序負責接收歷史消息的json,解析并存入數據庫
<p>
沒(méi)有哪個(gè)app只投放廣告這一塊,就是朋友圈廣告
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2021-06-01 00:03
querylist采集微信公眾號文章數據,
沒(méi)有哪個(gè)app只投放廣告這一塊。要看你投放的是什么app,投放的什么廣告方式。不過(guò)確實(shí)有些app只投放廣告不做自身品牌推廣的。
我能想到的就是“seo+aso”
我能想到的就是朋友圈廣告了,但是小游戲目前是做不了的,其他一些app廣告的用戶(hù)已經(jīng)足夠覆蓋到的,甚至不需要推廣,
樓上那位觀(guān)點(diǎn)其實(shí)蠻對的。但是如果樓主只想看朋友圈廣告。
app營(yíng)銷(xiāo),廣告營(yíng)銷(xiāo),提高app商戶(hù)知名度,變現,然后才是品牌推廣。
朋友圈廣告大品牌推廣有效果,多數產(chǎn)品有10-50%roi。
相信這個(gè)問(wèn)題目前大多數app都會(huì )存在這個(gè)疑問(wèn),對于初期手機廣告市場(chǎng)最有效的推廣方式之一就是朋友圈廣告了。而對于app開(kāi)發(fā)者來(lái)說(shuō)選擇合適的廣告形式,選擇靠譜的廣告公司就尤為重要了??梢酝ㄟ^(guò)三個(gè)維度來(lái)考量廣告推廣的效果:廣告覆蓋人群精準、內容有趣與實(shí)用性、廣告點(diǎn)擊量廣告覆蓋人群越精準、內容有趣與實(shí)用性越好,而廣告點(diǎn)擊量越高,品牌知名度就越高。我司可根據以上方面定制出適合的朋友圈廣告形式。
每個(gè)app推廣方式不一樣但都是通過(guò)一個(gè)渠道把你的產(chǎn)品推到目標用戶(hù)群體中,所以不同的app推廣方式也肯定不同,說(shuō)到底還是選擇適合自己的app推廣渠道來(lái)實(shí)現轉化率, 查看全部
沒(méi)有哪個(gè)app只投放廣告這一塊,就是朋友圈廣告
querylist采集微信公眾號文章數據,
沒(méi)有哪個(gè)app只投放廣告這一塊。要看你投放的是什么app,投放的什么廣告方式。不過(guò)確實(shí)有些app只投放廣告不做自身品牌推廣的。
我能想到的就是“seo+aso”
我能想到的就是朋友圈廣告了,但是小游戲目前是做不了的,其他一些app廣告的用戶(hù)已經(jīng)足夠覆蓋到的,甚至不需要推廣,
樓上那位觀(guān)點(diǎn)其實(shí)蠻對的。但是如果樓主只想看朋友圈廣告。
app營(yíng)銷(xiāo),廣告營(yíng)銷(xiāo),提高app商戶(hù)知名度,變現,然后才是品牌推廣。
朋友圈廣告大品牌推廣有效果,多數產(chǎn)品有10-50%roi。
相信這個(gè)問(wèn)題目前大多數app都會(huì )存在這個(gè)疑問(wèn),對于初期手機廣告市場(chǎng)最有效的推廣方式之一就是朋友圈廣告了。而對于app開(kāi)發(fā)者來(lái)說(shuō)選擇合適的廣告形式,選擇靠譜的廣告公司就尤為重要了??梢酝ㄟ^(guò)三個(gè)維度來(lái)考量廣告推廣的效果:廣告覆蓋人群精準、內容有趣與實(shí)用性、廣告點(diǎn)擊量廣告覆蓋人群越精準、內容有趣與實(shí)用性越好,而廣告點(diǎn)擊量越高,品牌知名度就越高。我司可根據以上方面定制出適合的朋友圈廣告形式。
每個(gè)app推廣方式不一樣但都是通過(guò)一個(gè)渠道把你的產(chǎn)品推到目標用戶(hù)群體中,所以不同的app推廣方式也肯定不同,說(shuō)到底還是選擇適合自己的app推廣渠道來(lái)實(shí)現轉化率,