
querylist采集微信公眾號文章
java微信公眾號第三方接入解析及全網(wǎng)檢查代碼示例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 172 次瀏覽 ? 2020-08-22 12:10
一、接入大體思路解析
這里主要是查看文檔的授權流程技術(shù)說(shuō)明,這里從開(kāi)發(fā)者角度介紹。
接入第三方的開(kāi)發(fā)者想必早已對公眾號開(kāi)發(fā)比較了解,第三方是代微信號實(shí)現功能的一個(gè)組件,所以其實(shí)陌陌方的開(kāi)發(fā)們也是這么考慮,為第三方的access_token起名為component_access_token。
1、首先獲取第三方
component_access_token
這個(gè)過(guò)程中會(huì )使用到陌陌服務(wù)器定期向我們服務(wù)器推送的component_verify_ticket數組,加上component_appid、component_appsecret等信息即可獲得。
2、獲取授權公眾號信息
類(lèi)似公眾號網(wǎng)頁(yè)授權,通過(guò)反彈的方式,微信公眾號運營(yíng)者可以通過(guò)陌陌掃碼的方式將公眾號授權給第三方,唯一有些不同的這兒在拼出授權跳轉頁(yè)面url后的第一步是引導用戶(hù)跳轉到該頁(yè)面上,再進(jìn)行掃碼,所以這個(gè)跳轉不是必須在陌陌外置瀏覽器中進(jìn)行。
拼出的url中的參數出了要用到component_access_token外還須要一個(gè)pre_auth_code預授權碼,可通過(guò)component_access_token獲得,具體的實(shí)效時(shí)間機制和component_access_token差不多。
用戶(hù)授權成功后會(huì )在redirect_url后接參數auth_code,類(lèi)似公眾號網(wǎng)頁(yè)授權的code值,通過(guò)auth_code和component_access_token等信息即可獲得該授權公眾號信息,若中間要與公眾號第三方平臺的帳號綁定再帶一個(gè)帳號標識參數即可。
3、帶公眾號實(shí)現業(yè)務(wù)
公眾號授權成功后第三方會(huì )得到該公眾號的authorizer_access_token,與公眾號的access_token功能相同,使用這個(gè)即可用微信公眾號的插口代公眾號實(shí)現業(yè)務(wù)。
有些不同的再第三方文檔里以有說(shuō)明。官方文檔
另外文檔上沒(méi)有提及的是,每當有公眾號授權成功后,微信服務(wù)器會(huì )將公眾號授權信息推送到授權風(fēng)波接收URL,即接收component_verify_ticket的插口。
4、關(guān)于加密揭秘
獲取陌陌服務(wù)器推送信息的時(shí)侯都是進(jìn)行加密的。
二、接入中發(fā)覺(jué)的幾個(gè)問(wèn)題1、微信的示例java代碼,XMLParse類(lèi)中
/**
* 提取出xml數據包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public static Object[] extract(String xmltext) throws AesException {
Object[] result = new Object[3];
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
NodeList nodelist1 = root.getElementsByTagName("Encrypt");
NodeList nodelist2 = root.getElementsByTagName("ToUserName");
System.out.println("nodelist2.item(0)="+nodelist2.item(0));
result[0] = 0;
result[1] = nodelist1.item(0).getTextContent();
//這里加了一個(gè)判斷,因為接收推送component_verify_ticket的解謎過(guò)程中沒(méi)有第三個(gè)參數,回報空指針異常
if(nodelist2.item(0) != null){
result[2] = nodelist2.item(0).getTextContent();
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.ParseXmlError);
}
}
2、文檔中:使用授權碼換取公眾號的插口調用憑據和授權信息
返回json信息最后少了一個(gè)}
{
"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77",
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM",
"expires_in": 7200,
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY",
"func_info": [
{
"funcscope_category": {
"id": 1
}
},
{
"funcscope_category": {
"id": 2
}
},
{
"funcscope_category": {
"id": 3
}
}
]
}
}
大家開(kāi)發(fā)時(shí)要注意json數據結構
三、關(guān)于代碼
在 微信公眾帳號第三方平臺全網(wǎng)發(fā)布源碼(java)- 實(shí)戰測試通過(guò) 代碼結構基礎上進(jìn)行更改 查看全部
java微信公眾號第三方接入解析及全網(wǎng)監測代碼示例
一、接入大體思路解析
這里主要是查看文檔的授權流程技術(shù)說(shuō)明,這里從開(kāi)發(fā)者角度介紹。
接入第三方的開(kāi)發(fā)者想必早已對公眾號開(kāi)發(fā)比較了解,第三方是代微信號實(shí)現功能的一個(gè)組件,所以其實(shí)陌陌方的開(kāi)發(fā)們也是這么考慮,為第三方的access_token起名為component_access_token。
1、首先獲取第三方
component_access_token
這個(gè)過(guò)程中會(huì )使用到陌陌服務(wù)器定期向我們服務(wù)器推送的component_verify_ticket數組,加上component_appid、component_appsecret等信息即可獲得。
2、獲取授權公眾號信息
類(lèi)似公眾號網(wǎng)頁(yè)授權,通過(guò)反彈的方式,微信公眾號運營(yíng)者可以通過(guò)陌陌掃碼的方式將公眾號授權給第三方,唯一有些不同的這兒在拼出授權跳轉頁(yè)面url后的第一步是引導用戶(hù)跳轉到該頁(yè)面上,再進(jìn)行掃碼,所以這個(gè)跳轉不是必須在陌陌外置瀏覽器中進(jìn)行。
拼出的url中的參數出了要用到component_access_token外還須要一個(gè)pre_auth_code預授權碼,可通過(guò)component_access_token獲得,具體的實(shí)效時(shí)間機制和component_access_token差不多。
用戶(hù)授權成功后會(huì )在redirect_url后接參數auth_code,類(lèi)似公眾號網(wǎng)頁(yè)授權的code值,通過(guò)auth_code和component_access_token等信息即可獲得該授權公眾號信息,若中間要與公眾號第三方平臺的帳號綁定再帶一個(gè)帳號標識參數即可。
3、帶公眾號實(shí)現業(yè)務(wù)
公眾號授權成功后第三方會(huì )得到該公眾號的authorizer_access_token,與公眾號的access_token功能相同,使用這個(gè)即可用微信公眾號的插口代公眾號實(shí)現業(yè)務(wù)。
有些不同的再第三方文檔里以有說(shuō)明。官方文檔
另外文檔上沒(méi)有提及的是,每當有公眾號授權成功后,微信服務(wù)器會(huì )將公眾號授權信息推送到授權風(fēng)波接收URL,即接收component_verify_ticket的插口。
4、關(guān)于加密揭秘
獲取陌陌服務(wù)器推送信息的時(shí)侯都是進(jìn)行加密的。
二、接入中發(fā)覺(jué)的幾個(gè)問(wèn)題1、微信的示例java代碼,XMLParse類(lèi)中
/**
* 提取出xml數據包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public static Object[] extract(String xmltext) throws AesException {
Object[] result = new Object[3];
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
NodeList nodelist1 = root.getElementsByTagName("Encrypt");
NodeList nodelist2 = root.getElementsByTagName("ToUserName");
System.out.println("nodelist2.item(0)="+nodelist2.item(0));
result[0] = 0;
result[1] = nodelist1.item(0).getTextContent();
//這里加了一個(gè)判斷,因為接收推送component_verify_ticket的解謎過(guò)程中沒(méi)有第三個(gè)參數,回報空指針異常
if(nodelist2.item(0) != null){
result[2] = nodelist2.item(0).getTextContent();
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.ParseXmlError);
}
}
2、文檔中:使用授權碼換取公眾號的插口調用憑據和授權信息
返回json信息最后少了一個(gè)}
{
"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77",
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM",
"expires_in": 7200,
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY",
"func_info": [
{
"funcscope_category": {
"id": 1
}
},
{
"funcscope_category": {
"id": 2
}
},
{
"funcscope_category": {
"id": 3
}
}
]
}
}
大家開(kāi)發(fā)時(shí)要注意json數據結構
三、關(guān)于代碼
在 微信公眾帳號第三方平臺全網(wǎng)發(fā)布源碼(java)- 實(shí)戰測試通過(guò) 代碼結構基礎上進(jìn)行更改
搜狗陌陌的抓取總結
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 266 次瀏覽 ? 2020-08-21 22:19
最近抓取了搜狗陌陌的數據,雖然也破解了跳轉之類(lèi)的,但是最后由于抓取的鏈接有時(shí)效性舍棄了,也總結下
一樣的,輸入關(guān)鍵詞,抓取列表,再回來(lái)跳轉后的陌陌鏈接
前10頁(yè)是可以隨意看的,也不需要登陸,10頁(yè)以后的數據須要陌陌掃碼登陸,這一塊無(wú)法破解
鏈接參數好多最后可以精簡(jiǎn)為
烽火&page=11&type=2
page就是頁(yè)腳,query就是關(guān)鍵字,type 是搜索文章還是搜索公眾號
其實(shí)很簡(jiǎn)單的代碼,先要在url前面構造出 k 和 h,轉化為 java 代碼就是
// 拼接搜狗跳轉參數k和h
public static String getLinkUrl(String url) {
int b = ((int) Math.floor(100 * Math.random())) + 1;
int a = url.indexOf("url=");
int k = a + 4 + 21 + b;
String d = url.substring(k, k + 1);
System.out.println(d);
url += "&k=" + b + "&h=" + d;
return "https://weixin.sogou.com" + url;
}
有參數的鏈接直接懇求是會(huì )出驗證碼的,需要cookie,需要的cookie只要是兩個(gè) 一個(gè)是 SUV,一個(gè)是SNUID,這兩個(gè)cookie獲取都很簡(jiǎn)單,通過(guò)剖析可以得到
1.SUV 是可以通過(guò)訪(fǎng)問(wèn)來(lái)獲取到
2.SNUID 在搜索的時(shí)侯才會(huì )有了
所以我們加上這兩個(gè)cookie才能獲取到具體的陌陌的鏈接了
剩下的就是把這個(gè)鏈接取下來(lái)就行啦
雖然還有好多細節沒(méi)有建立,但是最坑的是最后的陌陌鏈接是有時(shí)效性的
太坑了,市面上有將有時(shí)效的鏈接轉換為沒(méi)有時(shí)效的鏈接的商業(yè)服務(wù),不知道是她們是如何實(shí)現的。目前在看陌陌客戶(hù)端上面的搜一搜,因為通過(guò)客戶(hù)端的搜一搜搜下來(lái)的鏈接是短短的,應該是失效太長(cháng)的
2020-06-04 更新
找到了轉換永久鏈接的辦法,把有時(shí)效性的鏈接復制到陌陌客戶(hù)端上面,不管是過(guò)沒(méi)過(guò)期的鏈接都是才能打開(kāi)的,再把鏈接復制下來(lái)就是永久的鏈接了,使用了 pythonpyautogui 來(lái)操作的,很簡(jiǎn)單,也太low,速度不快,就不放代碼了。 查看全部
搜狗陌陌的抓取總結
最近抓取了搜狗陌陌的數據,雖然也破解了跳轉之類(lèi)的,但是最后由于抓取的鏈接有時(shí)效性舍棄了,也總結下

一樣的,輸入關(guān)鍵詞,抓取列表,再回來(lái)跳轉后的陌陌鏈接
前10頁(yè)是可以隨意看的,也不需要登陸,10頁(yè)以后的數據須要陌陌掃碼登陸,這一塊無(wú)法破解
鏈接參數好多最后可以精簡(jiǎn)為
烽火&page=11&type=2
page就是頁(yè)腳,query就是關(guān)鍵字,type 是搜索文章還是搜索公眾號

其實(shí)很簡(jiǎn)單的代碼,先要在url前面構造出 k 和 h,轉化為 java 代碼就是
// 拼接搜狗跳轉參數k和h
public static String getLinkUrl(String url) {
int b = ((int) Math.floor(100 * Math.random())) + 1;
int a = url.indexOf("url=");
int k = a + 4 + 21 + b;
String d = url.substring(k, k + 1);
System.out.println(d);
url += "&k=" + b + "&h=" + d;
return "https://weixin.sogou.com" + url;
}
有參數的鏈接直接懇求是會(huì )出驗證碼的,需要cookie,需要的cookie只要是兩個(gè) 一個(gè)是 SUV,一個(gè)是SNUID,這兩個(gè)cookie獲取都很簡(jiǎn)單,通過(guò)剖析可以得到
1.SUV 是可以通過(guò)訪(fǎng)問(wèn)來(lái)獲取到

2.SNUID 在搜索的時(shí)侯才會(huì )有了

所以我們加上這兩個(gè)cookie才能獲取到具體的陌陌的鏈接了

剩下的就是把這個(gè)鏈接取下來(lái)就行啦
雖然還有好多細節沒(méi)有建立,但是最坑的是最后的陌陌鏈接是有時(shí)效性的

太坑了,市面上有將有時(shí)效的鏈接轉換為沒(méi)有時(shí)效的鏈接的商業(yè)服務(wù),不知道是她們是如何實(shí)現的。目前在看陌陌客戶(hù)端上面的搜一搜,因為通過(guò)客戶(hù)端的搜一搜搜下來(lái)的鏈接是短短的,應該是失效太長(cháng)的

2020-06-04 更新
找到了轉換永久鏈接的辦法,把有時(shí)效性的鏈接復制到陌陌客戶(hù)端上面,不管是過(guò)沒(méi)過(guò)期的鏈接都是才能打開(kāi)的,再把鏈接復制下來(lái)就是永久的鏈接了,使用了 pythonpyautogui 來(lái)操作的,很簡(jiǎn)單,也太low,速度不快,就不放代碼了。
Python網(wǎng)絡(luò )爬蟲(chóng)學(xué)習筆記(五)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 171 次瀏覽 ? 2020-08-18 18:25
微信公眾號文章爬取
以搜狗的陌陌搜索平臺“”作為爬取入口,可以在搜索欄輸入相應關(guān)鍵詞來(lái)搜索相關(guān)微信公眾號文章。我們以“機器學(xué)習”作為搜索關(guān)鍵詞??梢钥匆?jiàn)搜索后的地址欄中內容為:
%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&_sug_type_=&sut=1872&lkt=1%2C86%2C86&s_from=input&_sug_=n&type=2&sst0=95&page=2&ie=utf8&w=01019900&dr=1
通過(guò)觀(guān)察,可以發(fā)覺(jué)如此幾個(gè)關(guān)鍵數組:
type:控制檢索信息的類(lèi)型query:我們懇求的搜索關(guān)鍵詞page:控制頁(yè)數
所以我們的網(wǎng)址結構可以構造為:
關(guān)鍵詞&type=2&page=頁(yè)碼
然后,我們在每一個(gè)搜索頁(yè)中爬取文章的思路是:
檢索對應關(guān)鍵詞得到的相應文章檢索結果,并在該頁(yè)面上將文章的鏈接提取下來(lái)在文章的鏈接被提取以后,根據這種鏈接地址采集文章中的具體標題和內容
通過(guò)查看文章列表頁(yè)的源代碼可以找到相應文章的URL以及要爬取的內容,列表頁(yè)面如下:
其中第一篇文章網(wǎng)址部份的源代碼如下所示:
機器學(xué)習法則:ML工程的最佳實(shí)踐
圖片源自:Westworld Season 2作者無(wú)邪機器學(xué)習研究者,人工智障推進(jìn)者.Martin Zinkevich 在2016年將 google 內容多年關(guān)于機器學(xué)...
程序人生document.write(timeConvert('1526875397'))
所以我們可以將提取文章網(wǎng)址的正則表達式構造為:
'
這樣就可以依據相關(guān)函數與代碼提取出指定頁(yè)數的文章網(wǎng)址。但是依據正則表達式提取出的網(wǎng)址不是真實(shí)地址,會(huì )出現參數錯誤。提取出的地址比真實(shí)地址多了一些“&”字符串,我們通過(guò)url.replace("amp;","")去掉多余字符串。
這樣就提取了文章的地址,可以依照文章地址爬取相應網(wǎng)頁(yè),并通過(guò)代理服務(wù)器的方式,解決官方屏蔽IP的問(wèn)題。
整個(gè)爬取陌陌文章的思路如下:
建立三個(gè)自定義函數:實(shí)現使用代理服務(wù)器爬去指定網(wǎng)址并返回結果;實(shí)現獲得多個(gè)頁(yè)面的所有文章鏈接;實(shí)現依據文章鏈接爬取指定標題和內容并寫(xiě)入文件中。使用代理服務(wù)器爬取指定網(wǎng)址的內容實(shí)現獲取多個(gè)頁(yè)面的所有文章鏈接時(shí),需要對關(guān)鍵詞使用urllib.request.quote(key)進(jìn)行編碼,并通過(guò)for循環(huán)一次爬取各頁(yè)的文章中設置的服務(wù)器函數實(shí)現。實(shí)現依據文章鏈接爬取指定標題和內容寫(xiě)入對應文件,使用for循環(huán)一次爬取。代碼中假如發(fā)生異常,要進(jìn)行延時(shí)處理。
具體代碼如下: 查看全部
Python網(wǎng)絡(luò )爬蟲(chóng)學(xué)習筆記(五)
微信公眾號文章爬取
以搜狗的陌陌搜索平臺“”作為爬取入口,可以在搜索欄輸入相應關(guān)鍵詞來(lái)搜索相關(guān)微信公眾號文章。我們以“機器學(xué)習”作為搜索關(guān)鍵詞??梢钥匆?jiàn)搜索后的地址欄中內容為:
%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&_sug_type_=&sut=1872&lkt=1%2C86%2C86&s_from=input&_sug_=n&type=2&sst0=95&page=2&ie=utf8&w=01019900&dr=1
通過(guò)觀(guān)察,可以發(fā)覺(jué)如此幾個(gè)關(guān)鍵數組:
type:控制檢索信息的類(lèi)型query:我們懇求的搜索關(guān)鍵詞page:控制頁(yè)數
所以我們的網(wǎng)址結構可以構造為:
關(guān)鍵詞&type=2&page=頁(yè)碼
然后,我們在每一個(gè)搜索頁(yè)中爬取文章的思路是:
檢索對應關(guān)鍵詞得到的相應文章檢索結果,并在該頁(yè)面上將文章的鏈接提取下來(lái)在文章的鏈接被提取以后,根據這種鏈接地址采集文章中的具體標題和內容
通過(guò)查看文章列表頁(yè)的源代碼可以找到相應文章的URL以及要爬取的內容,列表頁(yè)面如下:
其中第一篇文章網(wǎng)址部份的源代碼如下所示:
機器學(xué)習法則:ML工程的最佳實(shí)踐
圖片源自:Westworld Season 2作者無(wú)邪機器學(xué)習研究者,人工智障推進(jìn)者.Martin Zinkevich 在2016年將 google 內容多年關(guān)于機器學(xué)...
程序人生document.write(timeConvert('1526875397'))
所以我們可以將提取文章網(wǎng)址的正則表達式構造為:
'
這樣就可以依據相關(guān)函數與代碼提取出指定頁(yè)數的文章網(wǎng)址。但是依據正則表達式提取出的網(wǎng)址不是真實(shí)地址,會(huì )出現參數錯誤。提取出的地址比真實(shí)地址多了一些“&”字符串,我們通過(guò)url.replace("amp;","")去掉多余字符串。
這樣就提取了文章的地址,可以依照文章地址爬取相應網(wǎng)頁(yè),并通過(guò)代理服務(wù)器的方式,解決官方屏蔽IP的問(wèn)題。
整個(gè)爬取陌陌文章的思路如下:
建立三個(gè)自定義函數:實(shí)現使用代理服務(wù)器爬去指定網(wǎng)址并返回結果;實(shí)現獲得多個(gè)頁(yè)面的所有文章鏈接;實(shí)現依據文章鏈接爬取指定標題和內容并寫(xiě)入文件中。使用代理服務(wù)器爬取指定網(wǎng)址的內容實(shí)現獲取多個(gè)頁(yè)面的所有文章鏈接時(shí),需要對關(guān)鍵詞使用urllib.request.quote(key)進(jìn)行編碼,并通過(guò)for循環(huán)一次爬取各頁(yè)的文章中設置的服務(wù)器函數實(shí)現。實(shí)現依據文章鏈接爬取指定標題和內容寫(xiě)入對應文件,使用for循環(huán)一次爬取。代碼中假如發(fā)生異常,要進(jìn)行延時(shí)處理。
具體代碼如下:
微信公眾號歷史消息采集方法及注意事項
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 462 次瀏覽 ? 2020-08-18 15:34
采集微信文章和采集網(wǎng)站內容一樣,都須要從一個(gè)列表頁(yè)開(kāi)始。而陌陌文章的列表頁(yè)就是公眾號里的查看歷史消息頁(yè)?,F在網(wǎng)路上的其它陌陌采集器有的是借助搜狗搜索,采集方式其實(shí)簡(jiǎn)單多了,但是內容不全。所以我們還是要從最標準最全面的公眾號歷史消息頁(yè)來(lái)采集。
因為陌陌的限制,我們能復制到的鏈接是不完整的,在瀏覽器中未能打開(kāi)聽(tīng)到內容。所以我們須要通過(guò)上一篇文章介紹的方式,使用anyproxy獲取到一個(gè)完整的微信公眾號歷史消息頁(yè)面的鏈接地址。
f9387c4d02682e186a298a18276d8e0555e3ab51d81ca46de339e6082eb767343bef610edd80c9e1bfda66c
2b62751511f7cc091a33a029709e94f0d1604e11220fc099a27b2e2d29db75cc0849d4bf&devicetype=andro
id-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=Iox5ZdpRhrSxGYEeopVJwTB
P7kZj51GYyEL24AT5Zyx%2BBoEMdPDBtOun1F%2F9ENSz&wx_header=1
biz參數是公眾號的ID,uin是用戶(hù)的ID,目前來(lái)看uin是在所有公眾號之間惟一的。其它兩個(gè)重要參數key和pass_ticket是陌陌客戶(hù)端補充上的參數。
所以在這個(gè)地址失效之前我們是可以通過(guò)瀏覽器查看原文的方式獲取到歷史消息的文章列表的,如果希望自動(dòng)化剖析內容,也可以制做一個(gè)程序,將這個(gè)帶有仍未失效的key和pass_ticket的鏈接地址遞交進(jìn)去,再通過(guò)諸如php程序來(lái)獲取到文章列表。
最近有同事跟我說(shuō)他的采集目標就是單一的一個(gè)公眾號,我認為這樣就沒(méi)必要用上一篇文章寫(xiě)的批量采集的方式了。所以我們接下來(lái)瞧瞧歷史消息頁(yè)上面是如何獲取到文章列表的,通過(guò)剖析文章列表,就可以得到這個(gè)公眾號所有的內容鏈接地址,然后再采集內容就可以了。
在anyproxy的web界面中若果證書(shū)配置正確,是可以顯示出https的內容的。web界面的地址是:8002 其中localhost可以替換成自己的IP地址或域名。從列表中找到getmasssendmsg開(kāi)頭的記錄,點(diǎn)擊以后兩側都會(huì )顯示出這條記錄的詳情:
紅框部份就是完整的鏈接地址,將微信公眾平臺這個(gè)域名拼接在上面以后就可以在瀏覽器中打開(kāi)了。
然后將頁(yè)面向上拉,到html內容的結尾部份,我們可以看見(jiàn)一個(gè)json的變量就是歷史消息的文章列表:
我們將msgList的變量值拷貝下來(lái),用json低格工具剖析一下,我們就可以看見(jiàn)這個(gè)json是以下這個(gè)結構:
{
"list": [
{
"app_msg_ext_info": {
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 76742
7&idx=1&sn=37da0d7208283bf90e9a4a536e0af0ea&chksm=8b882dbbbcffa4ad2f0b8a141cc988d16bac
e564274018e68e5c53ee6f354f8ad56c9b98bade&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz/Mof ... gLtcq
GziaFqwibzvtZAHCDkMeJU1fGZHpjoeibanPJ8rziaq68Akkg/0?wx_fmt=jpeg",
"digest": "擦亮雙眼,遠離謠言。",
"fileid": 505283695,
"is_multi": 1,
"multi_app_msg_item_list": [
{
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 65276
7427&idx=2&sn=449ef1a874a37fed2429e14f724b56ef&chksm=8 b882dbbbcffa4ade48a7932cda426368
7e34fca8ea3a5a6233d2589d448b9f6130d3890ce93&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz_png ... YHYrh
ibia89ZnksCsUiaia2TLI1fyqjclibGa1hw3icP6oXeSpaWMjiabaghHl7yw/0?wx_fmt=png",
"digest": "12月28日,廣州亞運城綜合體育館,內附購票入口~",
"fileid": 0,
"source_url": "http://wechat.show.wepiao.com/ ... b56b9 98e1f2b8?detailReferrer=1&from=groupmessage&isappinstalled=0",
"title": "2017微信公開(kāi)課Pro版即將召開(kāi)"
},
...//循環(huán)被省略
],
"source_url": "",
"subtype": 9,
"title": "謠言熱榜 | 十一月朋友圈十大謠言"
},
"comm_msg_info": {
"content": "",
"datetime": 1480933315,
"fakeid": "3093134871",
"id": 1000000010,
"status": 2,
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
}
簡(jiǎn)要的剖析一下這個(gè)json(這里只介紹一些重要的信息,其它的被省略):
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "??",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""??"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
在這里還要提及一點(diǎn)就是假如希望獲取到時(shí)間更久遠一些的歷史消息內容,就須要在手機或模擬器上將頁(yè)面向上拉,當拉到最里邊的時(shí)侯,微信將手動(dòng)讀取下一頁(yè)的內容。下一頁(yè)的鏈接地址和歷史消息頁(yè)的鏈接地址同樣是getmasssendmsg開(kāi)頭的地址。但是內容就是只有json了,沒(méi)有html了。直接解析json就可以了。
這時(shí)可以通過(guò)上一篇文章介紹的方式,使用anyproxy將msgList變量值正則匹配下來(lái)以后,異步遞交到服務(wù)器,再從服務(wù)器上使用php的json_decode解析json成為字段。然后遍歷循環(huán)鏈表。我們就可以得到每一篇文章的標題和鏈接地址。
如果只須要采集單一公眾號的內容,完全可以在每晚群發(fā)以后,通過(guò)anyproxy獲取到完整的帶有key和pass_ticket的鏈接地址。然后自己制做一個(gè)程序,手動(dòng)將地址遞交給自己的程序。使用諸如php這樣的語(yǔ)言來(lái)正則匹配到msgList,然后解析json。這樣就不用更改anyproxy的rule,也不需要制做一個(gè)采集隊列和跳轉頁(yè)面了。 查看全部
微信公眾號歷史消息采集方法及注意事項
采集微信文章和采集網(wǎng)站內容一樣,都須要從一個(gè)列表頁(yè)開(kāi)始。而陌陌文章的列表頁(yè)就是公眾號里的查看歷史消息頁(yè)?,F在網(wǎng)路上的其它陌陌采集器有的是借助搜狗搜索,采集方式其實(shí)簡(jiǎn)單多了,但是內容不全。所以我們還是要從最標準最全面的公眾號歷史消息頁(yè)來(lái)采集。
因為陌陌的限制,我們能復制到的鏈接是不完整的,在瀏覽器中未能打開(kāi)聽(tīng)到內容。所以我們須要通過(guò)上一篇文章介紹的方式,使用anyproxy獲取到一個(gè)完整的微信公眾號歷史消息頁(yè)面的鏈接地址。
f9387c4d02682e186a298a18276d8e0555e3ab51d81ca46de339e6082eb767343bef610edd80c9e1bfda66c
2b62751511f7cc091a33a029709e94f0d1604e11220fc099a27b2e2d29db75cc0849d4bf&devicetype=andro
id-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=Iox5ZdpRhrSxGYEeopVJwTB
P7kZj51GYyEL24AT5Zyx%2BBoEMdPDBtOun1F%2F9ENSz&wx_header=1
biz參數是公眾號的ID,uin是用戶(hù)的ID,目前來(lái)看uin是在所有公眾號之間惟一的。其它兩個(gè)重要參數key和pass_ticket是陌陌客戶(hù)端補充上的參數。
所以在這個(gè)地址失效之前我們是可以通過(guò)瀏覽器查看原文的方式獲取到歷史消息的文章列表的,如果希望自動(dòng)化剖析內容,也可以制做一個(gè)程序,將這個(gè)帶有仍未失效的key和pass_ticket的鏈接地址遞交進(jìn)去,再通過(guò)諸如php程序來(lái)獲取到文章列表。
最近有同事跟我說(shuō)他的采集目標就是單一的一個(gè)公眾號,我認為這樣就沒(méi)必要用上一篇文章寫(xiě)的批量采集的方式了。所以我們接下來(lái)瞧瞧歷史消息頁(yè)上面是如何獲取到文章列表的,通過(guò)剖析文章列表,就可以得到這個(gè)公眾號所有的內容鏈接地址,然后再采集內容就可以了。
在anyproxy的web界面中若果證書(shū)配置正確,是可以顯示出https的內容的。web界面的地址是:8002 其中localhost可以替換成自己的IP地址或域名。從列表中找到getmasssendmsg開(kāi)頭的記錄,點(diǎn)擊以后兩側都會(huì )顯示出這條記錄的詳情:

紅框部份就是完整的鏈接地址,將微信公眾平臺這個(gè)域名拼接在上面以后就可以在瀏覽器中打開(kāi)了。
然后將頁(yè)面向上拉,到html內容的結尾部份,我們可以看見(jiàn)一個(gè)json的變量就是歷史消息的文章列表:

我們將msgList的變量值拷貝下來(lái),用json低格工具剖析一下,我們就可以看見(jiàn)這個(gè)json是以下這個(gè)結構:
{
"list": [
{
"app_msg_ext_info": {
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 76742
7&idx=1&sn=37da0d7208283bf90e9a4a536e0af0ea&chksm=8b882dbbbcffa4ad2f0b8a141cc988d16bac
e564274018e68e5c53ee6f354f8ad56c9b98bade&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz/Mof ... gLtcq
GziaFqwibzvtZAHCDkMeJU1fGZHpjoeibanPJ8rziaq68Akkg/0?wx_fmt=jpeg",
"digest": "擦亮雙眼,遠離謠言。",
"fileid": 505283695,
"is_multi": 1,
"multi_app_msg_item_list": [
{
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 65276
7427&idx=2&sn=449ef1a874a37fed2429e14f724b56ef&chksm=8 b882dbbbcffa4ade48a7932cda426368
7e34fca8ea3a5a6233d2589d448b9f6130d3890ce93&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz_png ... YHYrh
ibia89ZnksCsUiaia2TLI1fyqjclibGa1hw3icP6oXeSpaWMjiabaghHl7yw/0?wx_fmt=png",
"digest": "12月28日,廣州亞運城綜合體育館,內附購票入口~",
"fileid": 0,
"source_url": "http://wechat.show.wepiao.com/ ... b56b9 98e1f2b8?detailReferrer=1&from=groupmessage&isappinstalled=0",
"title": "2017微信公開(kāi)課Pro版即將召開(kāi)"
},
...//循環(huán)被省略
],
"source_url": "",
"subtype": 9,
"title": "謠言熱榜 | 十一月朋友圈十大謠言"
},
"comm_msg_info": {
"content": "",
"datetime": 1480933315,
"fakeid": "3093134871",
"id": 1000000010,
"status": 2,
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
}
簡(jiǎn)要的剖析一下這個(gè)json(這里只介紹一些重要的信息,其它的被省略):
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "??",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""??"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
在這里還要提及一點(diǎn)就是假如希望獲取到時(shí)間更久遠一些的歷史消息內容,就須要在手機或模擬器上將頁(yè)面向上拉,當拉到最里邊的時(shí)侯,微信將手動(dòng)讀取下一頁(yè)的內容。下一頁(yè)的鏈接地址和歷史消息頁(yè)的鏈接地址同樣是getmasssendmsg開(kāi)頭的地址。但是內容就是只有json了,沒(méi)有html了。直接解析json就可以了。
這時(shí)可以通過(guò)上一篇文章介紹的方式,使用anyproxy將msgList變量值正則匹配下來(lái)以后,異步遞交到服務(wù)器,再從服務(wù)器上使用php的json_decode解析json成為字段。然后遍歷循環(huán)鏈表。我們就可以得到每一篇文章的標題和鏈接地址。
如果只須要采集單一公眾號的內容,完全可以在每晚群發(fā)以后,通過(guò)anyproxy獲取到完整的帶有key和pass_ticket的鏈接地址。然后自己制做一個(gè)程序,手動(dòng)將地址遞交給自己的程序。使用諸如php這樣的語(yǔ)言來(lái)正則匹配到msgList,然后解析json。這樣就不用更改anyproxy的rule,也不需要制做一個(gè)采集隊列和跳轉頁(yè)面了。
利用搜狗陌陌自制一個(gè)簡(jiǎn)易微信公眾號爬蟲(chóng)接口
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2020-08-18 11:12
微信公眾號現已成為主流的一對多媒體行為活動(dòng),也是現今互聯(lián)網(wǎng)內容生產(chǎn)不可忽略的一股力量。
在此基礎上,微信公眾號爬蟲(chóng)顯得太有價(jià)值,對內容生產(chǎn)型公眾號進(jìn)行數據挖掘可以得到好多有意思、有價(jià)值的信息。就我所知,可用于微信公眾號爬蟲(chóng)的方法主要有以下幾種:web陌陌,手機客戶(hù)端抓包,搜狗陌陌入口,appium自動(dòng)化測試,Xposed框架等。
手機客戶(hù)端抓包,利用fiddler或charles等抓包工具,算是一個(gè)比較主流(我自己覺(jué)得的orz),效率較高的方式,可以快速的抓取微信公眾號信息和歷史消息,此方式也有隱憂(yōu):cookies失效快,半天差不多的時(shí)間吧,有針對性的去抓取某幾個(gè)公眾號的歷史消息也是可以的。要想通過(guò)模擬登錄陌陌手動(dòng)獲得cookies,好像很難的,小弟淺薄,無(wú)法實(shí)現,貌似陌陌登錄是tcp協(xié)議?
appium自動(dòng)化和Xposed框架我了解不多。appium類(lèi)似于selenium,在移動(dòng)端做自動(dòng)化測試的,模擬點(diǎn)擊即可。Xposed框架就有很多可以搞的了,Xposed可以在不更改apk的情況下做到一些額外的功能,爬蟲(chóng)自然是可以的,除此之外可做到以手動(dòng)搶紅包,自動(dòng)回復機器人,修改陌陌步數等等騷操作。
寫(xiě)爬蟲(chóng)也有一段時(shí)間了,個(gè)人覺(jué)得實(shí)現爬蟲(chóng)不僅反反爬,爬蟲(chóng)效率外,還有一個(gè)很難實(shí)現的地方就是爬蟲(chóng)的穩定性,健壯性,需要考慮到好多異常情況,以及合理有效的異常處理,在這一點(diǎn)上,我認為我還須要向各大爬蟲(chóng)大鱷學(xué)習。(感覺(jué)自己瞎扯了很多,還沒(méi)有開(kāi)始我的正文(orz),感覺(jué)嫌我啰嗦的大鱷請別生氣。)
利用搜狗陌陌寫(xiě)一個(gè)爬蟲(chóng)插口,代碼太狹小,只有兩百行不到的代碼。(這里我還得吐槽一下,python寫(xiě)多了,總有一種自己太叼,編程很簡(jiǎn)單的錯覺(jué),幾行代碼能夠實(shí)現很厲害的功能,這時(shí)候須要去寫(xiě)寫(xiě)CPP冷靜一下,讓自己曉得哪些是真正的編程。)
以下記錄下我寫(xiě)這個(gè)爬蟲(chóng)插口腳本的過(guò)程:
1. 頁(yè)面懇求剖析(以公眾號搜索為例):
可以看見(jiàn)第一個(gè)http請求包就是我們想要的結果,查看其query string,如下:
看起來(lái)很簡(jiǎn)單的不是,我們得到以下幾個(gè)信息:
2. 模擬頁(yè)面懇求:
我們直接用 url, 請求參數params, 還有谷歌瀏覽器的 user-agent 請求,發(fā)現可以成功的獲取到我們想要頁(yè)面的源碼,接下來(lái)我們獲取搜索結果下的第一個(gè)公眾號即可(這意味著(zhù)須要確切的給定公眾號名稱(chēng),太過(guò)模糊有可能獲取到與其類(lèi)似的公眾號結果)。
3. 分析頁(yè)面:
先確定爬取思路,第一步獲取微信公眾號鏈接,再通過(guò)該微信公眾號鏈接獲取其近來(lái)十條推送的相關(guān)信息,包括標題,日期,作者,內容摘要,內容鏈接(事實(shí)上,我們發(fā)覺(jué)有了陌陌推送鏈接以后才能太輕松的獲取其推送主體內容,但不包括點(diǎn)贊數和閱讀數,這幾個(gè)數據只能在陌陌手機端能夠查看,如果有機會(huì )的話(huà),下次記錄下自己手機陌陌抓包爬蟲(chóng)的過(guò)程)。
于是第一步我們獲取公眾號鏈接:
這里我們直接使用正則表達式提取即可(這么簡(jiǎn)單的就不用xpath,bs4了,依賴(lài)標準庫和第三方庫還是有所不同的。)
?。ū副凰《伦×薿rz,換一張。)
第二步按照微信公眾號鏈接獲取近來(lái)十條推送信息:
?。ㄎ抑粚?xiě)了一篇orz,以后多加油。)
ctlr U 查看網(wǎng)頁(yè)源碼,發(fā)現原創(chuàng )信息都置于一個(gè)js變量上面。
好辦,繼續正則提取,將json格式的字符串轉換成python上面的字典,有兩種辦法,第一種是用 json.loads 方法, 第二種是用外置的 eval方式,這兩種方式有些區別,比如說(shuō)單冒號和雙冒號, json格式中使用的是雙引號, python字典通常是單冒號。
OK,獲得原創(chuàng )推送信息數據了,但這上面有很多我們用不到的信息,將其剔除一下,值得一提的是,datetime的值是一個(gè)timestamp,我們須要將其轉化為直觀(guān)的時(shí)間抒發(fā)。
到此,關(guān)于微信公眾號的爬蟲(chóng)差不都就解決了,接下來(lái)須要將其封裝為類(lèi)。主要部份代碼如下。
另外,關(guān)于關(guān)鍵詞搜索文章的爬蟲(chóng)插口我也一并寫(xiě)了,AccountAPI,ArticleAPI,其父類(lèi)是一AP類(lèi),API類(lèi)有query_url, params, headers, _get_response, _get_datetime等變量和技巧,供于A(yíng)ccountAPI,ArticleAPI共用。
代碼放到 查看全部
利用搜狗陌陌自制一個(gè)簡(jiǎn)易微信公眾號爬蟲(chóng)插口
微信公眾號現已成為主流的一對多媒體行為活動(dòng),也是現今互聯(lián)網(wǎng)內容生產(chǎn)不可忽略的一股力量。
在此基礎上,微信公眾號爬蟲(chóng)顯得太有價(jià)值,對內容生產(chǎn)型公眾號進(jìn)行數據挖掘可以得到好多有意思、有價(jià)值的信息。就我所知,可用于微信公眾號爬蟲(chóng)的方法主要有以下幾種:web陌陌,手機客戶(hù)端抓包,搜狗陌陌入口,appium自動(dòng)化測試,Xposed框架等。
手機客戶(hù)端抓包,利用fiddler或charles等抓包工具,算是一個(gè)比較主流(我自己覺(jué)得的orz),效率較高的方式,可以快速的抓取微信公眾號信息和歷史消息,此方式也有隱憂(yōu):cookies失效快,半天差不多的時(shí)間吧,有針對性的去抓取某幾個(gè)公眾號的歷史消息也是可以的。要想通過(guò)模擬登錄陌陌手動(dòng)獲得cookies,好像很難的,小弟淺薄,無(wú)法實(shí)現,貌似陌陌登錄是tcp協(xié)議?
appium自動(dòng)化和Xposed框架我了解不多。appium類(lèi)似于selenium,在移動(dòng)端做自動(dòng)化測試的,模擬點(diǎn)擊即可。Xposed框架就有很多可以搞的了,Xposed可以在不更改apk的情況下做到一些額外的功能,爬蟲(chóng)自然是可以的,除此之外可做到以手動(dòng)搶紅包,自動(dòng)回復機器人,修改陌陌步數等等騷操作。
寫(xiě)爬蟲(chóng)也有一段時(shí)間了,個(gè)人覺(jué)得實(shí)現爬蟲(chóng)不僅反反爬,爬蟲(chóng)效率外,還有一個(gè)很難實(shí)現的地方就是爬蟲(chóng)的穩定性,健壯性,需要考慮到好多異常情況,以及合理有效的異常處理,在這一點(diǎn)上,我認為我還須要向各大爬蟲(chóng)大鱷學(xué)習。(感覺(jué)自己瞎扯了很多,還沒(méi)有開(kāi)始我的正文(orz),感覺(jué)嫌我啰嗦的大鱷請別生氣。)
利用搜狗陌陌寫(xiě)一個(gè)爬蟲(chóng)插口,代碼太狹小,只有兩百行不到的代碼。(這里我還得吐槽一下,python寫(xiě)多了,總有一種自己太叼,編程很簡(jiǎn)單的錯覺(jué),幾行代碼能夠實(shí)現很厲害的功能,這時(shí)候須要去寫(xiě)寫(xiě)CPP冷靜一下,讓自己曉得哪些是真正的編程。)
以下記錄下我寫(xiě)這個(gè)爬蟲(chóng)插口腳本的過(guò)程:
1. 頁(yè)面懇求剖析(以公眾號搜索為例):
可以看見(jiàn)第一個(gè)http請求包就是我們想要的結果,查看其query string,如下:
看起來(lái)很簡(jiǎn)單的不是,我們得到以下幾個(gè)信息:
2. 模擬頁(yè)面懇求:
我們直接用 url, 請求參數params, 還有谷歌瀏覽器的 user-agent 請求,發(fā)現可以成功的獲取到我們想要頁(yè)面的源碼,接下來(lái)我們獲取搜索結果下的第一個(gè)公眾號即可(這意味著(zhù)須要確切的給定公眾號名稱(chēng),太過(guò)模糊有可能獲取到與其類(lèi)似的公眾號結果)。
3. 分析頁(yè)面:
先確定爬取思路,第一步獲取微信公眾號鏈接,再通過(guò)該微信公眾號鏈接獲取其近來(lái)十條推送的相關(guān)信息,包括標題,日期,作者,內容摘要,內容鏈接(事實(shí)上,我們發(fā)覺(jué)有了陌陌推送鏈接以后才能太輕松的獲取其推送主體內容,但不包括點(diǎn)贊數和閱讀數,這幾個(gè)數據只能在陌陌手機端能夠查看,如果有機會(huì )的話(huà),下次記錄下自己手機陌陌抓包爬蟲(chóng)的過(guò)程)。
于是第一步我們獲取公眾號鏈接:
這里我們直接使用正則表達式提取即可(這么簡(jiǎn)單的就不用xpath,bs4了,依賴(lài)標準庫和第三方庫還是有所不同的。)
?。ū副凰《伦×薿rz,換一張。)
第二步按照微信公眾號鏈接獲取近來(lái)十條推送信息:
?。ㄎ抑粚?xiě)了一篇orz,以后多加油。)
ctlr U 查看網(wǎng)頁(yè)源碼,發(fā)現原創(chuàng )信息都置于一個(gè)js變量上面。
好辦,繼續正則提取,將json格式的字符串轉換成python上面的字典,有兩種辦法,第一種是用 json.loads 方法, 第二種是用外置的 eval方式,這兩種方式有些區別,比如說(shuō)單冒號和雙冒號, json格式中使用的是雙引號, python字典通常是單冒號。
OK,獲得原創(chuàng )推送信息數據了,但這上面有很多我們用不到的信息,將其剔除一下,值得一提的是,datetime的值是一個(gè)timestamp,我們須要將其轉化為直觀(guān)的時(shí)間抒發(fā)。
到此,關(guān)于微信公眾號的爬蟲(chóng)差不都就解決了,接下來(lái)須要將其封裝為類(lèi)。主要部份代碼如下。
另外,關(guān)于關(guān)鍵詞搜索文章的爬蟲(chóng)插口我也一并寫(xiě)了,AccountAPI,ArticleAPI,其父類(lèi)是一AP類(lèi),API類(lèi)有query_url, params, headers, _get_response, _get_datetime等變量和技巧,供于A(yíng)ccountAPI,ArticleAPI共用。
代碼放到
微信熱門(mén)文章采集方法以及詳盡步驟.docx
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 397 次瀏覽 ? 2020-08-18 10:43
文檔介紹:
微信熱門(mén)文章采集方法以及詳盡步驟
本文將以搜狗陌陌文章為例,介紹使用優(yōu)采云采集網(wǎng)頁(yè)文章正文的技巧。文章正文里通常包括文本和圖片兩種。本文將采集文章正文中的文本+圖片URL。
將采集以下數組:文章標題、時(shí)間、來(lái)源和正文(正文中的所有文本,將合并到一個(gè)excel單元格中,將使用到“自定義數據合并方法”功能,請你們注意)。同時(shí),采集文章正文中的文本+圖片URL,將用到“判斷條件”,“判斷條件”的使用,有很多須要注意的地方。以下兩個(gè)教程,大家可先熟悉一下。
“自定義數據合并方法”詳解教程:
orialdetail-1/zdyhb_7.html
“判斷條件”詳解教程:
orialdetail-1/judge.html
采集網(wǎng)站:
使用功能點(diǎn):
分頁(yè)列表信息采集
orial/fylb-70.aspx?t=1
Xpath
rch?query=XPath
AJAX點(diǎn)擊和翻頁(yè)
orial/ajaxdjfy_7.aspx?t=1
判斷條件
orialdetail-1/judge.html
AJAX滾動(dòng)
orialdetail-1/ajgd_7.html
步驟1:創(chuàng )建采集任務(wù)
1)進(jìn)入主界面,選擇“自定義模式”
微信熱門(mén)文章采集方法步驟1
2)將要采集的網(wǎng)址URL復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址”
微信熱門(mén)文章采集方法步驟2
步驟2:創(chuàng )建翻頁(yè)循環(huán)
在頁(yè)面右上角,打開(kāi)“流程”,以詮釋出“流程設計器”和“定制當前操作”兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載更多內容”按鈕,在操作提示框中,選擇“更多操作”
微信熱門(mén)文章采集方法步驟3
選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán)
微信熱門(mén)文章采集方法步驟4
由于此網(wǎng)頁(yè)涉及Ajax技術(shù),我們須要進(jìn)行一些中級選項的設置。選中“點(diǎn)擊元素”步驟,打開(kāi)“高級選項”,勾選“Ajax加載數據”,設置時(shí)間為“2秒”
微信熱門(mén)文章采集方法步驟5
注:AJAX即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺與服務(wù)器進(jìn)行少量數據交換,可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份進(jìn)行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址不會(huì )改變;b、網(wǎng)頁(yè)不是完全加載,只是局部進(jìn)行了數據加載,有所變化。 查看全部
微信熱門(mén)文章采集方法以及詳盡步驟.docx
文檔介紹:
微信熱門(mén)文章采集方法以及詳盡步驟
本文將以搜狗陌陌文章為例,介紹使用優(yōu)采云采集網(wǎng)頁(yè)文章正文的技巧。文章正文里通常包括文本和圖片兩種。本文將采集文章正文中的文本+圖片URL。
將采集以下數組:文章標題、時(shí)間、來(lái)源和正文(正文中的所有文本,將合并到一個(gè)excel單元格中,將使用到“自定義數據合并方法”功能,請你們注意)。同時(shí),采集文章正文中的文本+圖片URL,將用到“判斷條件”,“判斷條件”的使用,有很多須要注意的地方。以下兩個(gè)教程,大家可先熟悉一下。
“自定義數據合并方法”詳解教程:
orialdetail-1/zdyhb_7.html
“判斷條件”詳解教程:
orialdetail-1/judge.html
采集網(wǎng)站:
使用功能點(diǎn):
分頁(yè)列表信息采集
orial/fylb-70.aspx?t=1
Xpath
rch?query=XPath
AJAX點(diǎn)擊和翻頁(yè)
orial/ajaxdjfy_7.aspx?t=1
判斷條件
orialdetail-1/judge.html
AJAX滾動(dòng)
orialdetail-1/ajgd_7.html
步驟1:創(chuàng )建采集任務(wù)
1)進(jìn)入主界面,選擇“自定義模式”
微信熱門(mén)文章采集方法步驟1
2)將要采集的網(wǎng)址URL復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址”
微信熱門(mén)文章采集方法步驟2
步驟2:創(chuàng )建翻頁(yè)循環(huán)
在頁(yè)面右上角,打開(kāi)“流程”,以詮釋出“流程設計器”和“定制當前操作”兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載更多內容”按鈕,在操作提示框中,選擇“更多操作”
微信熱門(mén)文章采集方法步驟3
選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán)
微信熱門(mén)文章采集方法步驟4
由于此網(wǎng)頁(yè)涉及Ajax技術(shù),我們須要進(jìn)行一些中級選項的設置。選中“點(diǎn)擊元素”步驟,打開(kāi)“高級選項”,勾選“Ajax加載數據”,設置時(shí)間為“2秒”
微信熱門(mén)文章采集方法步驟5
注:AJAX即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺與服務(wù)器進(jìn)行少量數據交換,可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份進(jìn)行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址不會(huì )改變;b、網(wǎng)頁(yè)不是完全加載,只是局部進(jìn)行了數據加載,有所變化。
微信公眾號之獲取openId
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2020-08-18 03:00
在小伙伴們開(kāi)發(fā)微信公眾號、小程序或則是在陌陌外置瀏覽器打開(kāi)的項目時(shí),會(huì )碰到的第一個(gè)問(wèn)題就是怎么獲取openId,今天小編就給你們帶來(lái)的是怎樣獲取openId。
首先 我們要從陌陌開(kāi)發(fā)者后臺得到appid,這個(gè)appid是管理員在設置陌陌后臺時(shí)獲取的,而且是惟一的,而且還須要在陌陌后臺設置反彈域名。
其次這種都打算好之后,我們就可以使用陌陌自帶的方式獲取openId:
注意:劃線(xiàn)部份是要獲取的openId和反彈域名,而location.href=url 是當頁(yè)面第一次渲染時(shí),自動(dòng)獲取openId,當然,這些還是打算工作
1 //截取URL字段
2 GetQueryString: function(name) {
3 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
4 var r = window.location.search.substr(1).match(reg);
5 if (r != null) {
6 return unescape(r[2]);
7 }
8 return null;
9 },
10 getToken: function() {
11 //判斷是否有openid
12 if (this.$cookieStore.getCookie("openid") == null) {
13 var url =
14 "https://open.weixin.qq.com/con ... ot%3B +
15 encodeURIComponent(
16 "https://www.baidu.com/"
17 ) +
18 "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect&connect_redirect=1#wechat_redirect";
19 location.href = url;
20 var code = this.GetQueryString("code");
21 // console.log(code);
22 axios({
23 url: "接口名" + code
24 }).then(res => {
25 // console.log(res);
26 if (res.data.code == 0) {
27 this.$cookieStore.setCookie("openid", res.data.result);
28 }
29 });
30 } else {
31 this.openid = this.$cookieStore.getCookie("openid");
32 }
33 },
我們要使用上圖的方式來(lái)獲取code值,通過(guò)插口,來(lái)獲取openId,然后把openId存在cookie里每次調用就可以了。
這就是小編給你們帶來(lái)的獲取openId的方式,下面是完整代碼。 查看全部
微信公眾號之獲取openId
在小伙伴們開(kāi)發(fā)微信公眾號、小程序或則是在陌陌外置瀏覽器打開(kāi)的項目時(shí),會(huì )碰到的第一個(gè)問(wèn)題就是怎么獲取openId,今天小編就給你們帶來(lái)的是怎樣獲取openId。
首先 我們要從陌陌開(kāi)發(fā)者后臺得到appid,這個(gè)appid是管理員在設置陌陌后臺時(shí)獲取的,而且是惟一的,而且還須要在陌陌后臺設置反彈域名。
其次這種都打算好之后,我們就可以使用陌陌自帶的方式獲取openId:

注意:劃線(xiàn)部份是要獲取的openId和反彈域名,而location.href=url 是當頁(yè)面第一次渲染時(shí),自動(dòng)獲取openId,當然,這些還是打算工作

1 //截取URL字段
2 GetQueryString: function(name) {
3 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
4 var r = window.location.search.substr(1).match(reg);
5 if (r != null) {
6 return unescape(r[2]);
7 }
8 return null;
9 },
10 getToken: function() {
11 //判斷是否有openid
12 if (this.$cookieStore.getCookie("openid") == null) {
13 var url =
14 "https://open.weixin.qq.com/con ... ot%3B +
15 encodeURIComponent(
16 "https://www.baidu.com/"
17 ) +
18 "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect&connect_redirect=1#wechat_redirect";
19 location.href = url;
20 var code = this.GetQueryString("code");
21 // console.log(code);
22 axios({
23 url: "接口名" + code
24 }).then(res => {
25 // console.log(res);
26 if (res.data.code == 0) {
27 this.$cookieStore.setCookie("openid", res.data.result);
28 }
29 });
30 } else {
31 this.openid = this.$cookieStore.getCookie("openid");
32 }
33 },
我們要使用上圖的方式來(lái)獲取code值,通過(guò)插口,來(lái)獲取openId,然后把openId存在cookie里每次調用就可以了。
這就是小編給你們帶來(lái)的獲取openId的方式,下面是完整代碼。
R語(yǔ)言爬蟲(chóng)系列6|動(dòng)態(tài)數據抓取范例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 172 次瀏覽 ? 2020-08-15 12:32
作者:魯偉,熱愛(ài)數據,堅信數據技術(shù)和代碼改變世界。R語(yǔ)言和Python的忠實(shí)擁躉,為成為一名未來(lái)的數據科學(xué)家而拼搏終身。個(gè)人公眾號:數據科學(xué)家養成記 (微信ID:louwill12)
第一篇戳:
第二篇戳:
第三篇戳:
第四篇戳:
第五篇戳:
通過(guò)上面幾期的推送,小編基本上早已將R語(yǔ)言爬蟲(chóng)所須要的基本知識介紹完了。R其實(shí)是以一門(mén)統計剖析工具出現在大多數人印象中的,但其雖然本質(zhì)上是一門(mén)編程語(yǔ)言,對于爬蟲(chóng)的支持雖不如Python那樣多快好省,但細心研究一下總能作出一些使你驚喜的療效。
大約很早之前,小編就寫(xiě)過(guò)關(guān)于R語(yǔ)言爬蟲(chóng)新貴rvest的抓取介紹,之前說(shuō)rvest+SelectGadgetor是結構化網(wǎng)頁(yè)抓取的實(shí)戰神器,大家的溢美之詞不斷。詳情可見(jiàn)推文:
R語(yǔ)言爬蟲(chóng)神器:rvest包+SelectorGadget抓取鏈家上海二手房數據
但網(wǎng)路爬蟲(chóng)這個(gè)江湖很險惡,單靠一招rvest行走江湖必然兇多吉少,一不小心遇到哪些AJAX和動(dòng)態(tài)網(wǎng)頁(yè)憑僅把握rvest的諸位必將束手無(wú)策。本文小編就簡(jiǎn)單介紹下在用R語(yǔ)言進(jìn)行實(shí)際的網(wǎng)路數據抓取時(shí)怎樣將動(dòng)態(tài)數據給弄到手。
所謂動(dòng)態(tài)網(wǎng)頁(yè)和異步加載,在之前的系列4的時(shí)侯小編已通過(guò)AJAX介紹過(guò)了,簡(jiǎn)單而言就是我明明在網(wǎng)頁(yè)中聽(tīng)到了這個(gè)數據,但到后臺HTML中卻找不到了,這一般就是XHR在作怪。這時(shí)候我們就不要看原創(chuàng )的HTML數據了,需要進(jìn)行二次懇求,通過(guò)web開(kāi)發(fā)者工具找到真實(shí)懇求的url。下面小編就以?xún)蓚€(gè)網(wǎng)頁(yè)為例,分別通過(guò)GET和POST懇求領(lǐng)到動(dòng)態(tài)網(wǎng)頁(yè)數據,全過(guò)程主要使用httr包來(lái)實(shí)現,httr包堪稱(chēng)是RCurl包的精簡(jiǎn)版,說(shuō)其短小精悍也不為過(guò)。httr包與RCurl包在主要函數的區別如下所示:
GET懇求抓取陌陌好友列表數據
很早之前圈子里就聽(tīng)到過(guò)用Python抓取自己陌陌好友數據的案例分享,今天便以陌陌網(wǎng)頁(yè)版為例,探一探其網(wǎng)頁(yè)結構。首先登陸個(gè)人陌陌網(wǎng)頁(yè)版,右鍵打開(kāi)web開(kāi)發(fā)者工具,下來(lái)一大堆懇求:
簡(jiǎn)單找一下發(fā)覺(jué)網(wǎng)頁(yè)中的陌陌好友列表信息并沒(méi)有呈現在HTML 中,大概可以推斷陌陌好友數據是通過(guò)動(dòng)態(tài)加載來(lái)顯示的,所以直接定位到XHR中,經(jīng)過(guò)幾番嘗試,結合兩側的preview,我們會(huì )發(fā)覺(jué)大量整齊劃一的數據,所以二次懇求的url真的就是它了:
找到真正的url以后,接下來(lái)就是獲取懇求信息了,切換到Headers版塊,Header版塊下的4個(gè)子信息我們都須要關(guān)注,它們是我們構造爬蟲(chóng)懇求頭的關(guān)鍵。
從Header中我們可以看見(jiàn)該信息是通過(guò)GET方式懇求得到的,General信息下的Request URL,Request Method, Status Code; Response Headers信息下的Connection, Content-Type; Request Headers信息下的Accept, Cookie, Referer, User-Agent以及最后的Query String Parameters都是我們須要重點(diǎn)關(guān)注的。
找到相應的信息然后,我們便可以直接借助httr包在R中建立爬蟲(chóng)懇求:
<p>#傳入微信cookie信息<br />Cookie Accept: application/json<br />-> Content-Type: text/plain<br />-> User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0<br />-> Referer: https://wx.qq.com/<br />-> Connection: keep-alive<br />-> cookie: 我的微信cookie<br />-> <br /> Connection: keep-alive<br />-> cookie: 網(wǎng)易云課堂cookie<br />-> Content-Length: 69<br />-> <br />>> {"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":-1}<br /><br /> 查看全部
作者:魯偉,熱愛(ài)數據,堅信數據技術(shù)和代碼改變世界。R語(yǔ)言和Python的忠實(shí)擁躉,為成為一名未來(lái)的數據科學(xué)家而拼搏終身。個(gè)人公眾號:數據科學(xué)家養成記 (微信ID:louwill12)
第一篇戳:
第二篇戳:
第三篇戳:
第四篇戳:
第五篇戳:
通過(guò)上面幾期的推送,小編基本上早已將R語(yǔ)言爬蟲(chóng)所須要的基本知識介紹完了。R其實(shí)是以一門(mén)統計剖析工具出現在大多數人印象中的,但其雖然本質(zhì)上是一門(mén)編程語(yǔ)言,對于爬蟲(chóng)的支持雖不如Python那樣多快好省,但細心研究一下總能作出一些使你驚喜的療效。
大約很早之前,小編就寫(xiě)過(guò)關(guān)于R語(yǔ)言爬蟲(chóng)新貴rvest的抓取介紹,之前說(shuō)rvest+SelectGadgetor是結構化網(wǎng)頁(yè)抓取的實(shí)戰神器,大家的溢美之詞不斷。詳情可見(jiàn)推文:
R語(yǔ)言爬蟲(chóng)神器:rvest包+SelectorGadget抓取鏈家上海二手房數據
但網(wǎng)路爬蟲(chóng)這個(gè)江湖很險惡,單靠一招rvest行走江湖必然兇多吉少,一不小心遇到哪些AJAX和動(dòng)態(tài)網(wǎng)頁(yè)憑僅把握rvest的諸位必將束手無(wú)策。本文小編就簡(jiǎn)單介紹下在用R語(yǔ)言進(jìn)行實(shí)際的網(wǎng)路數據抓取時(shí)怎樣將動(dòng)態(tài)數據給弄到手。
所謂動(dòng)態(tài)網(wǎng)頁(yè)和異步加載,在之前的系列4的時(shí)侯小編已通過(guò)AJAX介紹過(guò)了,簡(jiǎn)單而言就是我明明在網(wǎng)頁(yè)中聽(tīng)到了這個(gè)數據,但到后臺HTML中卻找不到了,這一般就是XHR在作怪。這時(shí)候我們就不要看原創(chuàng )的HTML數據了,需要進(jìn)行二次懇求,通過(guò)web開(kāi)發(fā)者工具找到真實(shí)懇求的url。下面小編就以?xún)蓚€(gè)網(wǎng)頁(yè)為例,分別通過(guò)GET和POST懇求領(lǐng)到動(dòng)態(tài)網(wǎng)頁(yè)數據,全過(guò)程主要使用httr包來(lái)實(shí)現,httr包堪稱(chēng)是RCurl包的精簡(jiǎn)版,說(shuō)其短小精悍也不為過(guò)。httr包與RCurl包在主要函數的區別如下所示:
GET懇求抓取陌陌好友列表數據
很早之前圈子里就聽(tīng)到過(guò)用Python抓取自己陌陌好友數據的案例分享,今天便以陌陌網(wǎng)頁(yè)版為例,探一探其網(wǎng)頁(yè)結構。首先登陸個(gè)人陌陌網(wǎng)頁(yè)版,右鍵打開(kāi)web開(kāi)發(fā)者工具,下來(lái)一大堆懇求:
簡(jiǎn)單找一下發(fā)覺(jué)網(wǎng)頁(yè)中的陌陌好友列表信息并沒(méi)有呈現在HTML 中,大概可以推斷陌陌好友數據是通過(guò)動(dòng)態(tài)加載來(lái)顯示的,所以直接定位到XHR中,經(jīng)過(guò)幾番嘗試,結合兩側的preview,我們會(huì )發(fā)覺(jué)大量整齊劃一的數據,所以二次懇求的url真的就是它了:
找到真正的url以后,接下來(lái)就是獲取懇求信息了,切換到Headers版塊,Header版塊下的4個(gè)子信息我們都須要關(guān)注,它們是我們構造爬蟲(chóng)懇求頭的關(guān)鍵。
從Header中我們可以看見(jiàn)該信息是通過(guò)GET方式懇求得到的,General信息下的Request URL,Request Method, Status Code; Response Headers信息下的Connection, Content-Type; Request Headers信息下的Accept, Cookie, Referer, User-Agent以及最后的Query String Parameters都是我們須要重點(diǎn)關(guān)注的。
找到相應的信息然后,我們便可以直接借助httr包在R中建立爬蟲(chóng)懇求:
<p>#傳入微信cookie信息<br />Cookie Accept: application/json<br />-> Content-Type: text/plain<br />-> User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0<br />-> Referer: https://wx.qq.com/<br />-> Connection: keep-alive<br />-> cookie: 我的微信cookie<br />-> <br /> Connection: keep-alive<br />-> cookie: 網(wǎng)易云課堂cookie<br />-> Content-Length: 69<br />-> <br />>> {"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":-1}<br /><br />
微信公眾號 文章的爬蟲(chóng)系統
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 242 次瀏覽 ? 2020-08-13 19:03
1、做了倆次爬蟲(chóng)了,第一次怕的鳳凰網(wǎng),那個(gè)沒(méi)有限制,隨便爬,所以也就對自動(dòng)化執行代碼模塊放松了提防,覺(jué)得很簡(jiǎn)單的,但是畢竟不是這樣的,我被這個(gè)問(wèn)題困惑了好幾天,差不多4天的一個(gè)樣子,因為搜狗做的限制,同一個(gè)ip獲取的次數多了,首先是出現驗證碼,其次是就是訪(fǎng)問(wèn)限制了,直接就是不能訪(fǎng)問(wèn),利用 request得到的就是訪(fǎng)問(wèn)次數過(guò)分頻繁,這樣子的提示,所以說(shuō)開(kāi)發(fā)過(guò)程中最頭痛的不是代碼的編撰,而是測試,寫(xiě)完代碼不能立刻測試,這種覺(jué)得相信大多數的程序員是不能喜歡的,我如今寫(xiě)的程序是每晚執行三次,這樣的一個(gè)頻度挺好,而且由于是多公眾號采集嘛,每個(gè)公眾號之間的間隔時(shí)間也的有,要不然同時(shí)訪(fǎng)問(wèn)十幾個(gè)公眾號的上百篇文章也是不現實(shí)的,說(shuō)到這兒插一句,怎么使每位公眾號怕去玩過(guò)后,等一段具體的時(shí)間,在執行下一個(gè),最后用的setInterval函數解決的,
每過(guò)80秒執行一個(gè)公眾號,把每次的執行代碼講到hello中,泡的有點(diǎn)遠了,收一收哈,說(shuō)說(shuō)cron這個(gè)包,自動(dòng)化執行,npm官網(wǎng)上只給了一個(gè)反例,但是我這個(gè)指桑拿可能是有點(diǎn)壓制的厲害,不能否玩卻理解他的用法,然后我說(shuō)理解不了怎樣辦啊,上網(wǎng)搜唄,百度,cron包的具體用法,一看,嚯,還很多,于是就看啊看啊,但是仔細以剖析就不是這么回事兒了,都是屁話(huà),沒(méi)哪些用,網(wǎng)上通常的用法中都帶有一個(gè)問(wèn)號,但是我加上問(wèn)號的時(shí)侯,就報錯了,所以說(shuō)都是胡扯,最后在朋友組的一個(gè)后端技術(shù)討論群中說(shuō)了一聲,還真有熱心的群友,給我找了一個(gè)鏈接,我進(jìn)去一看,試了一下,還行,所以呢,非常謝謝這個(gè)幫助我解惑的朋友,再次我把qq群號,和鏈接附上,方便正在看這篇文章的你學(xué)習,QQ群號:435012561,鏈接:,這個(gè)鏈接上面說(shuō)的挺好,至少能用,這里我挺好到一個(gè)問(wèn)題,就是timezone,我們之前用過(guò)一次,用的是紐約時(shí)間,但是此次顯著(zhù)不行啊,要用俺們中國的時(shí)間啊,但是我試了幾次上海的不行,重慶的可以,所以我就用了上海的。
2、這里要說(shuō)的是,從地址欄獲取參數的問(wèn)題,我上一個(gè)做的沒(méi)問(wèn)題,但是這個(gè)不知道如何就不行了,上一個(gè)從地址欄得到的是數字,但是這個(gè)得到的是字符串,再加上mongodb中的對數組的要求還是很?chē)栏竦?,所以一個(gè)分頁(yè)功能也困惑了我幾個(gè)小時(shí)吧,最后是如何解決的呢,是通過(guò)我加的一個(gè)mongodb的討論群,在里面問(wèn)了一句這是如何了,發(fā)了個(gè)截圖,里面就有一個(gè)熱心的網(wǎng)友說(shuō)你這顯著(zhù)是傳入的數據格式不對啊,一語(yǔ)驚醒夢(mèng)中人,我說(shuō)是啊,然后就把得到的參數,我用Number()函數處理了一下,讓string類(lèi)型的數字,變成了number類(lèi)型的數字,就好了,所以說(shuō)你們在用mongodb的時(shí)侯一定要注意儲存數據的格式,
3、mongodb查詢(xún)數據句子組織形式:
其實(shí)說(shuō)白了就是limit和skip倆個(gè)函數的使用,但是具體的格式可的看好了,還有我這個(gè)是接受的參數,不過(guò)mongo的參數接受也好弄直接寫(xiě)就好了,不用象sql那樣搞哪些${""}這種類(lèi)型的,后面的sort函數說(shuō)明了排序的方法,這里是設置的以ctime數組為標準,-1表示逆序,1表示亂序,
4、在本次代碼編撰中,我首次使用了try catch 這個(gè)補錯的形式,事實(shí)證明,還行,可以把時(shí)常的錯誤正常的復印下來(lái),但是不影響代碼的整體執行,或者是說(shuō)下一次執行,整體覺(jué)得非常好,
具體的使用方式,在try中倒入你要執行的代碼,在最后加上一行,throw Error();
然后給catch傳入一個(gè)參數e,在catch中可以復印好多個(gè)信息,我只復印了其中的一個(gè),e.message,
5、這次編碼過(guò)程中主要用到了anync包,其中的ansyc.each循環(huán),ansyc.waterfall執行完前面的才可以執行下邊的,而且說(shuō)謊給你下之間還可以從上至下傳遞參數,這個(gè)很重要,因為在本次編程中,每次獲取的內容不同,每次代碼執行的條件不同,即須要的參數也不同,即有可能下一次代碼的執行就須要用到上一次代碼執行得到的結果,所以說(shuō)這個(gè)anync包,真的是值得研究,他的每位方式都不同,有時(shí)候可以得到意想不到的療效。
6、在mysql中若果想要達到這樣一個(gè)療效,就是說(shuō),如果數據庫中早已存在了,那就不予理會(huì ),或者說(shuō)不重復儲存,如果數據庫中不存在,那么就儲存進(jìn)來(lái),很簡(jiǎn)單,直接把插入數據的insert 換成 replace 。但是在mongodb中,應該是沒(méi)有,或者說(shuō)是我還沒(méi)有發(fā)覺(jué),我是那么解決的,定義了一個(gè)開(kāi)關(guān),令這個(gè)開(kāi)關(guān)為真,每次儲存之前,先把所有的數據循環(huán)一遍,看看有沒(méi)有這條數據,如果有,讓開(kāi)關(guān)變?yōu)榧?,如果沒(méi)有,繼續執行,即判定此時(shí)開(kāi)關(guān)的真偽,如果是真的,那就執行插入操作,如果是假的,就不予理會(huì ),這就達到了類(lèi)似的療效,否則每次就會(huì )儲存大量的重復數據,
7、本次采集的核心,就是我文件中的common.js了,首先由于要采集,所以須要用到request包,采集到以后,要處理html格式的數據,使之可以使用類(lèi)jquery的操作,那么久用到了cheerio這個(gè)包,然后在循環(huán)采集的時(shí)侯,會(huì )用到anync.each這個(gè)方式,所以會(huì )用到async這個(gè)包,
7-1、
通過(guò)搜狗陌陌采集,就要剖析搜狗陌陌的路徑,每個(gè)公眾號的頁(yè)面的路徑是這樣的
%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=
這個(gè)是“這才是臺灣”的頁(yè)面的鏈接,經(jīng)過(guò)剖析,所有的公眾號的鏈接只有query前面的參數不同,但是query前面的參數是哪些呢,其實(shí)就是通過(guò)encodeURIComponent()這個(gè)函數轉化以后的“這才是臺灣”,所以說(shuō)都一樣,獲取那種公眾號,就將那種公眾號的名子編碼以后,動(dòng)態(tài)的組合成一個(gè)鏈接,訪(fǎng)問(wèn)就可以步入到每位鏈接上面了,但是這個(gè)鏈接只是懇求到了這個(gè)頁(yè)面,
并不是
這個(gè)頁(yè)面,所以還的進(jìn)一步處理,就是得到當前頁(yè)面的第一個(gè)內容的鏈接,即href
當得到了這個(gè)鏈接,就會(huì )發(fā)覺(jué)他有他的加密方法,其實(shí)很簡(jiǎn)單的,就是在鏈接上面的加了三個(gè)amp;把鏈接上面的這三個(gè)amp;替換為空,就好了,這也就是第一步,得到每一個(gè)公眾號的頁(yè)面鏈接,
7-2
得到鏈接以后,就要進(jìn)行訪(fǎng)問(wèn)了,即懇求,請求每位地址,得到每位地址的內容,但是每位頁(yè)面顯示的內容都不在頁(yè)面中,即html結構中,在js中藏著(zhù),所以要通過(guò)正則匹配,得到整篇文章的對象,然后就循環(huán)每位公眾號的這個(gè)對象,得到這個(gè)對象中的整篇文章的一些信息,包括title,thumb,abstract,URL,time,五個(gè)數組,但是我使用的代碼爛透了,盡然當時(shí)使用了
對象.屬性.foreach(function(item,index){
})
這種爛透了的形式,弄的最后好的在寫(xiě)一次循環(huán)才可以完全的得到每一個(gè)對象,否則只可以得到第一個(gè),在這里應當用async.each,或者async.foreach這倆中形式每種都可以啊,而且都是非常好用的形式。這樣的話(huà)買(mǎi)就得到了整篇文章的以上基本消息,
7-3、
第三個(gè)階段,就是步入到整篇文章的詳情頁(yè),獲得整篇文章的內容,點(diǎn)贊數,作者,公眾號,閱讀量等數據,在這里遇到的主要問(wèn)題是,人家的content直接在在js中,所有的img標簽都有問(wèn)題,他是以這些方式存在雨content中,但是這樣的話(huà),這樣的圖片在我們的網(wǎng)頁(yè)中不能被顯示,因為標簽存在問(wèn)題啊,html文檔不認識這樣的img標簽啊,所以這兒要進(jìn)行一些處理,把所有的用replace替換為
查看全部
差不多倆個(gè)禮拜了吧,一直在調試關(guān)于微信公眾號的文章爬蟲(chóng)系統,終于一切都好了,但是在這期間遇到了好多問(wèn)題,今天就來(lái)回顧一下,總結一下,希望有用到的小伙伴可以學(xué)習學(xué)習。
1、做了倆次爬蟲(chóng)了,第一次怕的鳳凰網(wǎng),那個(gè)沒(méi)有限制,隨便爬,所以也就對自動(dòng)化執行代碼模塊放松了提防,覺(jué)得很簡(jiǎn)單的,但是畢竟不是這樣的,我被這個(gè)問(wèn)題困惑了好幾天,差不多4天的一個(gè)樣子,因為搜狗做的限制,同一個(gè)ip獲取的次數多了,首先是出現驗證碼,其次是就是訪(fǎng)問(wèn)限制了,直接就是不能訪(fǎng)問(wèn),利用 request得到的就是訪(fǎng)問(wèn)次數過(guò)分頻繁,這樣子的提示,所以說(shuō)開(kāi)發(fā)過(guò)程中最頭痛的不是代碼的編撰,而是測試,寫(xiě)完代碼不能立刻測試,這種覺(jué)得相信大多數的程序員是不能喜歡的,我如今寫(xiě)的程序是每晚執行三次,這樣的一個(gè)頻度挺好,而且由于是多公眾號采集嘛,每個(gè)公眾號之間的間隔時(shí)間也的有,要不然同時(shí)訪(fǎng)問(wèn)十幾個(gè)公眾號的上百篇文章也是不現實(shí)的,說(shuō)到這兒插一句,怎么使每位公眾號怕去玩過(guò)后,等一段具體的時(shí)間,在執行下一個(gè),最后用的setInterval函數解決的,

每過(guò)80秒執行一個(gè)公眾號,把每次的執行代碼講到hello中,泡的有點(diǎn)遠了,收一收哈,說(shuō)說(shuō)cron這個(gè)包,自動(dòng)化執行,npm官網(wǎng)上只給了一個(gè)反例,但是我這個(gè)指桑拿可能是有點(diǎn)壓制的厲害,不能否玩卻理解他的用法,然后我說(shuō)理解不了怎樣辦啊,上網(wǎng)搜唄,百度,cron包的具體用法,一看,嚯,還很多,于是就看啊看啊,但是仔細以剖析就不是這么回事兒了,都是屁話(huà),沒(méi)哪些用,網(wǎng)上通常的用法中都帶有一個(gè)問(wèn)號,但是我加上問(wèn)號的時(shí)侯,就報錯了,所以說(shuō)都是胡扯,最后在朋友組的一個(gè)后端技術(shù)討論群中說(shuō)了一聲,還真有熱心的群友,給我找了一個(gè)鏈接,我進(jìn)去一看,試了一下,還行,所以呢,非常謝謝這個(gè)幫助我解惑的朋友,再次我把qq群號,和鏈接附上,方便正在看這篇文章的你學(xué)習,QQ群號:435012561,鏈接:,這個(gè)鏈接上面說(shuō)的挺好,至少能用,這里我挺好到一個(gè)問(wèn)題,就是timezone,我們之前用過(guò)一次,用的是紐約時(shí)間,但是此次顯著(zhù)不行啊,要用俺們中國的時(shí)間啊,但是我試了幾次上海的不行,重慶的可以,所以我就用了上海的。
2、這里要說(shuō)的是,從地址欄獲取參數的問(wèn)題,我上一個(gè)做的沒(méi)問(wèn)題,但是這個(gè)不知道如何就不行了,上一個(gè)從地址欄得到的是數字,但是這個(gè)得到的是字符串,再加上mongodb中的對數組的要求還是很?chē)栏竦?,所以一個(gè)分頁(yè)功能也困惑了我幾個(gè)小時(shí)吧,最后是如何解決的呢,是通過(guò)我加的一個(gè)mongodb的討論群,在里面問(wèn)了一句這是如何了,發(fā)了個(gè)截圖,里面就有一個(gè)熱心的網(wǎng)友說(shuō)你這顯著(zhù)是傳入的數據格式不對啊,一語(yǔ)驚醒夢(mèng)中人,我說(shuō)是啊,然后就把得到的參數,我用Number()函數處理了一下,讓string類(lèi)型的數字,變成了number類(lèi)型的數字,就好了,所以說(shuō)你們在用mongodb的時(shí)侯一定要注意儲存數據的格式,
3、mongodb查詢(xún)數據句子組織形式:

其實(shí)說(shuō)白了就是limit和skip倆個(gè)函數的使用,但是具體的格式可的看好了,還有我這個(gè)是接受的參數,不過(guò)mongo的參數接受也好弄直接寫(xiě)就好了,不用象sql那樣搞哪些${""}這種類(lèi)型的,后面的sort函數說(shuō)明了排序的方法,這里是設置的以ctime數組為標準,-1表示逆序,1表示亂序,
4、在本次代碼編撰中,我首次使用了try catch 這個(gè)補錯的形式,事實(shí)證明,還行,可以把時(shí)常的錯誤正常的復印下來(lái),但是不影響代碼的整體執行,或者是說(shuō)下一次執行,整體覺(jué)得非常好,
具體的使用方式,在try中倒入你要執行的代碼,在最后加上一行,throw Error();
然后給catch傳入一個(gè)參數e,在catch中可以復印好多個(gè)信息,我只復印了其中的一個(gè),e.message,

5、這次編碼過(guò)程中主要用到了anync包,其中的ansyc.each循環(huán),ansyc.waterfall執行完前面的才可以執行下邊的,而且說(shuō)謊給你下之間還可以從上至下傳遞參數,這個(gè)很重要,因為在本次編程中,每次獲取的內容不同,每次代碼執行的條件不同,即須要的參數也不同,即有可能下一次代碼的執行就須要用到上一次代碼執行得到的結果,所以說(shuō)這個(gè)anync包,真的是值得研究,他的每位方式都不同,有時(shí)候可以得到意想不到的療效。
6、在mysql中若果想要達到這樣一個(gè)療效,就是說(shuō),如果數據庫中早已存在了,那就不予理會(huì ),或者說(shuō)不重復儲存,如果數據庫中不存在,那么就儲存進(jìn)來(lái),很簡(jiǎn)單,直接把插入數據的insert 換成 replace 。但是在mongodb中,應該是沒(méi)有,或者說(shuō)是我還沒(méi)有發(fā)覺(jué),我是那么解決的,定義了一個(gè)開(kāi)關(guān),令這個(gè)開(kāi)關(guān)為真,每次儲存之前,先把所有的數據循環(huán)一遍,看看有沒(méi)有這條數據,如果有,讓開(kāi)關(guān)變?yōu)榧?,如果沒(méi)有,繼續執行,即判定此時(shí)開(kāi)關(guān)的真偽,如果是真的,那就執行插入操作,如果是假的,就不予理會(huì ),這就達到了類(lèi)似的療效,否則每次就會(huì )儲存大量的重復數據,
7、本次采集的核心,就是我文件中的common.js了,首先由于要采集,所以須要用到request包,采集到以后,要處理html格式的數據,使之可以使用類(lèi)jquery的操作,那么久用到了cheerio這個(gè)包,然后在循環(huán)采集的時(shí)侯,會(huì )用到anync.each這個(gè)方式,所以會(huì )用到async這個(gè)包,
7-1、
通過(guò)搜狗陌陌采集,就要剖析搜狗陌陌的路徑,每個(gè)公眾號的頁(yè)面的路徑是這樣的
%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=
這個(gè)是“這才是臺灣”的頁(yè)面的鏈接,經(jīng)過(guò)剖析,所有的公眾號的鏈接只有query前面的參數不同,但是query前面的參數是哪些呢,其實(shí)就是通過(guò)encodeURIComponent()這個(gè)函數轉化以后的“這才是臺灣”,所以說(shuō)都一樣,獲取那種公眾號,就將那種公眾號的名子編碼以后,動(dòng)態(tài)的組合成一個(gè)鏈接,訪(fǎng)問(wèn)就可以步入到每位鏈接上面了,但是這個(gè)鏈接只是懇求到了這個(gè)頁(yè)面,

并不是

這個(gè)頁(yè)面,所以還的進(jìn)一步處理,就是得到當前頁(yè)面的第一個(gè)內容的鏈接,即href

當得到了這個(gè)鏈接,就會(huì )發(fā)覺(jué)他有他的加密方法,其實(shí)很簡(jiǎn)單的,就是在鏈接上面的加了三個(gè)amp;把鏈接上面的這三個(gè)amp;替換為空,就好了,這也就是第一步,得到每一個(gè)公眾號的頁(yè)面鏈接,
7-2
得到鏈接以后,就要進(jìn)行訪(fǎng)問(wèn)了,即懇求,請求每位地址,得到每位地址的內容,但是每位頁(yè)面顯示的內容都不在頁(yè)面中,即html結構中,在js中藏著(zhù),所以要通過(guò)正則匹配,得到整篇文章的對象,然后就循環(huán)每位公眾號的這個(gè)對象,得到這個(gè)對象中的整篇文章的一些信息,包括title,thumb,abstract,URL,time,五個(gè)數組,但是我使用的代碼爛透了,盡然當時(shí)使用了
對象.屬性.foreach(function(item,index){
})
這種爛透了的形式,弄的最后好的在寫(xiě)一次循環(huán)才可以完全的得到每一個(gè)對象,否則只可以得到第一個(gè),在這里應當用async.each,或者async.foreach這倆中形式每種都可以啊,而且都是非常好用的形式。這樣的話(huà)買(mǎi)就得到了整篇文章的以上基本消息,
7-3、
第三個(gè)階段,就是步入到整篇文章的詳情頁(yè),獲得整篇文章的內容,點(diǎn)贊數,作者,公眾號,閱讀量等數據,在這里遇到的主要問(wèn)題是,人家的content直接在在js中,所有的img標簽都有問(wèn)題,他是以這些方式存在雨content中,但是這樣的話(huà),這樣的圖片在我們的網(wǎng)頁(yè)中不能被顯示,因為標簽存在問(wèn)題啊,html文檔不認識這樣的img標簽啊,所以這兒要進(jìn)行一些處理,把所有的用replace替換為
微信公眾號推送信息爬取---python爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 160 次瀏覽 ? 2020-08-13 18:34
利用搜狗的陌陌搜索抓取指定公眾號的最新一條推送,并保存相應的網(wǎng)頁(yè)至本地。
注意點(diǎn)搜狗陌陌獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(JavaScript渲染),使用requests.get()獲取的內容是不含推送消息的,這里使用selenium+PhantomJS處理代碼
#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
參考輸出
分析鏈接獲取首先步入搜狗的陌陌搜索頁(yè)面,在地址欄中提取須要的部份鏈接,字符串聯(lián)接公眾號名稱(chēng),即可生成懇求鏈接針對靜態(tài)網(wǎng)頁(yè),利用requests獲取html文件,再用BeautifulSoup選擇須要的內容針對動(dòng)態(tài)網(wǎng)頁(yè),利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇須要的內容遇見(jiàn)驗證碼(CAPTCHA),輸出提示。此版本代碼沒(méi)有對驗證碼做實(shí)際處理,需要人為訪(fǎng)問(wèn)后,再跑程序,才能避免驗證碼。文件寫(xiě)入使用os.path.join()構造儲存路徑可以提升通用性。比如Windows路徑分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通過(guò)該函數能依據平臺進(jìn)行手動(dòng)轉換。open()使用b(binary mode)參數同樣為了提升通用性(適應Windows)使用datetime.now()獲取當前時(shí)間進(jìn)行命名,并通過(guò)strftime()格式化時(shí)間(函數名中的f代表format),具體使用參考下表(摘自 Automate the Boring Stuff with Python)
參考鏈接:文件夾創(chuàng )建: 異常處理的使用: enumerate的使用: open()使用b參數理由: 查看全部
問(wèn)題描述
利用搜狗的陌陌搜索抓取指定公眾號的最新一條推送,并保存相應的網(wǎng)頁(yè)至本地。
注意點(diǎn)搜狗陌陌獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(JavaScript渲染),使用requests.get()獲取的內容是不含推送消息的,這里使用selenium+PhantomJS處理代碼
#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
參考輸出


分析鏈接獲取首先步入搜狗的陌陌搜索頁(yè)面,在地址欄中提取須要的部份鏈接,字符串聯(lián)接公眾號名稱(chēng),即可生成懇求鏈接針對靜態(tài)網(wǎng)頁(yè),利用requests獲取html文件,再用BeautifulSoup選擇須要的內容針對動(dòng)態(tài)網(wǎng)頁(yè),利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇須要的內容遇見(jiàn)驗證碼(CAPTCHA),輸出提示。此版本代碼沒(méi)有對驗證碼做實(shí)際處理,需要人為訪(fǎng)問(wèn)后,再跑程序,才能避免驗證碼。文件寫(xiě)入使用os.path.join()構造儲存路徑可以提升通用性。比如Windows路徑分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通過(guò)該函數能依據平臺進(jìn)行手動(dòng)轉換。open()使用b(binary mode)參數同樣為了提升通用性(適應Windows)使用datetime.now()獲取當前時(shí)間進(jìn)行命名,并通過(guò)strftime()格式化時(shí)間(函數名中的f代表format),具體使用參考下表(摘自 Automate the Boring Stuff with Python)

參考鏈接:文件夾創(chuàng )建: 異常處理的使用: enumerate的使用: open()使用b參數理由:
Python爬取微信公眾號文章、點(diǎn)贊數
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 215 次瀏覽 ? 2020-08-13 18:31
2、3 設置Fiddler 并保存配置
微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據req_id 、 pass_ticket 、 appmsg_tojen
微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據cookie 和user-agent
最后恢復Fiddler的配置,會(huì )報錯的
END?。?!前面的獲取工作就結束了…
一、獲取cookie
# -*- coding: utf-8 -*-
import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')
post = {}
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)
driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('訂閱號賬號')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('訂閱號密碼')
# 自動(dòng)輸入密碼后點(diǎn)擊記住密碼
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 掃碼
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
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('cookie write ok ...')
二、獲取文章數據(文章列表寫(xiě)入數據庫)
<p># -*- coding: utf-8 -*-
import time, datetime
import json
import requests
import re
import random
import MySQLdb
#設置要爬取的公眾號列表
gzlist=['ckxxwx']
# 打開(kāi)數據庫連接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 數據的開(kāi)始日期 - 結束日期
start_data = '20190630';
end_data = '20190430'
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 獲取閱讀數和點(diǎn)贊數
def getMoreInfo(link, query):
pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"
if query == 'ckxxwx':
appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"
phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"
mid = link.split("&")[1].split("=")[1]
idx = link.split("&")[2].split("=")[1]
sn = link.split("&")[3].split("=")[1]
_biz = link.split("&")[0].split("_biz=")[1]
# 目標url
url = "http://mp.weixin.qq.com/mp/getappmsgext"
# 添加Cookie避免登陸操作,這里的"User-Agent"最好為手機瀏覽器的標識
headers = {
"Cookie": phoneCookie,
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400"
}
# 添加data,`req_id`、`pass_ticket`分別對應文章的信息,從fiddler復制即可。
data = {
"is_only_read": "1",
"is_temp_url": "0",
"appmsg_type": "9",
'reward_uin_count': '0'
}
params = {
"__biz": _biz,
"mid": mid,
"sn": sn,
"idx": idx,
"key": '777',
"pass_ticket": pass_ticket,
"appmsg_token": appmsg_token,
"uin": '777',
"wxtoken": "777"
}
# 使用post方法進(jìn)行提交
content = requests.post(url, headers=headers, data=data, params=params).json()
# 提取其中的閱讀數和點(diǎn)贊數
if 'appmsgstat' in content:
readNum = content["appmsgstat"]["read_num"]
likeNum = content["appmsgstat"]["like_num"]
else:
print('請求參數過(guò)期!')
# 歇10s,防止被封
time.sleep(10)
return readNum, likeNum
#爬取微信公眾號文章,并存在本地文本中
def get_content(query):
#query為要爬取的公眾號名稱(chēng)
#公眾號主頁(yè)
url = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(2)
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
if appmsg_response.json().get('base_resp').get('ret') == 200013:
print('搜索公眾號文章操作頻繁,?。?!')
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0 # 根據內容自定義
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
time.sleep(5)
#獲取每一頁(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')
for item in fakeid_list:
content_link=item.get('link')
content_title=item.get('title')
update_time=item.get('update_time')
timeArray = time.localtime(update_time)
DataTime = time.strftime("%Y%m%d", timeArray)
print(DataTime)
Yearsmonth = time.strftime("%Y%m", timeArray)
if DataTime 查看全部
2、2 關(guān)注須要爬取的公眾號
2、3 設置Fiddler 并保存配置

微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據req_id 、 pass_ticket 、 appmsg_tojen


微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據cookie 和user-agent

最后恢復Fiddler的配置,會(huì )報錯的
END?。?!前面的獲取工作就結束了…
一、獲取cookie
# -*- coding: utf-8 -*-
import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')
post = {}
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)
driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('訂閱號賬號')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('訂閱號密碼')
# 自動(dòng)輸入密碼后點(diǎn)擊記住密碼
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 掃碼
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
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('cookie write ok ...')
二、獲取文章數據(文章列表寫(xiě)入數據庫)

<p># -*- coding: utf-8 -*-
import time, datetime
import json
import requests
import re
import random
import MySQLdb
#設置要爬取的公眾號列表
gzlist=['ckxxwx']
# 打開(kāi)數據庫連接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 數據的開(kāi)始日期 - 結束日期
start_data = '20190630';
end_data = '20190430'
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 獲取閱讀數和點(diǎn)贊數
def getMoreInfo(link, query):
pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"
if query == 'ckxxwx':
appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"
phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"
mid = link.split("&")[1].split("=")[1]
idx = link.split("&")[2].split("=")[1]
sn = link.split("&")[3].split("=")[1]
_biz = link.split("&")[0].split("_biz=")[1]
# 目標url
url = "http://mp.weixin.qq.com/mp/getappmsgext"
# 添加Cookie避免登陸操作,這里的"User-Agent"最好為手機瀏覽器的標識
headers = {
"Cookie": phoneCookie,
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400"
}
# 添加data,`req_id`、`pass_ticket`分別對應文章的信息,從fiddler復制即可。
data = {
"is_only_read": "1",
"is_temp_url": "0",
"appmsg_type": "9",
'reward_uin_count': '0'
}
params = {
"__biz": _biz,
"mid": mid,
"sn": sn,
"idx": idx,
"key": '777',
"pass_ticket": pass_ticket,
"appmsg_token": appmsg_token,
"uin": '777',
"wxtoken": "777"
}
# 使用post方法進(jìn)行提交
content = requests.post(url, headers=headers, data=data, params=params).json()
# 提取其中的閱讀數和點(diǎn)贊數
if 'appmsgstat' in content:
readNum = content["appmsgstat"]["read_num"]
likeNum = content["appmsgstat"]["like_num"]
else:
print('請求參數過(guò)期!')
# 歇10s,防止被封
time.sleep(10)
return readNum, likeNum
#爬取微信公眾號文章,并存在本地文本中
def get_content(query):
#query為要爬取的公眾號名稱(chēng)
#公眾號主頁(yè)
url = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(2)
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
if appmsg_response.json().get('base_resp').get('ret') == 200013:
print('搜索公眾號文章操作頻繁,?。?!')
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0 # 根據內容自定義
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
time.sleep(5)
#獲取每一頁(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')
for item in fakeid_list:
content_link=item.get('link')
content_title=item.get('title')
update_time=item.get('update_time')
timeArray = time.localtime(update_time)
DataTime = time.strftime("%Y%m%d", timeArray)
print(DataTime)
Yearsmonth = time.strftime("%Y%m", timeArray)
if DataTime
Python 抓取微信公眾號文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 195 次瀏覽 ? 2020-08-11 15:51
然后按照時(shí)效性鏈接獲取文章內容,并從中提取參數信息:
from html import unescape from urllib.parse import urlencode def weixin_params(link): html = req.get(link) rParams = r'var (biz =.*?".*?");\s*var (sn =.*?".*?");\s*var (mid =.*?".*?");\s*var (idx =.*?".*?");' params = re.findall(rParams, html) if len(params) == 0: return None return {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]} for (link, title, abstract) in infos: title = unescape(self.remove_tag(title)) abstract = unescape(self.remove_tag(abstract)) params = weixin_params(link) if params is not None: link = "http://mp.weixin.qq.com/s?" + urlencode(params) print(link, title, abstract)
由此可以搜集到以 Python 為關(guān)鍵詞的微信公眾號文章,包括鏈接、標題和摘要。如需文章內容也可以隨時(shí)通過(guò)鏈接提取,但是為了尊重創(chuàng )作者,請在抓取文章正文的時(shí)侯請復查原創(chuàng )信息并合理標明作者及引用信息。
來(lái)自:#rd 查看全部
def remove_tags(s): return re.sub(r'', '', s)
然后按照時(shí)效性鏈接獲取文章內容,并從中提取參數信息:
from html import unescape from urllib.parse import urlencode def weixin_params(link): html = req.get(link) rParams = r'var (biz =.*?".*?");\s*var (sn =.*?".*?");\s*var (mid =.*?".*?");\s*var (idx =.*?".*?");' params = re.findall(rParams, html) if len(params) == 0: return None return {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]} for (link, title, abstract) in infos: title = unescape(self.remove_tag(title)) abstract = unescape(self.remove_tag(abstract)) params = weixin_params(link) if params is not None: link = "http://mp.weixin.qq.com/s?" + urlencode(params) print(link, title, abstract)
由此可以搜集到以 Python 為關(guān)鍵詞的微信公眾號文章,包括鏈接、標題和摘要。如需文章內容也可以隨時(shí)通過(guò)鏈接提取,但是為了尊重創(chuàng )作者,請在抓取文章正文的時(shí)侯請復查原創(chuàng )信息并合理標明作者及引用信息。
來(lái)自:#rd
微信公眾號采集小爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 300 次瀏覽 ? 2020-08-11 12:49
## 公眾號爬取形式
爬取公眾號目前主流的方案主要有兩種,一種是通過(guò)搜狗搜索微信公眾號的頁(yè)面去找到文章地址,再去爬取具體文章內容;第二種是通過(guò)注冊公眾號之后通過(guò)公眾號的搜索插口去查詢(xún)到文章地址,然后再按照地址去爬文章內容。
這兩種方案各有優(yōu)缺點(diǎn),通過(guò)搜狗搜索來(lái)做雖然核心思路就是通過(guò)request模擬搜狗搜索公眾號,然后解析搜索結果頁(yè)面,再依照公眾號主頁(yè)地址爬蟲(chóng),爬取文章明細信息,但是這兒須要注意下,因為搜狗和騰訊之間的合同問(wèn)題,只能顯示最新的10條文章,沒(méi)辦法領(lǐng)到所有的文章。如果要領(lǐng)到所有文章的同學(xué)可能要采用第二種形式了。第二種方法的缺點(diǎn)就是要注冊公眾號通過(guò)騰訊認證,流程麻煩些,通過(guò)調用插口公眾號查詢(xún)插口查詢(xún),但是翻頁(yè)須要通過(guò)selenium去模擬滑動(dòng)翻頁(yè)操作,整個(gè)過(guò)程還是很麻煩的。因為我的項目里不需要歷史文章,所以我采用通過(guò)搜狗搜索去做爬取公眾號的功能。
爬取近來(lái)10篇公眾號文章
python須要依賴(lài)的三方庫如下:
urllib、pyquery、requests、selenium
具體的邏輯都寫(xiě)在注釋里了,沒(méi)有非常復雜的地方。
爬蟲(chóng)核心類(lèi)
```python
#!/usr/bin/python
# coding: utf-8
import sys
?
reload(sys)
sys.setdefaultencoding('utf-8')
?
from urllib import quote
from pyquery import PyQuery as pq
?
import requests
import time
import re
import os
?
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
?
?
# 搜索入口地址,以公眾為關(guān)鍵字搜索該公眾號
def get_search_result_by_keywords(sogou_search_url):
????# 爬蟲(chóng)偽裝頭部設置
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
?
????# 設置操作超時(shí)時(shí)長(cháng)
????timeout = 5
????# 爬蟲(chóng)模擬在一個(gè)request.session中完成
????s = requests.Session()
????log(u'搜索地址為:%s' % sogou_search_url)
????return s.get(sogou_search_url, headers=headers, timeout=timeout).content
?
?
# 獲得公眾號主頁(yè)地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
????doc = pq(sougou_search_html)
????return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
?
?
# 使用webdriver 加載公眾號主頁(yè)內容,主要是js渲染的部分
def get_selenium_js_html(url):
????options = Options()
????options.add_argument('-headless')? # 無(wú)頭參數
????driver = Chrome(executable_path='chromedriver', chrome_options=options)
????wait = WebDriverWait(driver, timeout=10)
?
????driver.get(url)
????time.sleep(3)
????# 執行js得到整個(gè)頁(yè)面內容
????html = driver.execute_script("return document.documentElement.outerHTML")
????driver.close()
????return html
?
?
# 獲取公眾號文章內容
def parse_wx_articles_by_html(selenium_html):
????doc = pq(selenium_html)
????return doc('div[class="weui_media_box appmsg"]')
?
?
# 將獲取到的文章轉換為字典
def switch_arctiles_to_list(articles):
????# 定義存貯變量
????articles_list = []
????i = 1
?
????# 遍歷找到的文章,解析里面的內容
????if articles:
????????for article in articles.items():
????????????log(u'開(kāi)始整合(%d/%d)' % (i, len(articles)))
????????????# 處理單個(gè)文章
????????????articles_list.append(parse_one_article(article))
????????????i += 1
????return articles_list
?
?
# 解析單篇文章
def parse_one_article(article):
????article_dict = {}
?
????# 獲取標題
????title = article('h4[class="weui_media_title"]').text().strip()
????###log(u'標題是: %s' % title)
????# 獲取標題對應的地址
????url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
????log(u'地址為: %s' % url)
????# 獲取概要內容
????summary = article('.weui_media_desc').text()
????log(u'文章簡(jiǎn)述: %s' % summary)
????# 獲取文章發(fā)表時(shí)間
????date = article('.weui_media_extra_info').text().strip()
????log(u'發(fā)表時(shí)間為: %s' % date)
????# 獲取封面圖片
????pic = parse_cover_pic(article)
?
????# 返回字典數據
????return {
????????'title': title,
????????'url': url,
????????'summary': summary,
????????'date': date,
????????'pic': pic
????}
?
?
# 查找封面圖片,獲取封面圖片地址
def parse_cover_pic(article):
????pic = article('.weui_media_hd').attr('style')
?
????p = re.compile(r'background-image:url\((.*?)\)')
????rs = p.findall(pic)
????log(u'封面圖片是:%s ' % rs[0] if len(rs) > 0 else '')
?
????return rs[0] if len(rs) > 0 else ''
?
?
# 自定義log函數,主要是加上時(shí)間
def log(msg):
????print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
?
?
# 驗證函數
def need_verify(selenium_html):
????' 有時(shí)候對方會(huì )封鎖ip,這里做一下判斷,檢測html中是否包含id=verify_change的標簽,有的話(huà),代表被重定向了,提醒過(guò)一陣子重試 '
????return pq(selenium_html)('#verify_change').text() != ''
?
?
# 創(chuàng )建公眾號命名的文件夾
def create_dir(keywords):
????if not os.path.exists(keywords):
????????os.makedirs(keywords)
?
????????# 爬蟲(chóng)主函數
?
?
def run(keywords):
????' 爬蟲(chóng)入口函數 '
????# Step 0 :? 創(chuàng )建公眾號命名的文件夾
????create_dir(keywords)
?
????# 搜狐微信搜索鏈接入口
????sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
????????keywords)
?
????# Step 1:GET請求到搜狗微信引擎,以微信公眾號英文名稱(chēng)作為查詢(xún)關(guān)鍵字
????log(u'開(kāi)始獲取,微信公眾號英文名為:%s' % keywords)
????log(u'開(kāi)始調用sougou搜索引擎')
????sougou_search_html = get_search_result_by_keywords(sogou_search_url)
?
????# Step 2:從搜索結果頁(yè)中解析出公眾號主頁(yè)鏈接
????log(u'獲取sougou_search_html成功,開(kāi)始抓取公眾號對應的主頁(yè)wx_url')
????wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
????log(u'獲取wx_url成功,%s' % wx_url)
?
????# Step 3:Selenium+PhantomJs獲取js異步加載渲染后的html
????log(u'開(kāi)始調用selenium渲染html')
????selenium_html = get_selenium_js_html(wx_url)
?
????# Step 4: 檢測目標網(wǎng)站是否進(jìn)行了封鎖
????if need_verify(selenium_html):
????????log(u'爬蟲(chóng)被目標網(wǎng)站封鎖,請稍后再試')
????else:
????????# Step 5: 使用PyQuery,從Step 3獲取的html中解析出公眾號文章列表的數據
????????log(u'調用selenium渲染html完成,開(kāi)始解析公眾號文章')
????????articles = parse_wx_articles_by_html(selenium_html)
????????log(u'抓取到微信文章%d篇' % len(articles))
?
????????# Step 6: 把微信文章數據封裝成字典的list
????????log(u'開(kāi)始整合微信文章數據為字典')
????????articles_list = switch_arctiles_to_list(articles)
????????return [content['title'] for content in articles_list]
?
```
?
main入口函數:
?
```python
# coding: utf8
import spider_weixun_by_sogou
?
if __name__ == '__main__':
?
????gongzhonghao = raw_input(u'input weixin gongzhonghao:')
????if not gongzhonghao:
????????gongzhonghao = 'spider'
????text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
?
????print text
爬取公眾號注意事項
下面這3個(gè)是我在爬取的過(guò)程中遇見(jiàn)的一些問(wèn)題,希望能幫到你們避坑。
1. Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
網(wǎng)上好多的文章都還在使用PhantomJS,其實(shí)從今年Selenium就早已不支持PhantomJS了,現在使用Selenium初始化瀏覽器的話(huà)須要使用webdriver初始化無(wú)頭參數的Chrome或則Firefox driver。
具體可以參考官網(wǎng)鏈接:
2. Can not connect to the Service chromedriver/firefoxdriver
在開(kāi)發(fā)過(guò)程中還碰到這個(gè)坑,這個(gè)問(wèn)題通常有兩種可能性,一種是沒(méi)有配置chromedriver或則geckodriver的環(huán)境變量,這里須要注意下將chromedriver或則geckodriver文件一定要配置環(huán)境變量到PATH下,或者干脆粗魯一點(diǎn)直接將這兩個(gè)文件復制到/usr/bin目錄下;
還有種可能是沒(méi)有配置hosts,如果你們發(fā)覺(jué)這個(gè)問(wèn)題復查下自己的hosts文件是不是沒(méi)有配置`127.0.0.1 localhost`,只要配置上就好了。
這里還有一點(diǎn)要注意的就是使用chrome瀏覽器的話(huà),還要注意chrome瀏覽器版本和chromedriver的對應關(guān)系,可以在這篇文章中查看也可以翻墻去google官網(wǎng)查看最新的對應關(guān)系。
3. 防盜鏈
微信公眾號對文章中的圖片做了防盜鏈處理,所以假如在公眾號和小程序、PC瀏覽器以外的地方是未能顯示圖片的,這里推薦你們可以看下這篇文章了解下怎樣處理陌陌的防盜鏈。
總結
好了前面說(shuō)了那么多,大家最關(guān)心的就是源代碼,這里放出github地址:,好用的話(huà)記得strar。
另外附上作品項目: 查看全部
最近在做一個(gè)自己的項目,涉及到須要通過(guò)python爬取微信公眾號的文章,因為陌陌奇特一些手段,導致難以直接爬取,研究了一些文章大概有了思路,并且網(wǎng)上目前能搜到的方案思路都沒(méi)啥問(wèn)題,但是上面的代碼由于一些三方庫的變動(dòng)基本都不能用了,這篇文章寫(xiě)給須要爬取公眾號文章的朋友們,文章最后也會(huì )提供python源碼下載。
## 公眾號爬取形式
爬取公眾號目前主流的方案主要有兩種,一種是通過(guò)搜狗搜索微信公眾號的頁(yè)面去找到文章地址,再去爬取具體文章內容;第二種是通過(guò)注冊公眾號之后通過(guò)公眾號的搜索插口去查詢(xún)到文章地址,然后再按照地址去爬文章內容。
這兩種方案各有優(yōu)缺點(diǎn),通過(guò)搜狗搜索來(lái)做雖然核心思路就是通過(guò)request模擬搜狗搜索公眾號,然后解析搜索結果頁(yè)面,再依照公眾號主頁(yè)地址爬蟲(chóng),爬取文章明細信息,但是這兒須要注意下,因為搜狗和騰訊之間的合同問(wèn)題,只能顯示最新的10條文章,沒(méi)辦法領(lǐng)到所有的文章。如果要領(lǐng)到所有文章的同學(xué)可能要采用第二種形式了。第二種方法的缺點(diǎn)就是要注冊公眾號通過(guò)騰訊認證,流程麻煩些,通過(guò)調用插口公眾號查詢(xún)插口查詢(xún),但是翻頁(yè)須要通過(guò)selenium去模擬滑動(dòng)翻頁(yè)操作,整個(gè)過(guò)程還是很麻煩的。因為我的項目里不需要歷史文章,所以我采用通過(guò)搜狗搜索去做爬取公眾號的功能。
爬取近來(lái)10篇公眾號文章
python須要依賴(lài)的三方庫如下:
urllib、pyquery、requests、selenium
具體的邏輯都寫(xiě)在注釋里了,沒(méi)有非常復雜的地方。
爬蟲(chóng)核心類(lèi)
```python
#!/usr/bin/python
# coding: utf-8
import sys
?
reload(sys)
sys.setdefaultencoding('utf-8')
?
from urllib import quote
from pyquery import PyQuery as pq
?
import requests
import time
import re
import os
?
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
?
?
# 搜索入口地址,以公眾為關(guān)鍵字搜索該公眾號
def get_search_result_by_keywords(sogou_search_url):
????# 爬蟲(chóng)偽裝頭部設置
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
?
????# 設置操作超時(shí)時(shí)長(cháng)
????timeout = 5
????# 爬蟲(chóng)模擬在一個(gè)request.session中完成
????s = requests.Session()
????log(u'搜索地址為:%s' % sogou_search_url)
????return s.get(sogou_search_url, headers=headers, timeout=timeout).content
?
?
# 獲得公眾號主頁(yè)地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
????doc = pq(sougou_search_html)
????return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
?
?
# 使用webdriver 加載公眾號主頁(yè)內容,主要是js渲染的部分
def get_selenium_js_html(url):
????options = Options()
????options.add_argument('-headless')? # 無(wú)頭參數
????driver = Chrome(executable_path='chromedriver', chrome_options=options)
????wait = WebDriverWait(driver, timeout=10)
?
????driver.get(url)
????time.sleep(3)
????# 執行js得到整個(gè)頁(yè)面內容
????html = driver.execute_script("return document.documentElement.outerHTML")
????driver.close()
????return html
?
?
# 獲取公眾號文章內容
def parse_wx_articles_by_html(selenium_html):
????doc = pq(selenium_html)
????return doc('div[class="weui_media_box appmsg"]')
?
?
# 將獲取到的文章轉換為字典
def switch_arctiles_to_list(articles):
????# 定義存貯變量
????articles_list = []
????i = 1
?
????# 遍歷找到的文章,解析里面的內容
????if articles:
????????for article in articles.items():
????????????log(u'開(kāi)始整合(%d/%d)' % (i, len(articles)))
????????????# 處理單個(gè)文章
????????????articles_list.append(parse_one_article(article))
????????????i += 1
????return articles_list
?
?
# 解析單篇文章
def parse_one_article(article):
????article_dict = {}
?
????# 獲取標題
????title = article('h4[class="weui_media_title"]').text().strip()
????###log(u'標題是: %s' % title)
????# 獲取標題對應的地址
????url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
????log(u'地址為: %s' % url)
????# 獲取概要內容
????summary = article('.weui_media_desc').text()
????log(u'文章簡(jiǎn)述: %s' % summary)
????# 獲取文章發(fā)表時(shí)間
????date = article('.weui_media_extra_info').text().strip()
????log(u'發(fā)表時(shí)間為: %s' % date)
????# 獲取封面圖片
????pic = parse_cover_pic(article)
?
????# 返回字典數據
????return {
????????'title': title,
????????'url': url,
????????'summary': summary,
????????'date': date,
????????'pic': pic
????}
?
?
# 查找封面圖片,獲取封面圖片地址
def parse_cover_pic(article):
????pic = article('.weui_media_hd').attr('style')
?
????p = re.compile(r'background-image:url\((.*?)\)')
????rs = p.findall(pic)
????log(u'封面圖片是:%s ' % rs[0] if len(rs) > 0 else '')
?
????return rs[0] if len(rs) > 0 else ''
?
?
# 自定義log函數,主要是加上時(shí)間
def log(msg):
????print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
?
?
# 驗證函數
def need_verify(selenium_html):
????' 有時(shí)候對方會(huì )封鎖ip,這里做一下判斷,檢測html中是否包含id=verify_change的標簽,有的話(huà),代表被重定向了,提醒過(guò)一陣子重試 '
????return pq(selenium_html)('#verify_change').text() != ''
?
?
# 創(chuàng )建公眾號命名的文件夾
def create_dir(keywords):
????if not os.path.exists(keywords):
????????os.makedirs(keywords)
?
????????# 爬蟲(chóng)主函數
?
?
def run(keywords):
????' 爬蟲(chóng)入口函數 '
????# Step 0 :? 創(chuàng )建公眾號命名的文件夾
????create_dir(keywords)
?
????# 搜狐微信搜索鏈接入口
????sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
????????keywords)
?
????# Step 1:GET請求到搜狗微信引擎,以微信公眾號英文名稱(chēng)作為查詢(xún)關(guān)鍵字
????log(u'開(kāi)始獲取,微信公眾號英文名為:%s' % keywords)
????log(u'開(kāi)始調用sougou搜索引擎')
????sougou_search_html = get_search_result_by_keywords(sogou_search_url)
?
????# Step 2:從搜索結果頁(yè)中解析出公眾號主頁(yè)鏈接
????log(u'獲取sougou_search_html成功,開(kāi)始抓取公眾號對應的主頁(yè)wx_url')
????wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
????log(u'獲取wx_url成功,%s' % wx_url)
?
????# Step 3:Selenium+PhantomJs獲取js異步加載渲染后的html
????log(u'開(kāi)始調用selenium渲染html')
????selenium_html = get_selenium_js_html(wx_url)
?
????# Step 4: 檢測目標網(wǎng)站是否進(jìn)行了封鎖
????if need_verify(selenium_html):
????????log(u'爬蟲(chóng)被目標網(wǎng)站封鎖,請稍后再試')
????else:
????????# Step 5: 使用PyQuery,從Step 3獲取的html中解析出公眾號文章列表的數據
????????log(u'調用selenium渲染html完成,開(kāi)始解析公眾號文章')
????????articles = parse_wx_articles_by_html(selenium_html)
????????log(u'抓取到微信文章%d篇' % len(articles))
?
????????# Step 6: 把微信文章數據封裝成字典的list
????????log(u'開(kāi)始整合微信文章數據為字典')
????????articles_list = switch_arctiles_to_list(articles)
????????return [content['title'] for content in articles_list]
?
```
?
main入口函數:
?
```python
# coding: utf8
import spider_weixun_by_sogou
?
if __name__ == '__main__':
?
????gongzhonghao = raw_input(u'input weixin gongzhonghao:')
????if not gongzhonghao:
????????gongzhonghao = 'spider'
????text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
?
????print text
爬取公眾號注意事項
下面這3個(gè)是我在爬取的過(guò)程中遇見(jiàn)的一些問(wèn)題,希望能幫到你們避坑。
1. Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
網(wǎng)上好多的文章都還在使用PhantomJS,其實(shí)從今年Selenium就早已不支持PhantomJS了,現在使用Selenium初始化瀏覽器的話(huà)須要使用webdriver初始化無(wú)頭參數的Chrome或則Firefox driver。
具體可以參考官網(wǎng)鏈接:
2. Can not connect to the Service chromedriver/firefoxdriver
在開(kāi)發(fā)過(guò)程中還碰到這個(gè)坑,這個(gè)問(wèn)題通常有兩種可能性,一種是沒(méi)有配置chromedriver或則geckodriver的環(huán)境變量,這里須要注意下將chromedriver或則geckodriver文件一定要配置環(huán)境變量到PATH下,或者干脆粗魯一點(diǎn)直接將這兩個(gè)文件復制到/usr/bin目錄下;
還有種可能是沒(méi)有配置hosts,如果你們發(fā)覺(jué)這個(gè)問(wèn)題復查下自己的hosts文件是不是沒(méi)有配置`127.0.0.1 localhost`,只要配置上就好了。
這里還有一點(diǎn)要注意的就是使用chrome瀏覽器的話(huà),還要注意chrome瀏覽器版本和chromedriver的對應關(guān)系,可以在這篇文章中查看也可以翻墻去google官網(wǎng)查看最新的對應關(guān)系。
3. 防盜鏈
微信公眾號對文章中的圖片做了防盜鏈處理,所以假如在公眾號和小程序、PC瀏覽器以外的地方是未能顯示圖片的,這里推薦你們可以看下這篇文章了解下怎樣處理陌陌的防盜鏈。
總結
好了前面說(shuō)了那么多,大家最關(guān)心的就是源代碼,這里放出github地址:,好用的話(huà)記得strar。
另外附上作品項目:
python3下載公眾號歷史文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 214 次瀏覽 ? 2020-08-11 07:24
好吧,其實(shí)也完全是照搬,感謝高手!
還沒(méi)有安裝python可以先下載一個(gè)anoconda3:
1.終端加載python selenium模塊包
加載包
2.使用webdriver功能須要安裝對應瀏覽器的驅動(dòng)插件,我用的是谷歌瀏覽器。安裝和瀏覽器版本對應的webdriver版本,解壓雜記下 chromedriver.exe 路徑。對應版本查詢(xún)和下載鏈接:
3.注冊自己的公眾號:微信公眾號登錄地址:
4.參考:
我照搬代碼的這位前輩:
崔慶才原文(另有探究代碼過(guò)程視頻):
6.我的webdriver不知道是版本沒(méi)對上還是哪些緣由,不能實(shí)現手動(dòng)輸入,注釋掉,手動(dòng)輸入解決。
7.原文保存的是文章標題和鏈接,我需要保存到本地。用過(guò)兩種方式,一個(gè)是生成pdf格式,一個(gè)是保存為html格式。
?。?)保存為html格式,終端加載pip install urllib,然后
import urllib.request
使用:urllib.request.urlretrieve('','taobao.html')
?。?)生成pdf較為復雜一些,不過(guò)有此方式,以后假如有須要,保存網(wǎng)址為pdf也便捷許多。不過(guò)這方面的需求用印象筆記的瀏覽器插件早已相當滿(mǎn)足了。
pip intall pdfkit
pip install requests
pip install beautifulsoup4
安裝 wkhtmltopdf,Windows平臺直接在 下載穩定版的 wkhtmltopdf 進(jìn)行安裝,安裝完成以后把該程序的執行路徑加入到系統環(huán)境 $PATH 變量中,否則 pdfkit 找不到 wkhtmltopdf 就出現錯誤 “No wkhtmltopdf executable found”
方便使用,自己寫(xiě)了一個(gè)簡(jiǎn)單的模塊:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'a html to pdf model'
'''
使用示例:python htmltopdf_dl.py www.taobao.com baidu.pdf
'''
_author_ = 'dengling'
import pdfkit
import sys
def htmltopdf_dl():
ags = sys.argv
pdfkit.from_url(ags[1],ags[2])
if __name__ =='__main__':
htmltopdf_dl()
8.缺點(diǎn):(1)用這個(gè)方式只在一個(gè)安靜平和的夜間奇妙地爬完了所有的文章。其余時(shí)侯再也沒(méi)有完整的爬取過(guò)所有的鏈接了。(2)因為保存本地html時(shí)參數辨識標題的特殊符號例如''時(shí)會(huì )出錯,所以不能一下子全轉換過(guò)來(lái)。(3)圖片不能一起保存出來(lái)。
完整代碼:
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import json
import requests
import re
import random
#微信公眾號賬號
user="你的賬戶(hù)"
#公眾號密碼
password="你的密碼"
#設置要爬取的公眾號列表
gzlist=['公眾號名字']
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
def weChat_login():
#定義一個(gè)空的字典,存放cookies內容
post={}
#用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='E:\微信公眾號\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('https://mp.weixin.qq.com/')
#等待5秒鐘
time.sleep(5)
print("正在輸入微信公眾號登錄賬號和密碼......")
#清空賬號框中的內容
driver.find_element_by_xpath("./*//input[@id='account']").clear()
#自動(dòng)填入登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@id='account']").send_keys(user)
#清空密碼框中的內容
driver.find_element_by_xpath("./*//input[@id='pwd']").clear()
#自動(dòng)填入登錄密碼
driver.find_element_by_xpath("./*//input[@id='pwd']").send_keys(password)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_xpath("./*//a[@id='loginBt']").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新載入公眾號登錄頁(yè),登錄之后會(huì )顯示公眾號后臺首頁(yè),從這個(gè)返回內容中獲取cookies信息
driver.get('https://mp.weixin.qq.com/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
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 = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
#獲取每一頁(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')
for item in 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")
# fh.write("urllib.request.urlretrieve('"+content_link + "','" + content_title +".html')\n")由于還沒(méi)有解決標題的符號參數識別會(huì )報錯的問(wèn)題,用了這個(gè)笨方法去解決的。
num -= 1
begin = int(begin)
begin+=5
time.sleep(2)
if __name__=='__main__':
try:
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
weChat_login()
#登錄之后,通過(guò)微信公眾號后臺提供的微信公眾號文章接口爬取文章
for query in gzlist:
#爬取微信公眾號文章,并存在本地文本中
print("開(kāi)始爬取公眾號:"+query)
get_content(query)
print("爬取完成")
except Exception as e:
print(str(e))
還好我要的文章都能下載出來(lái)了,圖片也沒(méi)有哪些用,所以暫時(shí)早已能滿(mǎn)足了。至于解決這種問(wèn)題,之后有時(shí)間有須要的時(shí)侯再鉆研。 查看全部
于是百度微軟必應各類(lèi)搜索引擎上手,第一次爬蟲(chóng)經(jīng)歷就這樣玉米了~~~
好吧,其實(shí)也完全是照搬,感謝高手!
還沒(méi)有安裝python可以先下載一個(gè)anoconda3:
1.終端加載python selenium模塊包

加載包
2.使用webdriver功能須要安裝對應瀏覽器的驅動(dòng)插件,我用的是谷歌瀏覽器。安裝和瀏覽器版本對應的webdriver版本,解壓雜記下 chromedriver.exe 路徑。對應版本查詢(xún)和下載鏈接:
3.注冊自己的公眾號:微信公眾號登錄地址:
4.參考:
我照搬代碼的這位前輩:
崔慶才原文(另有探究代碼過(guò)程視頻):
6.我的webdriver不知道是版本沒(méi)對上還是哪些緣由,不能實(shí)現手動(dòng)輸入,注釋掉,手動(dòng)輸入解決。
7.原文保存的是文章標題和鏈接,我需要保存到本地。用過(guò)兩種方式,一個(gè)是生成pdf格式,一個(gè)是保存為html格式。
?。?)保存為html格式,終端加載pip install urllib,然后
import urllib.request
使用:urllib.request.urlretrieve('','taobao.html')
?。?)生成pdf較為復雜一些,不過(guò)有此方式,以后假如有須要,保存網(wǎng)址為pdf也便捷許多。不過(guò)這方面的需求用印象筆記的瀏覽器插件早已相當滿(mǎn)足了。
pip intall pdfkit
pip install requests
pip install beautifulsoup4
安裝 wkhtmltopdf,Windows平臺直接在 下載穩定版的 wkhtmltopdf 進(jìn)行安裝,安裝完成以后把該程序的執行路徑加入到系統環(huán)境 $PATH 變量中,否則 pdfkit 找不到 wkhtmltopdf 就出現錯誤 “No wkhtmltopdf executable found”
方便使用,自己寫(xiě)了一個(gè)簡(jiǎn)單的模塊:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'a html to pdf model'
'''
使用示例:python htmltopdf_dl.py www.taobao.com baidu.pdf
'''
_author_ = 'dengling'
import pdfkit
import sys
def htmltopdf_dl():
ags = sys.argv
pdfkit.from_url(ags[1],ags[2])
if __name__ =='__main__':
htmltopdf_dl()
8.缺點(diǎn):(1)用這個(gè)方式只在一個(gè)安靜平和的夜間奇妙地爬完了所有的文章。其余時(shí)侯再也沒(méi)有完整的爬取過(guò)所有的鏈接了。(2)因為保存本地html時(shí)參數辨識標題的特殊符號例如''時(shí)會(huì )出錯,所以不能一下子全轉換過(guò)來(lái)。(3)圖片不能一起保存出來(lái)。
完整代碼:
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import json
import requests
import re
import random
#微信公眾號賬號
user="你的賬戶(hù)"
#公眾號密碼
password="你的密碼"
#設置要爬取的公眾號列表
gzlist=['公眾號名字']
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
def weChat_login():
#定義一個(gè)空的字典,存放cookies內容
post={}
#用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='E:\微信公眾號\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('https://mp.weixin.qq.com/')
#等待5秒鐘
time.sleep(5)
print("正在輸入微信公眾號登錄賬號和密碼......")
#清空賬號框中的內容
driver.find_element_by_xpath("./*//input[@id='account']").clear()
#自動(dòng)填入登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@id='account']").send_keys(user)
#清空密碼框中的內容
driver.find_element_by_xpath("./*//input[@id='pwd']").clear()
#自動(dòng)填入登錄密碼
driver.find_element_by_xpath("./*//input[@id='pwd']").send_keys(password)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_xpath("./*//a[@id='loginBt']").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新載入公眾號登錄頁(yè),登錄之后會(huì )顯示公眾號后臺首頁(yè),從這個(gè)返回內容中獲取cookies信息
driver.get('https://mp.weixin.qq.com/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
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 = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
#獲取每一頁(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')
for item in 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")
# fh.write("urllib.request.urlretrieve('"+content_link + "','" + content_title +".html')\n")由于還沒(méi)有解決標題的符號參數識別會(huì )報錯的問(wèn)題,用了這個(gè)笨方法去解決的。
num -= 1
begin = int(begin)
begin+=5
time.sleep(2)
if __name__=='__main__':
try:
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
weChat_login()
#登錄之后,通過(guò)微信公眾號后臺提供的微信公眾號文章接口爬取文章
for query in gzlist:
#爬取微信公眾號文章,并存在本地文本中
print("開(kāi)始爬取公眾號:"+query)
get_content(query)
print("爬取完成")
except Exception as e:
print(str(e))
還好我要的文章都能下載出來(lái)了,圖片也沒(méi)有哪些用,所以暫時(shí)早已能滿(mǎn)足了。至于解決這種問(wèn)題,之后有時(shí)間有須要的時(shí)侯再鉆研。
搜狗微信公眾號熱門(mén)文章如何采集
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 380 次瀏覽 ? 2020-08-10 18:46
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址丌會(huì )改變;b、網(wǎng)頁(yè) 丌是完全加載,只是局部迚行了數據加載,有所變化。 驗證方法:點(diǎn)擊操作后,在瀏覽器中,網(wǎng)址輸入欄丌會(huì )出現加載中的狀態(tài)戒者轉 圈狀態(tài)。 優(yōu)采云云采集服務(wù)平臺 觀(guān)察網(wǎng)頁(yè),我們發(fā)覺(jué),通過(guò)5 次點(diǎn)擊“加載更多內容”,頁(yè)面加載到最頂部,一 共顯示100 篇文章。因此,我們設置整個(gè)“循環(huán)翻頁(yè)”步驟執行5 次。選中“循 環(huán)翻頁(yè)”步驟,打開(kāi)“高級選項”,打開(kāi)“滿(mǎn)足以下條件時(shí)退出循環(huán)”,設置循 環(huán)次數等于“5 次”,點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖5 步驟3:創(chuàng )建列表循環(huán)并提取數據 1)移勱鍵盤(pán),選中頁(yè)面里第一篇文章的區塊。系統會(huì )辨識此區塊中的子元素, 在操作提示框中,選擇“選中子元素” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖6 2)繼續選中頁(yè)面中第二篇文章的區塊,系統會(huì )自勱選中第二篇文章中的子元素, 并辨識出頁(yè)面中的其他10 組同類(lèi)元素,在操作提示框中,選擇“選中全部” 搜狗微信公眾號熱門(mén)文章如何采集圖7 優(yōu)采云云采集服務(wù)平臺 3)我們可以看見(jiàn),頁(yè)面中文章區塊里的所有元素均被選中,變?yōu)榧t色。右側操 作提示框中,出現數組預覽表,將滑鼠移到表頭,點(diǎn)擊垃圾桶圖標,可刪掉丌需 要的主鍵。
字段選擇完成后,選擇“采集以下數據” 搜狗微信公眾號熱門(mén)文章如何采集圖8 4)我們還想要采集每篇文章的URL,因而還須要提取一個(gè)主鍵。點(diǎn)擊第一篇文 章的鏈接,系統會(huì )自勱選中頁(yè)面中的一組文章鏈接。在左側操作提示框中,選擇 “選中全部” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖9 5)選擇“采集以下鏈接地址” 搜狗微信公眾號熱門(mén)文章如何采集圖10 優(yōu)采云云采集服務(wù)平臺 6)字段選擇完成后,選中相應的數組,可以迚行數組的自定義命名 搜狗微信公眾號熱門(mén)文章如何采集圖11 步驟4:修改Xpath 我們繼續觀(guān)察,通過(guò) 次點(diǎn)擊“加載更多內容”后,此網(wǎng)頁(yè)加載出全部100 文章。因而我們配置規則的思路是,先構建翻頁(yè)循環(huán),加載出全部100篇文章, 再完善循環(huán)列表,提取數據 1)選中整個(gè)“循環(huán)”步驟,將其拖出“循環(huán)翻頁(yè)”步驟。如果丌迚行此項操作, 那么將會(huì )出現好多重復數據 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖12 拖勱完成后,如下圖所示 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖13 2)在“列表循環(huán)”步驟中,我們構建100 篇文章的循環(huán)列表。選中整個(gè)“循環(huán) 步驟”,打開(kāi)“高級選項”,將丌固定元素列表中的這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,復制粘貼到火 狐瀏覽器中的相應位置 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖14 Xpath:是一種路徑查詢(xún)語(yǔ)言,簡(jiǎn)單的說(shuō)就是借助一個(gè)路徑表達式找到我們須要 的數據位置。
Xpath 是用于XML 中順著(zhù)路徑查找數據用的,但是優(yōu)采云采集器內部有一套針 對HTML 的Xpath 引擎,使得直接用XPATH能夠精準的查找定位網(wǎng)頁(yè)上面的 數據。 3)在火狐瀏覽器中,我們發(fā)覺(jué),通過(guò)這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,頁(yè)面中被定位 的是20 篇文章 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖15 4)將Xpath 修改為: //BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 我們發(fā)覺(jué)頁(yè)面中所有要采集的文章都被定位了 搜狗微信公眾號熱門(mén)文章如何采集圖16 優(yōu)采云云采集服務(wù)平臺 5)將改好的Xpath://BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 復制粘貼到圖片中所示的位置,然后點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖17 6)點(diǎn)擊左上角的“保存并啟勱”,選擇“啟勱本地采集” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖18 步驟5:數據采集及導入 1)采集完成后,會(huì )跳出提示,選擇“導出數據”,選擇“合適的導入方法”, 將采集好的搜狗陌陌文章的數據導入 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖19 2)這里我們選擇excel 作為導入為格式,數據導入后如下圖 搜狗微信公眾號熱門(mén)文章如何采集圖20 優(yōu)采云云采集服務(wù)平臺 優(yōu)采云——70 萬(wàn)用戶(hù)選擇的網(wǎng)頁(yè)數據采集器。
1、操作簡(jiǎn)單,任何人都可以用:無(wú)需技術(shù)背景,會(huì )上網(wǎng)才能采集。完全可視化 流程,點(diǎn)擊滑鼠完成操作,2 分鐘即可快速入門(mén)。 2、功能強悍,任何網(wǎng)站都可以采:對于點(diǎn)擊、登陸、翻頁(yè)、識別驗證碼、瀑布 流、Ajax 腳本異步加載數據的網(wǎng)頁(yè),均可經(jīng)過(guò)簡(jiǎn)單設置迚行采集。 3、云采集,關(guān)機也可以。配置好采集任務(wù)后可死機,任務(wù)可在云端執行。龐大 云采集集群24*7 丌間斷運行,丌用害怕IP 被封,網(wǎng)絡(luò )中斷。 4、功能免費+增值服務(wù),可按需選擇。免費版具備所有功能,能夠滿(mǎn)足用戶(hù)的 基本采集需求。同時(shí)設置了一些增值服務(wù)(如私有云),滿(mǎn)足低端付費企業(yè)用戶(hù) 的須要。 查看全部
優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集 本文介紹使用優(yōu)采云采集搜狗陌陌文章(以熱門(mén)文章為例)的方式 采集網(wǎng)站: 規則下載: 使用功能點(diǎn): 分頁(yè)列表信息采集 Xpath AJAX點(diǎn)擊和翻頁(yè) 相關(guān)采集教程: 天貓商品信息采集 百度搜索結果采集 步驟1:創(chuàng )建采集任務(wù) 1)迚入主界面,選擇“自定義模式” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖1 2)將要采集的網(wǎng)址URL 復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖2 步驟2:創(chuàng )建翻頁(yè)循環(huán) 1)在頁(yè)面右上角,打開(kāi)“流程”,以突顯出“流程設計器”和“定制當前操作” 兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載 更多內容”按鈕,在操作提示框中,選擇“更多操作” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖2 2)選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán) 搜狗微信公眾號熱門(mén)文章如何采集圖3 優(yōu)采云云采集服務(wù)平臺 因為此網(wǎng)頁(yè)涉及 Ajax 技術(shù),我們須要迚行一些中級選項的設置。選中“點(diǎn)擊元 素”步驟,打開(kāi)“高級選項”,勾選“Ajax 加載數據”,設置時(shí)間為“2 搜狗微信公眾號熱門(mén)文章如何采集圖4注:AJAX 即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺不服務(wù)器迚行少 量數據交換,可以在丌重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份迚行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址丌會(huì )改變;b、網(wǎng)頁(yè) 丌是完全加載,只是局部迚行了數據加載,有所變化。 驗證方法:點(diǎn)擊操作后,在瀏覽器中,網(wǎng)址輸入欄丌會(huì )出現加載中的狀態(tài)戒者轉 圈狀態(tài)。 優(yōu)采云云采集服務(wù)平臺 觀(guān)察網(wǎng)頁(yè),我們發(fā)覺(jué),通過(guò)5 次點(diǎn)擊“加載更多內容”,頁(yè)面加載到最頂部,一 共顯示100 篇文章。因此,我們設置整個(gè)“循環(huán)翻頁(yè)”步驟執行5 次。選中“循 環(huán)翻頁(yè)”步驟,打開(kāi)“高級選項”,打開(kāi)“滿(mǎn)足以下條件時(shí)退出循環(huán)”,設置循 環(huán)次數等于“5 次”,點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖5 步驟3:創(chuàng )建列表循環(huán)并提取數據 1)移勱鍵盤(pán),選中頁(yè)面里第一篇文章的區塊。系統會(huì )辨識此區塊中的子元素, 在操作提示框中,選擇“選中子元素” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖6 2)繼續選中頁(yè)面中第二篇文章的區塊,系統會(huì )自勱選中第二篇文章中的子元素, 并辨識出頁(yè)面中的其他10 組同類(lèi)元素,在操作提示框中,選擇“選中全部” 搜狗微信公眾號熱門(mén)文章如何采集圖7 優(yōu)采云云采集服務(wù)平臺 3)我們可以看見(jiàn),頁(yè)面中文章區塊里的所有元素均被選中,變?yōu)榧t色。右側操 作提示框中,出現數組預覽表,將滑鼠移到表頭,點(diǎn)擊垃圾桶圖標,可刪掉丌需 要的主鍵。
字段選擇完成后,選擇“采集以下數據” 搜狗微信公眾號熱門(mén)文章如何采集圖8 4)我們還想要采集每篇文章的URL,因而還須要提取一個(gè)主鍵。點(diǎn)擊第一篇文 章的鏈接,系統會(huì )自勱選中頁(yè)面中的一組文章鏈接。在左側操作提示框中,選擇 “選中全部” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖9 5)選擇“采集以下鏈接地址” 搜狗微信公眾號熱門(mén)文章如何采集圖10 優(yōu)采云云采集服務(wù)平臺 6)字段選擇完成后,選中相應的數組,可以迚行數組的自定義命名 搜狗微信公眾號熱門(mén)文章如何采集圖11 步驟4:修改Xpath 我們繼續觀(guān)察,通過(guò) 次點(diǎn)擊“加載更多內容”后,此網(wǎng)頁(yè)加載出全部100 文章。因而我們配置規則的思路是,先構建翻頁(yè)循環(huán),加載出全部100篇文章, 再完善循環(huán)列表,提取數據 1)選中整個(gè)“循環(huán)”步驟,將其拖出“循環(huán)翻頁(yè)”步驟。如果丌迚行此項操作, 那么將會(huì )出現好多重復數據 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖12 拖勱完成后,如下圖所示 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖13 2)在“列表循環(huán)”步驟中,我們構建100 篇文章的循環(huán)列表。選中整個(gè)“循環(huán) 步驟”,打開(kāi)“高級選項”,將丌固定元素列表中的這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,復制粘貼到火 狐瀏覽器中的相應位置 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖14 Xpath:是一種路徑查詢(xún)語(yǔ)言,簡(jiǎn)單的說(shuō)就是借助一個(gè)路徑表達式找到我們須要 的數據位置。
Xpath 是用于XML 中順著(zhù)路徑查找數據用的,但是優(yōu)采云采集器內部有一套針 對HTML 的Xpath 引擎,使得直接用XPATH能夠精準的查找定位網(wǎng)頁(yè)上面的 數據。 3)在火狐瀏覽器中,我們發(fā)覺(jué),通過(guò)這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,頁(yè)面中被定位 的是20 篇文章 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖15 4)將Xpath 修改為: //BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 我們發(fā)覺(jué)頁(yè)面中所有要采集的文章都被定位了 搜狗微信公眾號熱門(mén)文章如何采集圖16 優(yōu)采云云采集服務(wù)平臺 5)將改好的Xpath://BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 復制粘貼到圖片中所示的位置,然后點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖17 6)點(diǎn)擊左上角的“保存并啟勱”,選擇“啟勱本地采集” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖18 步驟5:數據采集及導入 1)采集完成后,會(huì )跳出提示,選擇“導出數據”,選擇“合適的導入方法”, 將采集好的搜狗陌陌文章的數據導入 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖19 2)這里我們選擇excel 作為導入為格式,數據導入后如下圖 搜狗微信公眾號熱門(mén)文章如何采集圖20 優(yōu)采云云采集服務(wù)平臺 優(yōu)采云——70 萬(wàn)用戶(hù)選擇的網(wǎng)頁(yè)數據采集器。
1、操作簡(jiǎn)單,任何人都可以用:無(wú)需技術(shù)背景,會(huì )上網(wǎng)才能采集。完全可視化 流程,點(diǎn)擊滑鼠完成操作,2 分鐘即可快速入門(mén)。 2、功能強悍,任何網(wǎng)站都可以采:對于點(diǎn)擊、登陸、翻頁(yè)、識別驗證碼、瀑布 流、Ajax 腳本異步加載數據的網(wǎng)頁(yè),均可經(jīng)過(guò)簡(jiǎn)單設置迚行采集。 3、云采集,關(guān)機也可以。配置好采集任務(wù)后可死機,任務(wù)可在云端執行。龐大 云采集集群24*7 丌間斷運行,丌用害怕IP 被封,網(wǎng)絡(luò )中斷。 4、功能免費+增值服務(wù),可按需選擇。免費版具備所有功能,能夠滿(mǎn)足用戶(hù)的 基本采集需求。同時(shí)設置了一些增值服務(wù)(如私有云),滿(mǎn)足低端付費企業(yè)用戶(hù) 的須要。
搜狗陌陌反爬蟲(chóng)機制剖析及應對方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 175 次瀏覽 ? 2020-08-10 04:50
下面是對探求過(guò)程的記錄。
首先參考了以下博客:
博主的探求過(guò)程,建議在他的博客中直接進(jìn)行查看,這里我關(guān)注的是他說(shuō)的關(guān)于Cookie的部份。
博主覺(jué)得懇求時(shí),SUID、SUV和SNUID最為重要,我在谷歌瀏覽器中看見(jiàn)以下Cookie
除了兩個(gè)SUID和SUV這三個(gè)Cookie,我對Cookie進(jìn)行了挨個(gè)剔除,并重新進(jìn)行查詢(xún),發(fā)現其他Cookie都是可以手動(dòng)生成的。而且不會(huì )報502,也不會(huì )觸發(fā)驗證碼頁(yè)面。
由于Java中使用Connection.headers(Map cookies)方法,會(huì )導致第一個(gè)SUID被第二個(gè)覆蓋掉(雖然我當時(shí)確實(shí)添加了兩個(gè)SUID),請求也是正常的,所以,我進(jìn)一步提不僅第一個(gè)SUID,發(fā)現刷新頁(yè)面,也沒(méi)有問(wèn)題。
紅框之外的Cookie就會(huì )手動(dòng)生成,也沒(méi)有觸發(fā)驗證碼。只有當我剔除SUV時(shí),才會(huì )觸發(fā)驗證碼機制,從而使輸入驗證碼:
所以,目前為止,需要帶上的Cookie只有SUV!
那么,SUV這個(gè)Cookie怎么獲取呢?
一般來(lái)說(shuō),通過(guò)懇求搜狗陌陌網(wǎng)站,然后獲取到Cookie,作為自己的Cookie使用,但是無(wú)疑會(huì )降低懇求。當時(shí)朋友有個(gè)大膽的看法,說(shuō)試試能不能直接傳一個(gè)32位字符串呢?也真是腦洞大開(kāi)!這里很自然地就想到了UUID,然后將UUID形成的32位字符串轉小寫(xiě)。
想著(zhù)搜狗陌陌不至于做的如此傻吧?但還是試了試,沒(méi)想到還真的通過(guò)了,而且懇求還比較穩定。
綜上,處理辦法是——在懇求搜狗陌陌時(shí),生成一個(gè)名為SUV的Cookie,請求時(shí)加上即可。
UUID的生成方式網(wǎng)上有很多,這里不再贅言,注意除去字符串中的短橫線(xiàn)!
祝你們好運!
參考博客: 查看全部
最近項目中,由于須要從微信公眾號中獲取一些文章內容,所以用到了搜狗陌陌。一旦搜索的次數稍為多一點(diǎn),就會(huì )觸發(fā)搜狗陌陌的反爬蟲(chóng)機制,最初是須要加上User-Agent懇求頭,后來(lái)是要求輸入驗證碼,現在輸入驗證碼以后,竟然時(shí)常都會(huì )報502,導致爬蟲(chóng)極不穩定。搜狗陌陌的反爬蟲(chóng)機制仍然在更新,特別是近來(lái)的一次更新,更使人一時(shí)半會(huì )兒摸不著(zhù)腦子,也是耗費了好一會(huì )兒時(shí)間進(jìn)行了突破。
下面是對探求過(guò)程的記錄。
首先參考了以下博客:
博主的探求過(guò)程,建議在他的博客中直接進(jìn)行查看,這里我關(guān)注的是他說(shuō)的關(guān)于Cookie的部份。
博主覺(jué)得懇求時(shí),SUID、SUV和SNUID最為重要,我在谷歌瀏覽器中看見(jiàn)以下Cookie

除了兩個(gè)SUID和SUV這三個(gè)Cookie,我對Cookie進(jìn)行了挨個(gè)剔除,并重新進(jìn)行查詢(xún),發(fā)現其他Cookie都是可以手動(dòng)生成的。而且不會(huì )報502,也不會(huì )觸發(fā)驗證碼頁(yè)面。
由于Java中使用Connection.headers(Map cookies)方法,會(huì )導致第一個(gè)SUID被第二個(gè)覆蓋掉(雖然我當時(shí)確實(shí)添加了兩個(gè)SUID),請求也是正常的,所以,我進(jìn)一步提不僅第一個(gè)SUID,發(fā)現刷新頁(yè)面,也沒(méi)有問(wèn)題。

紅框之外的Cookie就會(huì )手動(dòng)生成,也沒(méi)有觸發(fā)驗證碼。只有當我剔除SUV時(shí),才會(huì )觸發(fā)驗證碼機制,從而使輸入驗證碼:

所以,目前為止,需要帶上的Cookie只有SUV!
那么,SUV這個(gè)Cookie怎么獲取呢?
一般來(lái)說(shuō),通過(guò)懇求搜狗陌陌網(wǎng)站,然后獲取到Cookie,作為自己的Cookie使用,但是無(wú)疑會(huì )降低懇求。當時(shí)朋友有個(gè)大膽的看法,說(shuō)試試能不能直接傳一個(gè)32位字符串呢?也真是腦洞大開(kāi)!這里很自然地就想到了UUID,然后將UUID形成的32位字符串轉小寫(xiě)。
想著(zhù)搜狗陌陌不至于做的如此傻吧?但還是試了試,沒(méi)想到還真的通過(guò)了,而且懇求還比較穩定。
綜上,處理辦法是——在懇求搜狗陌陌時(shí),生成一個(gè)名為SUV的Cookie,請求時(shí)加上即可。
UUID的生成方式網(wǎng)上有很多,這里不再贅言,注意除去字符串中的短橫線(xiàn)!
祝你們好運!
參考博客:
記一次批量定時(shí)抓取微信公眾號文章的實(shí)現
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2020-08-09 15:40
抓取前的說(shuō)明和打算
本次抓取的選擇的語(yǔ)言是java,本文章不會(huì )將整個(gè)工程的全部代碼全部貼出,只會(huì )提供核心代碼和抓取思路的說(shuō)明。
數據的抓取
抓取文章的來(lái)源為搜狗陌陌網(wǎng)站,網(wǎng)站如下圖。
抓取的思路如下
一般抓取微信公眾號的文章都是以微信公眾號的id為關(guān)鍵字 ,我們可以通過(guò)url+ keyword的方式直接跳轉到想要抓取公眾號頁(yè)面,keyword即為想要搜索微信公眾號的名稱(chēng)或則是id;
// 搜狗微信搜索鏈接入口
String sogou_search_url = "http://weixin.sogou.com/weixin ... ot%3B
+ keyword + "&ie=utf8&s_from=input&_sug_=n&_sug_type_=";
為了防止網(wǎng)站對爬蟲(chóng)的初步攔截,我們可以使用Selenium (瀏覽器自動(dòng)化測試框架)來(lái)偽裝自己的爬蟲(chóng),我們使用的chrome,這里須要注意自己的chrome版本與使用的webdriver的版本是對應的;
ChromeOptions chromeOptions = new ChromeOptions();
// 全屏,為了接下來(lái)防抓取做準備
chromeOptions.addArguments("--start-maximized");
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver webDriver = new ChromeDriver(chromeOptions);
到達微信公眾號列表頁(yè)面,如下圖,獲取微信公眾號鏈接。
<p> // 獲取當前頁(yè)面的微信公眾號列表
List weixin_list = webDriver
.findElements(By.cssSelector("div[class='txt-box']"));
// 獲取進(jìn)入公眾號的鏈接
String weixin_url = "";
for (int i = 0; i 查看全部
記一次批量定時(shí)抓取微信公眾號文章的實(shí)現
抓取前的說(shuō)明和打算
本次抓取的選擇的語(yǔ)言是java,本文章不會(huì )將整個(gè)工程的全部代碼全部貼出,只會(huì )提供核心代碼和抓取思路的說(shuō)明。
數據的抓取
抓取文章的來(lái)源為搜狗陌陌網(wǎng)站,網(wǎng)站如下圖。

抓取的思路如下
一般抓取微信公眾號的文章都是以微信公眾號的id為關(guān)鍵字 ,我們可以通過(guò)url+ keyword的方式直接跳轉到想要抓取公眾號頁(yè)面,keyword即為想要搜索微信公眾號的名稱(chēng)或則是id;
// 搜狗微信搜索鏈接入口
String sogou_search_url = "http://weixin.sogou.com/weixin ... ot%3B
+ keyword + "&ie=utf8&s_from=input&_sug_=n&_sug_type_=";
為了防止網(wǎng)站對爬蟲(chóng)的初步攔截,我們可以使用Selenium (瀏覽器自動(dòng)化測試框架)來(lái)偽裝自己的爬蟲(chóng),我們使用的chrome,這里須要注意自己的chrome版本與使用的webdriver的版本是對應的;
ChromeOptions chromeOptions = new ChromeOptions();
// 全屏,為了接下來(lái)防抓取做準備
chromeOptions.addArguments("--start-maximized");
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver webDriver = new ChromeDriver(chromeOptions);
到達微信公眾號列表頁(yè)面,如下圖,獲取微信公眾號鏈接。

<p> // 獲取當前頁(yè)面的微信公眾號列表
List weixin_list = webDriver
.findElements(By.cssSelector("div[class='txt-box']"));
// 獲取進(jìn)入公眾號的鏈接
String weixin_url = "";
for (int i = 0; i
建立微信公眾號測試帳號-Java本地服務(wù)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 166 次瀏覽 ? 2020-08-09 03:56
這是第一個(gè)坑. 在測試編號中,您可以填寫(xiě)域名ip,甚至不需要填寫(xiě)域名,這極大地方便了測試授權的使用. 回調頁(yè)面表示微信用戶(hù)關(guān)注您的官方賬號. 當他選擇授權登錄時(shí),我們可以調用微信界面來(lái)獲取他的基本微信信息,例如唯一的微信openid,然后返回到我們的頁(yè)面之一,或者這是用于采集用戶(hù)信息的服務(wù). 頁(yè)面或服務(wù)必須在此域名下. 假設我填寫(xiě)了
例如,如果我想返回頁(yè)面,它可以是:
,
返回服務(wù):
只要在此域名下,無(wú)論嵌入多少層. 請注意,不能在前面添加https或http前綴.
在回調域名中,如果您的項目名稱(chēng)由下劃線(xiàn)組成,
例如,要訪(fǎng)問(wèn)您的項目,請刪除帶下劃線(xiàn)的項目名稱(chēng). 盡管刪除的項目名稱(chēng)只能映射回本地啟動(dòng)服務(wù)器,而不是映射回項目,但這不會(huì )造成傷害.
好的,這里很多人說(shuō),如果沒(méi)有域名,我該怎么辦,那是第二種材料,一個(gè)可以映射到Intranet的域名.
我使用的花生殼域名.
新用戶(hù)可以獲得幾個(gè)免費域名,他們也可以使用這些域名,但是對于我來(lái)說(shuō),測試并購買(mǎi)100個(gè)大洋的.com域名非常方便.
然后通過(guò)花生殼內部網(wǎng)下載客戶(hù)端
您擁有的域名將顯示在這里,包括您發(fā)送的域名.
隨意編寫(xiě)應用程序名稱(chēng),域名是下屬之一,映射是HTTP80. 內部主機不知道您可以打開(kāi)cmd ip config / all來(lái)查看您的地址. 我的項目從tomact開(kāi)始,使用默認端口8080. 最后,進(jìn)行診斷并在地址欄中鍵入Internet域名,以確保其他人可以訪(fǎng)問(wèn)您的本地項目.
到目前為止,第二種材料已經(jīng)準備好了.
第三個(gè)是可以運行的項目...這里將不討論. 您可以使用springboot + myb,springMVC,struts2來(lái)構建可以運行的項目. 如果沒(méi)有,請搜索其他博客以快速建立一個(gè)博客,至少您可以輸入一個(gè)servelet. 我只是直接運行公司的項目.
連接授權界面
首先編寫(xiě)一個(gè)鏈接: APPID&redirect_uri = l&response_type = code&scope = snsapi_base&state = 123#wechat_redirect
此鏈接已發(fā)送至微信,表明我要開(kāi)始??看私缑?br /> appid: 是測試編號上的appid
redirect_uri: 我們剛剛在上面填寫(xiě)了,因此這里是在該域名下填寫(xiě)一個(gè)HTML以供回調. 必須添加或在這里,必須!
scope: 這是指要調用的微信界面,snsapi_base是指用戶(hù)的靜默授權,這是用戶(hù)執行微信授權而沒(méi)有彈出框提示是否進(jìn)行授權的情況,因此該界面獲取的信息較少,您可以查看詳細信息官方技術(shù)文檔.
狀態(tài): 填寫(xiě)您想要的任何內容.
我下載了官方的微信調試工具. 如果您按照上述步驟進(jìn)行操作,則您的鏈接將不會(huì )出現代碼錯誤,redirect_uri和其他錯誤.
如您所見(jiàn),在返回的頁(yè)面上,后綴附有代碼. 該代碼將被發(fā)送到微信以交換剛剛登錄的用戶(hù)的信息. 當然,您可以對上述授權鏈接進(jìn)行異步請求,并使用js在頁(yè)面上獲取它. 我是這樣子的
函數GetQueryString(name)
{
var reg = new RegExp(“(^ |&)” + name +“ =([^&] *)(&| $)”);
var r = window.location.search.substr(1).match(reg);
if(r!= null)返回unescape(r [2]);返回null;
}
調用GetQueryString(code)獲取地址的參數值.
獲取后,將其發(fā)送到后臺進(jìn)行處理. 有很多提交方法. 異步也是可能的,或者將整個(gè)表單直接連接到其他值并提交到后臺. 根仍然由后臺處理.
僅使用老式的struts2粘貼密鑰代碼,因此返回String映射以返回到頁(yè)面,如果您是springMVC控制器,請自行更改
public String juvenileSubsidy() {
//如果是第二次驗證登錄則直接發(fā)送微信的opendid
String openId =getOpenId();
.......//省略各種去到信息以后的service
return "login_jsp";
}
........
private String getOpenId(){
//appid和secret是測試公眾號上的,自行填寫(xiě),別直接copy,
//code是剛剛獲取到的,自行改寫(xiě)參數
String url="https://api.weixin.qq.com/sns/oa"
+ "uth2/access_token?appid="+wxappid+"&"
+ "secret="+appsecret+"&code="+wxcode+""
+ "&grant_type=authorization_code";
String openId="";
try {
URL getUrl=new URL(url);
HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] b = new byte[size];
is.read(b);
String message = new String(b, "UTF-8");
JSONObject json = JSONObject.parseObject(message);
openId=json.get("openid").toString();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return openId;
}
當然,許多博客文章都是關(guān)于如何封裝地址參數名稱(chēng)的,以便以后可以調用. 一開(kāi)始,我寫(xiě)得很粗糙以顯示效果. 您可以在將來(lái)輕松封裝它,甚至可以使用xml讀取配置信息. 我的私有方法只是返回我需要的String openid. 您可以選擇返回對象,或檢查正式文檔,更改原創(chuàng )范圍,非靜默授權可以獲取更多用戶(hù)信息.
接下來(lái)是調試觀(guān)察.
{"access_token":"15_0D9_XTsx2YdwoD5KPd6WHAEc47xLqy4uuQAb06irOd5UgOnzwW3zPRdhMXinpJ7ucvkW3D7coema7QAdA",
"expires_in":7200,
"refresh_token":"15_cz_GGe-k41d_YVVgmrFvQBUvF_LuyuNSB2PTq8YWXHLz0l7Vg8hJnBWjGFMNhTT2NRFqqRYT5gSofww",
"openid":"o-MN1B0FGR1JV398vbSPNZ70xa424",
"scope":"snsapi_base"}
以上是成功發(fā)送到微信界面的json對象. 我叫snsapi_base,所以我只能返回此信息. 這些令牌每次都會(huì )刷新,并且這些密鑰也被微信用于驗證服務(wù)器的重要數據,但是在這里它們是無(wú)用的. 我得到了所需的openid.
通過(guò)這種方式,獲得了微信登錄官方賬號上唯一識別的ID,并可以通過(guò)該ID實(shí)現業(yè)務(wù)邏輯. 同時(shí),可以在本地測試官方帳戶(hù)服務(wù).
對于本文開(kāi)頭提到的接口配置信息,此處不需要使用它. 這要求后端發(fā)送令牌進(jìn)行驗證.
最后,您可以將此嬰兒鏈接放在官方帳戶(hù)的自定義菜單中. 這就是所謂的用戶(hù)登錄授權.
當然,這是測試帳戶(hù)授權. 正式啟動(dòng)后,它將替換為注冊域名,appid被替換為官方官方帳戶(hù)的ID,其余部分保持不變.
到目前為止,官方帳戶(hù)的靜默授權已完成! 查看全部
這里的重點(diǎn)是頁(yè)面授權回調的域名.


這是第一個(gè)坑. 在測試編號中,您可以填寫(xiě)域名ip,甚至不需要填寫(xiě)域名,這極大地方便了測試授權的使用. 回調頁(yè)面表示微信用戶(hù)關(guān)注您的官方賬號. 當他選擇授權登錄時(shí),我們可以調用微信界面來(lái)獲取他的基本微信信息,例如唯一的微信openid,然后返回到我們的頁(yè)面之一,或者這是用于采集用戶(hù)信息的服務(wù). 頁(yè)面或服務(wù)必須在此域名下. 假設我填寫(xiě)了
例如,如果我想返回頁(yè)面,它可以是:
,
返回服務(wù):
只要在此域名下,無(wú)論嵌入多少層. 請注意,不能在前面添加https或http前綴.
在回調域名中,如果您的項目名稱(chēng)由下劃線(xiàn)組成,
例如,要訪(fǎng)問(wèn)您的項目,請刪除帶下劃線(xiàn)的項目名稱(chēng). 盡管刪除的項目名稱(chēng)只能映射回本地啟動(dòng)服務(wù)器,而不是映射回項目,但這不會(huì )造成傷害.
好的,這里很多人說(shuō),如果沒(méi)有域名,我該怎么辦,那是第二種材料,一個(gè)可以映射到Intranet的域名.
我使用的花生殼域名.



新用戶(hù)可以獲得幾個(gè)免費域名,他們也可以使用這些域名,但是對于我來(lái)說(shuō),測試并購買(mǎi)100個(gè)大洋的.com域名非常方便.
然后通過(guò)花生殼內部網(wǎng)下載客戶(hù)端



您擁有的域名將顯示在這里,包括您發(fā)送的域名.


隨意編寫(xiě)應用程序名稱(chēng),域名是下屬之一,映射是HTTP80. 內部主機不知道您可以打開(kāi)cmd ip config / all來(lái)查看您的地址. 我的項目從tomact開(kāi)始,使用默認端口8080. 最后,進(jìn)行診斷并在地址欄中鍵入Internet域名,以確保其他人可以訪(fǎng)問(wèn)您的本地項目.

到目前為止,第二種材料已經(jīng)準備好了.
第三個(gè)是可以運行的項目...這里將不討論. 您可以使用springboot + myb,springMVC,struts2來(lái)構建可以運行的項目. 如果沒(méi)有,請搜索其他博客以快速建立一個(gè)博客,至少您可以輸入一個(gè)servelet. 我只是直接運行公司的項目.
連接授權界面
首先編寫(xiě)一個(gè)鏈接: APPID&redirect_uri = l&response_type = code&scope = snsapi_base&state = 123#wechat_redirect
此鏈接已發(fā)送至微信,表明我要開(kāi)始??看私缑?br /> appid: 是測試編號上的appid
redirect_uri: 我們剛剛在上面填寫(xiě)了,因此這里是在該域名下填寫(xiě)一個(gè)HTML以供回調. 必須添加或在這里,必須!
scope: 這是指要調用的微信界面,snsapi_base是指用戶(hù)的靜默授權,這是用戶(hù)執行微信授權而沒(méi)有彈出框提示是否進(jìn)行授權的情況,因此該界面獲取的信息較少,您可以查看詳細信息官方技術(shù)文檔.
狀態(tài): 填寫(xiě)您想要的任何內容.
我下載了官方的微信調試工具. 如果您按照上述步驟進(jìn)行操作,則您的鏈接將不會(huì )出現代碼錯誤,redirect_uri和其他錯誤.

如您所見(jiàn),在返回的頁(yè)面上,后綴附有代碼. 該代碼將被發(fā)送到微信以交換剛剛登錄的用戶(hù)的信息. 當然,您可以對上述授權鏈接進(jìn)行異步請求,并使用js在頁(yè)面上獲取它. 我是這樣子的
函數GetQueryString(name)
{
var reg = new RegExp(“(^ |&)” + name +“ =([^&] *)(&| $)”);
var r = window.location.search.substr(1).match(reg);
if(r!= null)返回unescape(r [2]);返回null;
}
調用GetQueryString(code)獲取地址的參數值.
獲取后,將其發(fā)送到后臺進(jìn)行處理. 有很多提交方法. 異步也是可能的,或者將整個(gè)表單直接連接到其他值并提交到后臺. 根仍然由后臺處理.
僅使用老式的struts2粘貼密鑰代碼,因此返回String映射以返回到頁(yè)面,如果您是springMVC控制器,請自行更改
public String juvenileSubsidy() {
//如果是第二次驗證登錄則直接發(fā)送微信的opendid
String openId =getOpenId();
.......//省略各種去到信息以后的service
return "login_jsp";
}
........
private String getOpenId(){
//appid和secret是測試公眾號上的,自行填寫(xiě),別直接copy,
//code是剛剛獲取到的,自行改寫(xiě)參數
String url="https://api.weixin.qq.com/sns/oa"
+ "uth2/access_token?appid="+wxappid+"&"
+ "secret="+appsecret+"&code="+wxcode+""
+ "&grant_type=authorization_code";
String openId="";
try {
URL getUrl=new URL(url);
HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] b = new byte[size];
is.read(b);
String message = new String(b, "UTF-8");
JSONObject json = JSONObject.parseObject(message);
openId=json.get("openid").toString();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return openId;
}
當然,許多博客文章都是關(guān)于如何封裝地址參數名稱(chēng)的,以便以后可以調用. 一開(kāi)始,我寫(xiě)得很粗糙以顯示效果. 您可以在將來(lái)輕松封裝它,甚至可以使用xml讀取配置信息. 我的私有方法只是返回我需要的String openid. 您可以選擇返回對象,或檢查正式文檔,更改原創(chuàng )范圍,非靜默授權可以獲取更多用戶(hù)信息.
接下來(lái)是調試觀(guān)察.

{"access_token":"15_0D9_XTsx2YdwoD5KPd6WHAEc47xLqy4uuQAb06irOd5UgOnzwW3zPRdhMXinpJ7ucvkW3D7coema7QAdA",
"expires_in":7200,
"refresh_token":"15_cz_GGe-k41d_YVVgmrFvQBUvF_LuyuNSB2PTq8YWXHLz0l7Vg8hJnBWjGFMNhTT2NRFqqRYT5gSofww",
"openid":"o-MN1B0FGR1JV398vbSPNZ70xa424",
"scope":"snsapi_base"}
以上是成功發(fā)送到微信界面的json對象. 我叫snsapi_base,所以我只能返回此信息. 這些令牌每次都會(huì )刷新,并且這些密鑰也被微信用于驗證服務(wù)器的重要數據,但是在這里它們是無(wú)用的. 我得到了所需的openid.
通過(guò)這種方式,獲得了微信登錄官方賬號上唯一識別的ID,并可以通過(guò)該ID實(shí)現業(yè)務(wù)邏輯. 同時(shí),可以在本地測試官方帳戶(hù)服務(wù).
對于本文開(kāi)頭提到的接口配置信息,此處不需要使用它. 這要求后端發(fā)送令牌進(jìn)行驗證.
最后,您可以將此嬰兒鏈接放在官方帳戶(hù)的自定義菜單中. 這就是所謂的用戶(hù)登錄授權.

當然,這是測試帳戶(hù)授權. 正式啟動(dòng)后,它將替換為注冊域名,appid被替換為官方官方帳戶(hù)的ID,其余部分保持不變.
到目前為止,官方帳戶(hù)的靜默授權已完成!
微信抓取過(guò)程中的參數分析
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2020-08-08 17:17
mid是圖形消息的ID
idx是發(fā)布的頭幾條消息(1表示標題位置消息)
sn是一個(gè)隨機加密的字符串(對于圖形消息來(lái)說(shuō)是唯一的,如果您想詢(xún)問(wèn)此sn的生成規則是什么或如何破解它,您基本上只能從微信公眾平臺開(kāi)發(fā)中獲得答案. 團隊)變相煮
三: 偽裝微信客戶(hù)端登錄并獲取歷史信息頁(yè)面. 4個(gè)最重要的參數是: __biz; uin =; key =; pass_ticket =;這四個(gè)參數. [有時(shí)需要手機]
四: 獲得general_msg_list后,分析每個(gè)字段
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "摘要",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""摘要"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
五: 獲取程序的原型
創(chuàng )建表格:
1. 微信公眾號列表
CREATE TABLE `weixin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) DEFAULT '' COMMENT '公眾號唯一標識biz',
`collect` int(11) DEFAULT '1' COMMENT '記錄采集時(shí)間的時(shí)間戳',
PRIMARY KEY (`id`)
) ;
2,微信文章列表
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '文章對應的公眾號biz',
`field_id` int(11) NOT NULL COMMENT '微信定義的一個(gè)id,每條文章唯一',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章標題',
`title_encode` text CHARACTER SET utf8 NOT NULL COMMENT '文章編碼,防止文章出現emoji',
`digest` varchar(500) NOT NULL DEFAULT '' COMMENT '文章摘要',
`content_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '文章地址',
`source_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '閱讀原文地址',
`cover` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '封面圖片',
`is_multi` int(11) NOT NULL COMMENT '是否多圖文',
`is_top` int(11) NOT NULL COMMENT '是否頭條',
`datetime` int(11) NOT NULL COMMENT '文章時(shí)間戳',
`readNum` int(11) NOT NULL DEFAULT '1' COMMENT '文章閱讀量',
`likeNum` int(11) NOT NULL DEFAULT '0' COMMENT '文章點(diǎn)贊量',
PRIMARY KEY (`id`)
) ;
3. 采集團隊名單
CREATE TABLE `tmplist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`content_url` varchar(255) DEFAULT NULL COMMENT '文章地址',
`load` int(11) DEFAULT '0' COMMENT '讀取中標記',
PRIMARY KEY (`id`),
UNIQUE KEY `content_url` (`content_url`)
) ;
采集:
1,getMsgJson.php: 該程序負責接收已解析并存儲在數據庫中的歷史消息的json
<p> 查看全部
__ biz可被視為在微信公眾平臺上公開(kāi)宣布的公共賬戶(hù)的唯一ID
mid是圖形消息的ID
idx是發(fā)布的頭幾條消息(1表示標題位置消息)
sn是一個(gè)隨機加密的字符串(對于圖形消息來(lái)說(shuō)是唯一的,如果您想詢(xún)問(wèn)此sn的生成規則是什么或如何破解它,您基本上只能從微信公眾平臺開(kāi)發(fā)中獲得答案. 團隊)變相煮
三: 偽裝微信客戶(hù)端登錄并獲取歷史信息頁(yè)面. 4個(gè)最重要的參數是: __biz; uin =; key =; pass_ticket =;這四個(gè)參數. [有時(shí)需要手機]
四: 獲得general_msg_list后,分析每個(gè)字段
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "摘要",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""摘要"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
五: 獲取程序的原型
創(chuàng )建表格:
1. 微信公眾號列表
CREATE TABLE `weixin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) DEFAULT '' COMMENT '公眾號唯一標識biz',
`collect` int(11) DEFAULT '1' COMMENT '記錄采集時(shí)間的時(shí)間戳',
PRIMARY KEY (`id`)
) ;
2,微信文章列表
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '文章對應的公眾號biz',
`field_id` int(11) NOT NULL COMMENT '微信定義的一個(gè)id,每條文章唯一',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章標題',
`title_encode` text CHARACTER SET utf8 NOT NULL COMMENT '文章編碼,防止文章出現emoji',
`digest` varchar(500) NOT NULL DEFAULT '' COMMENT '文章摘要',
`content_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '文章地址',
`source_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '閱讀原文地址',
`cover` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '封面圖片',
`is_multi` int(11) NOT NULL COMMENT '是否多圖文',
`is_top` int(11) NOT NULL COMMENT '是否頭條',
`datetime` int(11) NOT NULL COMMENT '文章時(shí)間戳',
`readNum` int(11) NOT NULL DEFAULT '1' COMMENT '文章閱讀量',
`likeNum` int(11) NOT NULL DEFAULT '0' COMMENT '文章點(diǎn)贊量',
PRIMARY KEY (`id`)
) ;
3. 采集團隊名單
CREATE TABLE `tmplist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`content_url` varchar(255) DEFAULT NULL COMMENT '文章地址',
`load` int(11) DEFAULT '0' COMMENT '讀取中標記',
PRIMARY KEY (`id`),
UNIQUE KEY `content_url` (`content_url`)
) ;
采集:
1,getMsgJson.php: 該程序負責接收已解析并存儲在數據庫中的歷史消息的json
<p>
通過(guò)微信公眾平臺獲取官方帳戶(hù)文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 186 次瀏覽 ? 2020-08-08 10:12
選擇自己創(chuàng )建的圖形:
好像是公共帳戶(hù)操作教學(xué)
進(jìn)入編輯頁(yè)面后,單擊超鏈接
彈出一個(gè)選擇框,我們在框中輸入相應的正式帳戶(hù)名稱(chēng),并出現相應的商品列表
您感到驚訝嗎?您可以打開(kāi)控制臺并檢查請求的界面
打開(kāi)回復,有我們需要的文章鏈接
確認數據后,我們需要分析此界面.
感覺(jué)很簡(jiǎn)單. GET請求帶有一些參數.
Fakeid是官方帳戶(hù)的唯一ID,因此,如果要直接按名稱(chēng)獲取商品列表,則需要先獲取偽造品.
當我們輸入官方帳戶(hù)名時(shí),單擊“搜索”. 您會(huì )看到搜索界面已觸發(fā),并返回了偽造品.
此界面不需要很多參數.
接下來(lái),我們可以使用代碼來(lái)模擬上述操作.
但是您還需要使用現有的cookie以避免登錄.
目前,我尚未測試過(guò)cookie的有效期. 可能需要及時(shí)更新cookie.
測試代碼:
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
通過(guò)這種方式,您可以獲得最新的10篇文章. 如果要獲取更多歷史文章,可以修改數據中的“ begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(依此類(lèi)推)
但是,如果您想進(jìn)行大規模爬網(wǎng):
請為您自己安排穩定的代理商,降低爬蟲(chóng)速度,并準備多個(gè)帳戶(hù)以減少被阻止的可能性. 查看全部

選擇自己創(chuàng )建的圖形:

好像是公共帳戶(hù)操作教學(xué)
進(jìn)入編輯頁(yè)面后,單擊超鏈接

彈出一個(gè)選擇框,我們在框中輸入相應的正式帳戶(hù)名稱(chēng),并出現相應的商品列表

您感到驚訝嗎?您可以打開(kāi)控制臺并檢查請求的界面

打開(kāi)回復,有我們需要的文章鏈接

確認數據后,我們需要分析此界面.
感覺(jué)很簡(jiǎn)單. GET請求帶有一些參數.

Fakeid是官方帳戶(hù)的唯一ID,因此,如果要直接按名稱(chēng)獲取商品列表,則需要先獲取偽造品.
當我們輸入官方帳戶(hù)名時(shí),單擊“搜索”. 您會(huì )看到搜索界面已觸發(fā),并返回了偽造品.

此界面不需要很多參數.

接下來(lái),我們可以使用代碼來(lái)模擬上述操作.
但是您還需要使用現有的cookie以避免登錄.

目前,我尚未測試過(guò)cookie的有效期. 可能需要及時(shí)更新cookie.
測試代碼:
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
通過(guò)這種方式,您可以獲得最新的10篇文章. 如果要獲取更多歷史文章,可以修改數據中的“ begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(依此類(lèi)推)
但是,如果您想進(jìn)行大規模爬網(wǎng):
請為您自己安排穩定的代理商,降低爬蟲(chóng)速度,并準備多個(gè)帳戶(hù)以減少被阻止的可能性.
java微信公眾號第三方接入解析及全網(wǎng)檢查代碼示例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 172 次瀏覽 ? 2020-08-22 12:10
一、接入大體思路解析
這里主要是查看文檔的授權流程技術(shù)說(shuō)明,這里從開(kāi)發(fā)者角度介紹。
接入第三方的開(kāi)發(fā)者想必早已對公眾號開(kāi)發(fā)比較了解,第三方是代微信號實(shí)現功能的一個(gè)組件,所以其實(shí)陌陌方的開(kāi)發(fā)們也是這么考慮,為第三方的access_token起名為component_access_token。
1、首先獲取第三方
component_access_token
這個(gè)過(guò)程中會(huì )使用到陌陌服務(wù)器定期向我們服務(wù)器推送的component_verify_ticket數組,加上component_appid、component_appsecret等信息即可獲得。
2、獲取授權公眾號信息
類(lèi)似公眾號網(wǎng)頁(yè)授權,通過(guò)反彈的方式,微信公眾號運營(yíng)者可以通過(guò)陌陌掃碼的方式將公眾號授權給第三方,唯一有些不同的這兒在拼出授權跳轉頁(yè)面url后的第一步是引導用戶(hù)跳轉到該頁(yè)面上,再進(jìn)行掃碼,所以這個(gè)跳轉不是必須在陌陌外置瀏覽器中進(jìn)行。
拼出的url中的參數出了要用到component_access_token外還須要一個(gè)pre_auth_code預授權碼,可通過(guò)component_access_token獲得,具體的實(shí)效時(shí)間機制和component_access_token差不多。
用戶(hù)授權成功后會(huì )在redirect_url后接參數auth_code,類(lèi)似公眾號網(wǎng)頁(yè)授權的code值,通過(guò)auth_code和component_access_token等信息即可獲得該授權公眾號信息,若中間要與公眾號第三方平臺的帳號綁定再帶一個(gè)帳號標識參數即可。
3、帶公眾號實(shí)現業(yè)務(wù)
公眾號授權成功后第三方會(huì )得到該公眾號的authorizer_access_token,與公眾號的access_token功能相同,使用這個(gè)即可用微信公眾號的插口代公眾號實(shí)現業(yè)務(wù)。
有些不同的再第三方文檔里以有說(shuō)明。官方文檔
另外文檔上沒(méi)有提及的是,每當有公眾號授權成功后,微信服務(wù)器會(huì )將公眾號授權信息推送到授權風(fēng)波接收URL,即接收component_verify_ticket的插口。
4、關(guān)于加密揭秘
獲取陌陌服務(wù)器推送信息的時(shí)侯都是進(jìn)行加密的。
二、接入中發(fā)覺(jué)的幾個(gè)問(wèn)題1、微信的示例java代碼,XMLParse類(lèi)中
/**
* 提取出xml數據包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public static Object[] extract(String xmltext) throws AesException {
Object[] result = new Object[3];
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
NodeList nodelist1 = root.getElementsByTagName("Encrypt");
NodeList nodelist2 = root.getElementsByTagName("ToUserName");
System.out.println("nodelist2.item(0)="+nodelist2.item(0));
result[0] = 0;
result[1] = nodelist1.item(0).getTextContent();
//這里加了一個(gè)判斷,因為接收推送component_verify_ticket的解謎過(guò)程中沒(méi)有第三個(gè)參數,回報空指針異常
if(nodelist2.item(0) != null){
result[2] = nodelist2.item(0).getTextContent();
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.ParseXmlError);
}
}
2、文檔中:使用授權碼換取公眾號的插口調用憑據和授權信息
返回json信息最后少了一個(gè)}
{
"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77",
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM",
"expires_in": 7200,
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY",
"func_info": [
{
"funcscope_category": {
"id": 1
}
},
{
"funcscope_category": {
"id": 2
}
},
{
"funcscope_category": {
"id": 3
}
}
]
}
}
大家開(kāi)發(fā)時(shí)要注意json數據結構
三、關(guān)于代碼
在 微信公眾帳號第三方平臺全網(wǎng)發(fā)布源碼(java)- 實(shí)戰測試通過(guò) 代碼結構基礎上進(jìn)行更改 查看全部
java微信公眾號第三方接入解析及全網(wǎng)監測代碼示例
一、接入大體思路解析
這里主要是查看文檔的授權流程技術(shù)說(shuō)明,這里從開(kāi)發(fā)者角度介紹。
接入第三方的開(kāi)發(fā)者想必早已對公眾號開(kāi)發(fā)比較了解,第三方是代微信號實(shí)現功能的一個(gè)組件,所以其實(shí)陌陌方的開(kāi)發(fā)們也是這么考慮,為第三方的access_token起名為component_access_token。
1、首先獲取第三方
component_access_token
這個(gè)過(guò)程中會(huì )使用到陌陌服務(wù)器定期向我們服務(wù)器推送的component_verify_ticket數組,加上component_appid、component_appsecret等信息即可獲得。
2、獲取授權公眾號信息
類(lèi)似公眾號網(wǎng)頁(yè)授權,通過(guò)反彈的方式,微信公眾號運營(yíng)者可以通過(guò)陌陌掃碼的方式將公眾號授權給第三方,唯一有些不同的這兒在拼出授權跳轉頁(yè)面url后的第一步是引導用戶(hù)跳轉到該頁(yè)面上,再進(jìn)行掃碼,所以這個(gè)跳轉不是必須在陌陌外置瀏覽器中進(jìn)行。
拼出的url中的參數出了要用到component_access_token外還須要一個(gè)pre_auth_code預授權碼,可通過(guò)component_access_token獲得,具體的實(shí)效時(shí)間機制和component_access_token差不多。
用戶(hù)授權成功后會(huì )在redirect_url后接參數auth_code,類(lèi)似公眾號網(wǎng)頁(yè)授權的code值,通過(guò)auth_code和component_access_token等信息即可獲得該授權公眾號信息,若中間要與公眾號第三方平臺的帳號綁定再帶一個(gè)帳號標識參數即可。
3、帶公眾號實(shí)現業(yè)務(wù)
公眾號授權成功后第三方會(huì )得到該公眾號的authorizer_access_token,與公眾號的access_token功能相同,使用這個(gè)即可用微信公眾號的插口代公眾號實(shí)現業(yè)務(wù)。
有些不同的再第三方文檔里以有說(shuō)明。官方文檔
另外文檔上沒(méi)有提及的是,每當有公眾號授權成功后,微信服務(wù)器會(huì )將公眾號授權信息推送到授權風(fēng)波接收URL,即接收component_verify_ticket的插口。
4、關(guān)于加密揭秘
獲取陌陌服務(wù)器推送信息的時(shí)侯都是進(jìn)行加密的。
二、接入中發(fā)覺(jué)的幾個(gè)問(wèn)題1、微信的示例java代碼,XMLParse類(lèi)中
/**
* 提取出xml數據包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public static Object[] extract(String xmltext) throws AesException {
Object[] result = new Object[3];
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
NodeList nodelist1 = root.getElementsByTagName("Encrypt");
NodeList nodelist2 = root.getElementsByTagName("ToUserName");
System.out.println("nodelist2.item(0)="+nodelist2.item(0));
result[0] = 0;
result[1] = nodelist1.item(0).getTextContent();
//這里加了一個(gè)判斷,因為接收推送component_verify_ticket的解謎過(guò)程中沒(méi)有第三個(gè)參數,回報空指針異常
if(nodelist2.item(0) != null){
result[2] = nodelist2.item(0).getTextContent();
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.ParseXmlError);
}
}
2、文檔中:使用授權碼換取公眾號的插口調用憑據和授權信息
返回json信息最后少了一個(gè)}
{
"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77",
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM",
"expires_in": 7200,
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY",
"func_info": [
{
"funcscope_category": {
"id": 1
}
},
{
"funcscope_category": {
"id": 2
}
},
{
"funcscope_category": {
"id": 3
}
}
]
}
}
大家開(kāi)發(fā)時(shí)要注意json數據結構
三、關(guān)于代碼
在 微信公眾帳號第三方平臺全網(wǎng)發(fā)布源碼(java)- 實(shí)戰測試通過(guò) 代碼結構基礎上進(jìn)行更改
搜狗陌陌的抓取總結
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 266 次瀏覽 ? 2020-08-21 22:19
最近抓取了搜狗陌陌的數據,雖然也破解了跳轉之類(lèi)的,但是最后由于抓取的鏈接有時(shí)效性舍棄了,也總結下
一樣的,輸入關(guān)鍵詞,抓取列表,再回來(lái)跳轉后的陌陌鏈接
前10頁(yè)是可以隨意看的,也不需要登陸,10頁(yè)以后的數據須要陌陌掃碼登陸,這一塊無(wú)法破解
鏈接參數好多最后可以精簡(jiǎn)為
烽火&page=11&type=2
page就是頁(yè)腳,query就是關(guān)鍵字,type 是搜索文章還是搜索公眾號
其實(shí)很簡(jiǎn)單的代碼,先要在url前面構造出 k 和 h,轉化為 java 代碼就是
// 拼接搜狗跳轉參數k和h
public static String getLinkUrl(String url) {
int b = ((int) Math.floor(100 * Math.random())) + 1;
int a = url.indexOf("url=");
int k = a + 4 + 21 + b;
String d = url.substring(k, k + 1);
System.out.println(d);
url += "&k=" + b + "&h=" + d;
return "https://weixin.sogou.com" + url;
}
有參數的鏈接直接懇求是會(huì )出驗證碼的,需要cookie,需要的cookie只要是兩個(gè) 一個(gè)是 SUV,一個(gè)是SNUID,這兩個(gè)cookie獲取都很簡(jiǎn)單,通過(guò)剖析可以得到
1.SUV 是可以通過(guò)訪(fǎng)問(wèn)來(lái)獲取到
2.SNUID 在搜索的時(shí)侯才會(huì )有了
所以我們加上這兩個(gè)cookie才能獲取到具體的陌陌的鏈接了
剩下的就是把這個(gè)鏈接取下來(lái)就行啦
雖然還有好多細節沒(méi)有建立,但是最坑的是最后的陌陌鏈接是有時(shí)效性的
太坑了,市面上有將有時(shí)效的鏈接轉換為沒(méi)有時(shí)效的鏈接的商業(yè)服務(wù),不知道是她們是如何實(shí)現的。目前在看陌陌客戶(hù)端上面的搜一搜,因為通過(guò)客戶(hù)端的搜一搜搜下來(lái)的鏈接是短短的,應該是失效太長(cháng)的
2020-06-04 更新
找到了轉換永久鏈接的辦法,把有時(shí)效性的鏈接復制到陌陌客戶(hù)端上面,不管是過(guò)沒(méi)過(guò)期的鏈接都是才能打開(kāi)的,再把鏈接復制下來(lái)就是永久的鏈接了,使用了 pythonpyautogui 來(lái)操作的,很簡(jiǎn)單,也太low,速度不快,就不放代碼了。 查看全部
搜狗陌陌的抓取總結
最近抓取了搜狗陌陌的數據,雖然也破解了跳轉之類(lèi)的,但是最后由于抓取的鏈接有時(shí)效性舍棄了,也總結下

一樣的,輸入關(guān)鍵詞,抓取列表,再回來(lái)跳轉后的陌陌鏈接
前10頁(yè)是可以隨意看的,也不需要登陸,10頁(yè)以后的數據須要陌陌掃碼登陸,這一塊無(wú)法破解
鏈接參數好多最后可以精簡(jiǎn)為
烽火&page=11&type=2
page就是頁(yè)腳,query就是關(guān)鍵字,type 是搜索文章還是搜索公眾號

其實(shí)很簡(jiǎn)單的代碼,先要在url前面構造出 k 和 h,轉化為 java 代碼就是
// 拼接搜狗跳轉參數k和h
public static String getLinkUrl(String url) {
int b = ((int) Math.floor(100 * Math.random())) + 1;
int a = url.indexOf("url=");
int k = a + 4 + 21 + b;
String d = url.substring(k, k + 1);
System.out.println(d);
url += "&k=" + b + "&h=" + d;
return "https://weixin.sogou.com" + url;
}
有參數的鏈接直接懇求是會(huì )出驗證碼的,需要cookie,需要的cookie只要是兩個(gè) 一個(gè)是 SUV,一個(gè)是SNUID,這兩個(gè)cookie獲取都很簡(jiǎn)單,通過(guò)剖析可以得到
1.SUV 是可以通過(guò)訪(fǎng)問(wèn)來(lái)獲取到

2.SNUID 在搜索的時(shí)侯才會(huì )有了

所以我們加上這兩個(gè)cookie才能獲取到具體的陌陌的鏈接了

剩下的就是把這個(gè)鏈接取下來(lái)就行啦
雖然還有好多細節沒(méi)有建立,但是最坑的是最后的陌陌鏈接是有時(shí)效性的

太坑了,市面上有將有時(shí)效的鏈接轉換為沒(méi)有時(shí)效的鏈接的商業(yè)服務(wù),不知道是她們是如何實(shí)現的。目前在看陌陌客戶(hù)端上面的搜一搜,因為通過(guò)客戶(hù)端的搜一搜搜下來(lái)的鏈接是短短的,應該是失效太長(cháng)的

2020-06-04 更新
找到了轉換永久鏈接的辦法,把有時(shí)效性的鏈接復制到陌陌客戶(hù)端上面,不管是過(guò)沒(méi)過(guò)期的鏈接都是才能打開(kāi)的,再把鏈接復制下來(lái)就是永久的鏈接了,使用了 pythonpyautogui 來(lái)操作的,很簡(jiǎn)單,也太low,速度不快,就不放代碼了。
Python網(wǎng)絡(luò )爬蟲(chóng)學(xué)習筆記(五)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 171 次瀏覽 ? 2020-08-18 18:25
微信公眾號文章爬取
以搜狗的陌陌搜索平臺“”作為爬取入口,可以在搜索欄輸入相應關(guān)鍵詞來(lái)搜索相關(guān)微信公眾號文章。我們以“機器學(xué)習”作為搜索關(guān)鍵詞??梢钥匆?jiàn)搜索后的地址欄中內容為:
%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&_sug_type_=&sut=1872&lkt=1%2C86%2C86&s_from=input&_sug_=n&type=2&sst0=95&page=2&ie=utf8&w=01019900&dr=1
通過(guò)觀(guān)察,可以發(fā)覺(jué)如此幾個(gè)關(guān)鍵數組:
type:控制檢索信息的類(lèi)型query:我們懇求的搜索關(guān)鍵詞page:控制頁(yè)數
所以我們的網(wǎng)址結構可以構造為:
關(guān)鍵詞&type=2&page=頁(yè)碼
然后,我們在每一個(gè)搜索頁(yè)中爬取文章的思路是:
檢索對應關(guān)鍵詞得到的相應文章檢索結果,并在該頁(yè)面上將文章的鏈接提取下來(lái)在文章的鏈接被提取以后,根據這種鏈接地址采集文章中的具體標題和內容
通過(guò)查看文章列表頁(yè)的源代碼可以找到相應文章的URL以及要爬取的內容,列表頁(yè)面如下:
其中第一篇文章網(wǎng)址部份的源代碼如下所示:
機器學(xué)習法則:ML工程的最佳實(shí)踐
圖片源自:Westworld Season 2作者無(wú)邪機器學(xué)習研究者,人工智障推進(jìn)者.Martin Zinkevich 在2016年將 google 內容多年關(guān)于機器學(xué)...
程序人生document.write(timeConvert('1526875397'))
所以我們可以將提取文章網(wǎng)址的正則表達式構造為:
'
這樣就可以依據相關(guān)函數與代碼提取出指定頁(yè)數的文章網(wǎng)址。但是依據正則表達式提取出的網(wǎng)址不是真實(shí)地址,會(huì )出現參數錯誤。提取出的地址比真實(shí)地址多了一些“&amp;”字符串,我們通過(guò)url.replace("amp;","")去掉多余字符串。
這樣就提取了文章的地址,可以依照文章地址爬取相應網(wǎng)頁(yè),并通過(guò)代理服務(wù)器的方式,解決官方屏蔽IP的問(wèn)題。
整個(gè)爬取陌陌文章的思路如下:
建立三個(gè)自定義函數:實(shí)現使用代理服務(wù)器爬去指定網(wǎng)址并返回結果;實(shí)現獲得多個(gè)頁(yè)面的所有文章鏈接;實(shí)現依據文章鏈接爬取指定標題和內容并寫(xiě)入文件中。使用代理服務(wù)器爬取指定網(wǎng)址的內容實(shí)現獲取多個(gè)頁(yè)面的所有文章鏈接時(shí),需要對關(guān)鍵詞使用urllib.request.quote(key)進(jìn)行編碼,并通過(guò)for循環(huán)一次爬取各頁(yè)的文章中設置的服務(wù)器函數實(shí)現。實(shí)現依據文章鏈接爬取指定標題和內容寫(xiě)入對應文件,使用for循環(huán)一次爬取。代碼中假如發(fā)生異常,要進(jìn)行延時(shí)處理。
具體代碼如下: 查看全部
Python網(wǎng)絡(luò )爬蟲(chóng)學(xué)習筆記(五)
微信公眾號文章爬取
以搜狗的陌陌搜索平臺“”作為爬取入口,可以在搜索欄輸入相應關(guān)鍵詞來(lái)搜索相關(guān)微信公眾號文章。我們以“機器學(xué)習”作為搜索關(guān)鍵詞??梢钥匆?jiàn)搜索后的地址欄中內容為:
%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&_sug_type_=&sut=1872&lkt=1%2C86%2C86&s_from=input&_sug_=n&type=2&sst0=95&page=2&ie=utf8&w=01019900&dr=1
通過(guò)觀(guān)察,可以發(fā)覺(jué)如此幾個(gè)關(guān)鍵數組:
type:控制檢索信息的類(lèi)型query:我們懇求的搜索關(guān)鍵詞page:控制頁(yè)數
所以我們的網(wǎng)址結構可以構造為:
關(guān)鍵詞&type=2&page=頁(yè)碼
然后,我們在每一個(gè)搜索頁(yè)中爬取文章的思路是:
檢索對應關(guān)鍵詞得到的相應文章檢索結果,并在該頁(yè)面上將文章的鏈接提取下來(lái)在文章的鏈接被提取以后,根據這種鏈接地址采集文章中的具體標題和內容
通過(guò)查看文章列表頁(yè)的源代碼可以找到相應文章的URL以及要爬取的內容,列表頁(yè)面如下:
其中第一篇文章網(wǎng)址部份的源代碼如下所示:
機器學(xué)習法則:ML工程的最佳實(shí)踐
圖片源自:Westworld Season 2作者無(wú)邪機器學(xué)習研究者,人工智障推進(jìn)者.Martin Zinkevich 在2016年將 google 內容多年關(guān)于機器學(xué)...
程序人生document.write(timeConvert('1526875397'))
所以我們可以將提取文章網(wǎng)址的正則表達式構造為:
'
這樣就可以依據相關(guān)函數與代碼提取出指定頁(yè)數的文章網(wǎng)址。但是依據正則表達式提取出的網(wǎng)址不是真實(shí)地址,會(huì )出現參數錯誤。提取出的地址比真實(shí)地址多了一些“&amp;”字符串,我們通過(guò)url.replace("amp;","")去掉多余字符串。
這樣就提取了文章的地址,可以依照文章地址爬取相應網(wǎng)頁(yè),并通過(guò)代理服務(wù)器的方式,解決官方屏蔽IP的問(wèn)題。
整個(gè)爬取陌陌文章的思路如下:
建立三個(gè)自定義函數:實(shí)現使用代理服務(wù)器爬去指定網(wǎng)址并返回結果;實(shí)現獲得多個(gè)頁(yè)面的所有文章鏈接;實(shí)現依據文章鏈接爬取指定標題和內容并寫(xiě)入文件中。使用代理服務(wù)器爬取指定網(wǎng)址的內容實(shí)現獲取多個(gè)頁(yè)面的所有文章鏈接時(shí),需要對關(guān)鍵詞使用urllib.request.quote(key)進(jìn)行編碼,并通過(guò)for循環(huán)一次爬取各頁(yè)的文章中設置的服務(wù)器函數實(shí)現。實(shí)現依據文章鏈接爬取指定標題和內容寫(xiě)入對應文件,使用for循環(huán)一次爬取。代碼中假如發(fā)生異常,要進(jìn)行延時(shí)處理。
具體代碼如下:
微信公眾號歷史消息采集方法及注意事項
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 462 次瀏覽 ? 2020-08-18 15:34
采集微信文章和采集網(wǎng)站內容一樣,都須要從一個(gè)列表頁(yè)開(kāi)始。而陌陌文章的列表頁(yè)就是公眾號里的查看歷史消息頁(yè)?,F在網(wǎng)路上的其它陌陌采集器有的是借助搜狗搜索,采集方式其實(shí)簡(jiǎn)單多了,但是內容不全。所以我們還是要從最標準最全面的公眾號歷史消息頁(yè)來(lái)采集。
因為陌陌的限制,我們能復制到的鏈接是不完整的,在瀏覽器中未能打開(kāi)聽(tīng)到內容。所以我們須要通過(guò)上一篇文章介紹的方式,使用anyproxy獲取到一個(gè)完整的微信公眾號歷史消息頁(yè)面的鏈接地址。
f9387c4d02682e186a298a18276d8e0555e3ab51d81ca46de339e6082eb767343bef610edd80c9e1bfda66c
2b62751511f7cc091a33a029709e94f0d1604e11220fc099a27b2e2d29db75cc0849d4bf&devicetype=andro
id-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=Iox5ZdpRhrSxGYEeopVJwTB
P7kZj51GYyEL24AT5Zyx%2BBoEMdPDBtOun1F%2F9ENSz&wx_header=1
biz參數是公眾號的ID,uin是用戶(hù)的ID,目前來(lái)看uin是在所有公眾號之間惟一的。其它兩個(gè)重要參數key和pass_ticket是陌陌客戶(hù)端補充上的參數。
所以在這個(gè)地址失效之前我們是可以通過(guò)瀏覽器查看原文的方式獲取到歷史消息的文章列表的,如果希望自動(dòng)化剖析內容,也可以制做一個(gè)程序,將這個(gè)帶有仍未失效的key和pass_ticket的鏈接地址遞交進(jìn)去,再通過(guò)諸如php程序來(lái)獲取到文章列表。
最近有同事跟我說(shuō)他的采集目標就是單一的一個(gè)公眾號,我認為這樣就沒(méi)必要用上一篇文章寫(xiě)的批量采集的方式了。所以我們接下來(lái)瞧瞧歷史消息頁(yè)上面是如何獲取到文章列表的,通過(guò)剖析文章列表,就可以得到這個(gè)公眾號所有的內容鏈接地址,然后再采集內容就可以了。
在anyproxy的web界面中若果證書(shū)配置正確,是可以顯示出https的內容的。web界面的地址是:8002 其中localhost可以替換成自己的IP地址或域名。從列表中找到getmasssendmsg開(kāi)頭的記錄,點(diǎn)擊以后兩側都會(huì )顯示出這條記錄的詳情:
紅框部份就是完整的鏈接地址,將微信公眾平臺這個(gè)域名拼接在上面以后就可以在瀏覽器中打開(kāi)了。
然后將頁(yè)面向上拉,到html內容的結尾部份,我們可以看見(jiàn)一個(gè)json的變量就是歷史消息的文章列表:
我們將msgList的變量值拷貝下來(lái),用json低格工具剖析一下,我們就可以看見(jiàn)這個(gè)json是以下這個(gè)結構:
{
"list": [
{
"app_msg_ext_info": {
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 76742
7&idx=1&sn=37da0d7208283bf90e9a4a536e0af0ea&chksm=8b882dbbbcffa4ad2f0b8a141cc988d16bac
e564274018e68e5c53ee6f354f8ad56c9b98bade&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz/Mof ... gLtcq
GziaFqwibzvtZAHCDkMeJU1fGZHpjoeibanPJ8rziaq68Akkg/0?wx_fmt=jpeg",
"digest": "擦亮雙眼,遠離謠言。",
"fileid": 505283695,
"is_multi": 1,
"multi_app_msg_item_list": [
{
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 65276
7427&idx=2&sn=449ef1a874a37fed2429e14f724b56ef&chksm=8 b882dbbbcffa4ade48a7932cda426368
7e34fca8ea3a5a6233d2589d448b9f6130d3890ce93&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz_png ... YHYrh
ibia89ZnksCsUiaia2TLI1fyqjclibGa1hw3icP6oXeSpaWMjiabaghHl7yw/0?wx_fmt=png",
"digest": "12月28日,廣州亞運城綜合體育館,內附購票入口~",
"fileid": 0,
"source_url": "http://wechat.show.wepiao.com/ ... b56b9 98e1f2b8?detailReferrer=1&from=groupmessage&isappinstalled=0",
"title": "2017微信公開(kāi)課Pro版即將召開(kāi)"
},
...//循環(huán)被省略
],
"source_url": "",
"subtype": 9,
"title": "謠言熱榜 | 十一月朋友圈十大謠言"
},
"comm_msg_info": {
"content": "",
"datetime": 1480933315,
"fakeid": "3093134871",
"id": 1000000010,
"status": 2,
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
}
簡(jiǎn)要的剖析一下這個(gè)json(這里只介紹一些重要的信息,其它的被省略):
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "??",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""??"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
在這里還要提及一點(diǎn)就是假如希望獲取到時(shí)間更久遠一些的歷史消息內容,就須要在手機或模擬器上將頁(yè)面向上拉,當拉到最里邊的時(shí)侯,微信將手動(dòng)讀取下一頁(yè)的內容。下一頁(yè)的鏈接地址和歷史消息頁(yè)的鏈接地址同樣是getmasssendmsg開(kāi)頭的地址。但是內容就是只有json了,沒(méi)有html了。直接解析json就可以了。
這時(shí)可以通過(guò)上一篇文章介紹的方式,使用anyproxy將msgList變量值正則匹配下來(lái)以后,異步遞交到服務(wù)器,再從服務(wù)器上使用php的json_decode解析json成為字段。然后遍歷循環(huán)鏈表。我們就可以得到每一篇文章的標題和鏈接地址。
如果只須要采集單一公眾號的內容,完全可以在每晚群發(fā)以后,通過(guò)anyproxy獲取到完整的帶有key和pass_ticket的鏈接地址。然后自己制做一個(gè)程序,手動(dòng)將地址遞交給自己的程序。使用諸如php這樣的語(yǔ)言來(lái)正則匹配到msgList,然后解析json。這樣就不用更改anyproxy的rule,也不需要制做一個(gè)采集隊列和跳轉頁(yè)面了。 查看全部
微信公眾號歷史消息采集方法及注意事項
采集微信文章和采集網(wǎng)站內容一樣,都須要從一個(gè)列表頁(yè)開(kāi)始。而陌陌文章的列表頁(yè)就是公眾號里的查看歷史消息頁(yè)?,F在網(wǎng)路上的其它陌陌采集器有的是借助搜狗搜索,采集方式其實(shí)簡(jiǎn)單多了,但是內容不全。所以我們還是要從最標準最全面的公眾號歷史消息頁(yè)來(lái)采集。
因為陌陌的限制,我們能復制到的鏈接是不完整的,在瀏覽器中未能打開(kāi)聽(tīng)到內容。所以我們須要通過(guò)上一篇文章介紹的方式,使用anyproxy獲取到一個(gè)完整的微信公眾號歷史消息頁(yè)面的鏈接地址。
f9387c4d02682e186a298a18276d8e0555e3ab51d81ca46de339e6082eb767343bef610edd80c9e1bfda66c
2b62751511f7cc091a33a029709e94f0d1604e11220fc099a27b2e2d29db75cc0849d4bf&devicetype=andro
id-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=Iox5ZdpRhrSxGYEeopVJwTB
P7kZj51GYyEL24AT5Zyx%2BBoEMdPDBtOun1F%2F9ENSz&wx_header=1
biz參數是公眾號的ID,uin是用戶(hù)的ID,目前來(lái)看uin是在所有公眾號之間惟一的。其它兩個(gè)重要參數key和pass_ticket是陌陌客戶(hù)端補充上的參數。
所以在這個(gè)地址失效之前我們是可以通過(guò)瀏覽器查看原文的方式獲取到歷史消息的文章列表的,如果希望自動(dòng)化剖析內容,也可以制做一個(gè)程序,將這個(gè)帶有仍未失效的key和pass_ticket的鏈接地址遞交進(jìn)去,再通過(guò)諸如php程序來(lái)獲取到文章列表。
最近有同事跟我說(shuō)他的采集目標就是單一的一個(gè)公眾號,我認為這樣就沒(méi)必要用上一篇文章寫(xiě)的批量采集的方式了。所以我們接下來(lái)瞧瞧歷史消息頁(yè)上面是如何獲取到文章列表的,通過(guò)剖析文章列表,就可以得到這個(gè)公眾號所有的內容鏈接地址,然后再采集內容就可以了。
在anyproxy的web界面中若果證書(shū)配置正確,是可以顯示出https的內容的。web界面的地址是:8002 其中localhost可以替換成自己的IP地址或域名。從列表中找到getmasssendmsg開(kāi)頭的記錄,點(diǎn)擊以后兩側都會(huì )顯示出這條記錄的詳情:

紅框部份就是完整的鏈接地址,將微信公眾平臺這個(gè)域名拼接在上面以后就可以在瀏覽器中打開(kāi)了。
然后將頁(yè)面向上拉,到html內容的結尾部份,我們可以看見(jiàn)一個(gè)json的變量就是歷史消息的文章列表:

我們將msgList的變量值拷貝下來(lái),用json低格工具剖析一下,我們就可以看見(jiàn)這個(gè)json是以下這個(gè)結構:
{
"list": [
{
"app_msg_ext_info": {
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 76742
7&idx=1&sn=37da0d7208283bf90e9a4a536e0af0ea&chksm=8b882dbbbcffa4ad2f0b8a141cc988d16bac
e564274018e68e5c53ee6f354f8ad56c9b98bade&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz/Mof ... gLtcq
GziaFqwibzvtZAHCDkMeJU1fGZHpjoeibanPJ8rziaq68Akkg/0?wx_fmt=jpeg",
"digest": "擦亮雙眼,遠離謠言。",
"fileid": 505283695,
"is_multi": 1,
"multi_app_msg_item_list": [
{
"author": "",
"content": "",
"content_url": "http://mp.weixin.qq.com/s%3F__ ... 65276
7427&idx=2&sn=449ef1a874a37fed2429e14f724b56ef&chksm=8 b882dbbbcffa4ade48a7932cda426368
7e34fca8ea3a5a6233d2589d448b9f6130d3890ce93&scene=4#wechat_redirect",
"copyright_stat": 100,
"cover": "http://mmbiz.qpic.cn/mmbiz_png ... YHYrh
ibia89ZnksCsUiaia2TLI1fyqjclibGa1hw3icP6oXeSpaWMjiabaghHl7yw/0?wx_fmt=png",
"digest": "12月28日,廣州亞運城綜合體育館,內附購票入口~",
"fileid": 0,
"source_url": "http://wechat.show.wepiao.com/ ... b56b9 98e1f2b8?detailReferrer=1&from=groupmessage&isappinstalled=0",
"title": "2017微信公開(kāi)課Pro版即將召開(kāi)"
},
...//循環(huán)被省略
],
"source_url": "",
"subtype": 9,
"title": "謠言熱榜 | 十一月朋友圈十大謠言"
},
"comm_msg_info": {
"content": "",
"datetime": 1480933315,
"fakeid": "3093134871",
"id": 1000000010,
"status": 2,
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
}
簡(jiǎn)要的剖析一下這個(gè)json(這里只介紹一些重要的信息,其它的被省略):
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "??",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""??"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
在這里還要提及一點(diǎn)就是假如希望獲取到時(shí)間更久遠一些的歷史消息內容,就須要在手機或模擬器上將頁(yè)面向上拉,當拉到最里邊的時(shí)侯,微信將手動(dòng)讀取下一頁(yè)的內容。下一頁(yè)的鏈接地址和歷史消息頁(yè)的鏈接地址同樣是getmasssendmsg開(kāi)頭的地址。但是內容就是只有json了,沒(méi)有html了。直接解析json就可以了。
這時(shí)可以通過(guò)上一篇文章介紹的方式,使用anyproxy將msgList變量值正則匹配下來(lái)以后,異步遞交到服務(wù)器,再從服務(wù)器上使用php的json_decode解析json成為字段。然后遍歷循環(huán)鏈表。我們就可以得到每一篇文章的標題和鏈接地址。
如果只須要采集單一公眾號的內容,完全可以在每晚群發(fā)以后,通過(guò)anyproxy獲取到完整的帶有key和pass_ticket的鏈接地址。然后自己制做一個(gè)程序,手動(dòng)將地址遞交給自己的程序。使用諸如php這樣的語(yǔ)言來(lái)正則匹配到msgList,然后解析json。這樣就不用更改anyproxy的rule,也不需要制做一個(gè)采集隊列和跳轉頁(yè)面了。
利用搜狗陌陌自制一個(gè)簡(jiǎn)易微信公眾號爬蟲(chóng)接口
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2020-08-18 11:12
微信公眾號現已成為主流的一對多媒體行為活動(dòng),也是現今互聯(lián)網(wǎng)內容生產(chǎn)不可忽略的一股力量。
在此基礎上,微信公眾號爬蟲(chóng)顯得太有價(jià)值,對內容生產(chǎn)型公眾號進(jìn)行數據挖掘可以得到好多有意思、有價(jià)值的信息。就我所知,可用于微信公眾號爬蟲(chóng)的方法主要有以下幾種:web陌陌,手機客戶(hù)端抓包,搜狗陌陌入口,appium自動(dòng)化測試,Xposed框架等。
手機客戶(hù)端抓包,利用fiddler或charles等抓包工具,算是一個(gè)比較主流(我自己覺(jué)得的orz),效率較高的方式,可以快速的抓取微信公眾號信息和歷史消息,此方式也有隱憂(yōu):cookies失效快,半天差不多的時(shí)間吧,有針對性的去抓取某幾個(gè)公眾號的歷史消息也是可以的。要想通過(guò)模擬登錄陌陌手動(dòng)獲得cookies,好像很難的,小弟淺薄,無(wú)法實(shí)現,貌似陌陌登錄是tcp協(xié)議?
appium自動(dòng)化和Xposed框架我了解不多。appium類(lèi)似于selenium,在移動(dòng)端做自動(dòng)化測試的,模擬點(diǎn)擊即可。Xposed框架就有很多可以搞的了,Xposed可以在不更改apk的情況下做到一些額外的功能,爬蟲(chóng)自然是可以的,除此之外可做到以手動(dòng)搶紅包,自動(dòng)回復機器人,修改陌陌步數等等騷操作。
寫(xiě)爬蟲(chóng)也有一段時(shí)間了,個(gè)人覺(jué)得實(shí)現爬蟲(chóng)不僅反反爬,爬蟲(chóng)效率外,還有一個(gè)很難實(shí)現的地方就是爬蟲(chóng)的穩定性,健壯性,需要考慮到好多異常情況,以及合理有效的異常處理,在這一點(diǎn)上,我認為我還須要向各大爬蟲(chóng)大鱷學(xué)習。(感覺(jué)自己瞎扯了很多,還沒(méi)有開(kāi)始我的正文(orz),感覺(jué)嫌我啰嗦的大鱷請別生氣。)
利用搜狗陌陌寫(xiě)一個(gè)爬蟲(chóng)插口,代碼太狹小,只有兩百行不到的代碼。(這里我還得吐槽一下,python寫(xiě)多了,總有一種自己太叼,編程很簡(jiǎn)單的錯覺(jué),幾行代碼能夠實(shí)現很厲害的功能,這時(shí)候須要去寫(xiě)寫(xiě)CPP冷靜一下,讓自己曉得哪些是真正的編程。)
以下記錄下我寫(xiě)這個(gè)爬蟲(chóng)插口腳本的過(guò)程:
1. 頁(yè)面懇求剖析(以公眾號搜索為例):
可以看見(jiàn)第一個(gè)http請求包就是我們想要的結果,查看其query string,如下:
看起來(lái)很簡(jiǎn)單的不是,我們得到以下幾個(gè)信息:
2. 模擬頁(yè)面懇求:
我們直接用 url, 請求參數params, 還有谷歌瀏覽器的 user-agent 請求,發(fā)現可以成功的獲取到我們想要頁(yè)面的源碼,接下來(lái)我們獲取搜索結果下的第一個(gè)公眾號即可(這意味著(zhù)須要確切的給定公眾號名稱(chēng),太過(guò)模糊有可能獲取到與其類(lèi)似的公眾號結果)。
3. 分析頁(yè)面:
先確定爬取思路,第一步獲取微信公眾號鏈接,再通過(guò)該微信公眾號鏈接獲取其近來(lái)十條推送的相關(guān)信息,包括標題,日期,作者,內容摘要,內容鏈接(事實(shí)上,我們發(fā)覺(jué)有了陌陌推送鏈接以后才能太輕松的獲取其推送主體內容,但不包括點(diǎn)贊數和閱讀數,這幾個(gè)數據只能在陌陌手機端能夠查看,如果有機會(huì )的話(huà),下次記錄下自己手機陌陌抓包爬蟲(chóng)的過(guò)程)。
于是第一步我們獲取公眾號鏈接:
這里我們直接使用正則表達式提取即可(這么簡(jiǎn)單的就不用xpath,bs4了,依賴(lài)標準庫和第三方庫還是有所不同的。)
?。ū副凰《伦×薿rz,換一張。)
第二步按照微信公眾號鏈接獲取近來(lái)十條推送信息:
?。ㄎ抑粚?xiě)了一篇orz,以后多加油。)
ctlr U 查看網(wǎng)頁(yè)源碼,發(fā)現原創(chuàng )信息都置于一個(gè)js變量上面。
好辦,繼續正則提取,將json格式的字符串轉換成python上面的字典,有兩種辦法,第一種是用 json.loads 方法, 第二種是用外置的 eval方式,這兩種方式有些區別,比如說(shuō)單冒號和雙冒號, json格式中使用的是雙引號, python字典通常是單冒號。
OK,獲得原創(chuàng )推送信息數據了,但這上面有很多我們用不到的信息,將其剔除一下,值得一提的是,datetime的值是一個(gè)timestamp,我們須要將其轉化為直觀(guān)的時(shí)間抒發(fā)。
到此,關(guān)于微信公眾號的爬蟲(chóng)差不都就解決了,接下來(lái)須要將其封裝為類(lèi)。主要部份代碼如下。
另外,關(guān)于關(guān)鍵詞搜索文章的爬蟲(chóng)插口我也一并寫(xiě)了,AccountAPI,ArticleAPI,其父類(lèi)是一AP類(lèi),API類(lèi)有query_url, params, headers, _get_response, _get_datetime等變量和技巧,供于A(yíng)ccountAPI,ArticleAPI共用。
代碼放到 查看全部
利用搜狗陌陌自制一個(gè)簡(jiǎn)易微信公眾號爬蟲(chóng)插口
微信公眾號現已成為主流的一對多媒體行為活動(dòng),也是現今互聯(lián)網(wǎng)內容生產(chǎn)不可忽略的一股力量。
在此基礎上,微信公眾號爬蟲(chóng)顯得太有價(jià)值,對內容生產(chǎn)型公眾號進(jìn)行數據挖掘可以得到好多有意思、有價(jià)值的信息。就我所知,可用于微信公眾號爬蟲(chóng)的方法主要有以下幾種:web陌陌,手機客戶(hù)端抓包,搜狗陌陌入口,appium自動(dòng)化測試,Xposed框架等。
手機客戶(hù)端抓包,利用fiddler或charles等抓包工具,算是一個(gè)比較主流(我自己覺(jué)得的orz),效率較高的方式,可以快速的抓取微信公眾號信息和歷史消息,此方式也有隱憂(yōu):cookies失效快,半天差不多的時(shí)間吧,有針對性的去抓取某幾個(gè)公眾號的歷史消息也是可以的。要想通過(guò)模擬登錄陌陌手動(dòng)獲得cookies,好像很難的,小弟淺薄,無(wú)法實(shí)現,貌似陌陌登錄是tcp協(xié)議?
appium自動(dòng)化和Xposed框架我了解不多。appium類(lèi)似于selenium,在移動(dòng)端做自動(dòng)化測試的,模擬點(diǎn)擊即可。Xposed框架就有很多可以搞的了,Xposed可以在不更改apk的情況下做到一些額外的功能,爬蟲(chóng)自然是可以的,除此之外可做到以手動(dòng)搶紅包,自動(dòng)回復機器人,修改陌陌步數等等騷操作。
寫(xiě)爬蟲(chóng)也有一段時(shí)間了,個(gè)人覺(jué)得實(shí)現爬蟲(chóng)不僅反反爬,爬蟲(chóng)效率外,還有一個(gè)很難實(shí)現的地方就是爬蟲(chóng)的穩定性,健壯性,需要考慮到好多異常情況,以及合理有效的異常處理,在這一點(diǎn)上,我認為我還須要向各大爬蟲(chóng)大鱷學(xué)習。(感覺(jué)自己瞎扯了很多,還沒(méi)有開(kāi)始我的正文(orz),感覺(jué)嫌我啰嗦的大鱷請別生氣。)
利用搜狗陌陌寫(xiě)一個(gè)爬蟲(chóng)插口,代碼太狹小,只有兩百行不到的代碼。(這里我還得吐槽一下,python寫(xiě)多了,總有一種自己太叼,編程很簡(jiǎn)單的錯覺(jué),幾行代碼能夠實(shí)現很厲害的功能,這時(shí)候須要去寫(xiě)寫(xiě)CPP冷靜一下,讓自己曉得哪些是真正的編程。)
以下記錄下我寫(xiě)這個(gè)爬蟲(chóng)插口腳本的過(guò)程:
1. 頁(yè)面懇求剖析(以公眾號搜索為例):
可以看見(jiàn)第一個(gè)http請求包就是我們想要的結果,查看其query string,如下:
看起來(lái)很簡(jiǎn)單的不是,我們得到以下幾個(gè)信息:
2. 模擬頁(yè)面懇求:
我們直接用 url, 請求參數params, 還有谷歌瀏覽器的 user-agent 請求,發(fā)現可以成功的獲取到我們想要頁(yè)面的源碼,接下來(lái)我們獲取搜索結果下的第一個(gè)公眾號即可(這意味著(zhù)須要確切的給定公眾號名稱(chēng),太過(guò)模糊有可能獲取到與其類(lèi)似的公眾號結果)。
3. 分析頁(yè)面:
先確定爬取思路,第一步獲取微信公眾號鏈接,再通過(guò)該微信公眾號鏈接獲取其近來(lái)十條推送的相關(guān)信息,包括標題,日期,作者,內容摘要,內容鏈接(事實(shí)上,我們發(fā)覺(jué)有了陌陌推送鏈接以后才能太輕松的獲取其推送主體內容,但不包括點(diǎn)贊數和閱讀數,這幾個(gè)數據只能在陌陌手機端能夠查看,如果有機會(huì )的話(huà),下次記錄下自己手機陌陌抓包爬蟲(chóng)的過(guò)程)。
于是第一步我們獲取公眾號鏈接:
這里我們直接使用正則表達式提取即可(這么簡(jiǎn)單的就不用xpath,bs4了,依賴(lài)標準庫和第三方庫還是有所不同的。)
?。ū副凰《伦×薿rz,換一張。)
第二步按照微信公眾號鏈接獲取近來(lái)十條推送信息:
?。ㄎ抑粚?xiě)了一篇orz,以后多加油。)
ctlr U 查看網(wǎng)頁(yè)源碼,發(fā)現原創(chuàng )信息都置于一個(gè)js變量上面。
好辦,繼續正則提取,將json格式的字符串轉換成python上面的字典,有兩種辦法,第一種是用 json.loads 方法, 第二種是用外置的 eval方式,這兩種方式有些區別,比如說(shuō)單冒號和雙冒號, json格式中使用的是雙引號, python字典通常是單冒號。
OK,獲得原創(chuàng )推送信息數據了,但這上面有很多我們用不到的信息,將其剔除一下,值得一提的是,datetime的值是一個(gè)timestamp,我們須要將其轉化為直觀(guān)的時(shí)間抒發(fā)。
到此,關(guān)于微信公眾號的爬蟲(chóng)差不都就解決了,接下來(lái)須要將其封裝為類(lèi)。主要部份代碼如下。
另外,關(guān)于關(guān)鍵詞搜索文章的爬蟲(chóng)插口我也一并寫(xiě)了,AccountAPI,ArticleAPI,其父類(lèi)是一AP類(lèi),API類(lèi)有query_url, params, headers, _get_response, _get_datetime等變量和技巧,供于A(yíng)ccountAPI,ArticleAPI共用。
代碼放到
微信熱門(mén)文章采集方法以及詳盡步驟.docx
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 397 次瀏覽 ? 2020-08-18 10:43
文檔介紹:
微信熱門(mén)文章采集方法以及詳盡步驟
本文將以搜狗陌陌文章為例,介紹使用優(yōu)采云采集網(wǎng)頁(yè)文章正文的技巧。文章正文里通常包括文本和圖片兩種。本文將采集文章正文中的文本+圖片URL。
將采集以下數組:文章標題、時(shí)間、來(lái)源和正文(正文中的所有文本,將合并到一個(gè)excel單元格中,將使用到“自定義數據合并方法”功能,請你們注意)。同時(shí),采集文章正文中的文本+圖片URL,將用到“判斷條件”,“判斷條件”的使用,有很多須要注意的地方。以下兩個(gè)教程,大家可先熟悉一下。
“自定義數據合并方法”詳解教程:
orialdetail-1/zdyhb_7.html
“判斷條件”詳解教程:
orialdetail-1/judge.html
采集網(wǎng)站:
使用功能點(diǎn):
分頁(yè)列表信息采集
orial/fylb-70.aspx?t=1
Xpath
rch?query=XPath
AJAX點(diǎn)擊和翻頁(yè)
orial/ajaxdjfy_7.aspx?t=1
判斷條件
orialdetail-1/judge.html
AJAX滾動(dòng)
orialdetail-1/ajgd_7.html
步驟1:創(chuàng )建采集任務(wù)
1)進(jìn)入主界面,選擇“自定義模式”
微信熱門(mén)文章采集方法步驟1
2)將要采集的網(wǎng)址URL復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址”
微信熱門(mén)文章采集方法步驟2
步驟2:創(chuàng )建翻頁(yè)循環(huán)
在頁(yè)面右上角,打開(kāi)“流程”,以詮釋出“流程設計器”和“定制當前操作”兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載更多內容”按鈕,在操作提示框中,選擇“更多操作”
微信熱門(mén)文章采集方法步驟3
選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán)
微信熱門(mén)文章采集方法步驟4
由于此網(wǎng)頁(yè)涉及Ajax技術(shù),我們須要進(jìn)行一些中級選項的設置。選中“點(diǎn)擊元素”步驟,打開(kāi)“高級選項”,勾選“Ajax加載數據”,設置時(shí)間為“2秒”
微信熱門(mén)文章采集方法步驟5
注:AJAX即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺與服務(wù)器進(jìn)行少量數據交換,可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份進(jìn)行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址不會(huì )改變;b、網(wǎng)頁(yè)不是完全加載,只是局部進(jìn)行了數據加載,有所變化。 查看全部
微信熱門(mén)文章采集方法以及詳盡步驟.docx
文檔介紹:
微信熱門(mén)文章采集方法以及詳盡步驟
本文將以搜狗陌陌文章為例,介紹使用優(yōu)采云采集網(wǎng)頁(yè)文章正文的技巧。文章正文里通常包括文本和圖片兩種。本文將采集文章正文中的文本+圖片URL。
將采集以下數組:文章標題、時(shí)間、來(lái)源和正文(正文中的所有文本,將合并到一個(gè)excel單元格中,將使用到“自定義數據合并方法”功能,請你們注意)。同時(shí),采集文章正文中的文本+圖片URL,將用到“判斷條件”,“判斷條件”的使用,有很多須要注意的地方。以下兩個(gè)教程,大家可先熟悉一下。
“自定義數據合并方法”詳解教程:
orialdetail-1/zdyhb_7.html
“判斷條件”詳解教程:
orialdetail-1/judge.html
采集網(wǎng)站:
使用功能點(diǎn):
分頁(yè)列表信息采集
orial/fylb-70.aspx?t=1
Xpath
rch?query=XPath
AJAX點(diǎn)擊和翻頁(yè)
orial/ajaxdjfy_7.aspx?t=1
判斷條件
orialdetail-1/judge.html
AJAX滾動(dòng)
orialdetail-1/ajgd_7.html
步驟1:創(chuàng )建采集任務(wù)
1)進(jìn)入主界面,選擇“自定義模式”
微信熱門(mén)文章采集方法步驟1
2)將要采集的網(wǎng)址URL復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址”
微信熱門(mén)文章采集方法步驟2
步驟2:創(chuàng )建翻頁(yè)循環(huán)
在頁(yè)面右上角,打開(kāi)“流程”,以詮釋出“流程設計器”和“定制當前操作”兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載更多內容”按鈕,在操作提示框中,選擇“更多操作”
微信熱門(mén)文章采集方法步驟3
選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán)
微信熱門(mén)文章采集方法步驟4
由于此網(wǎng)頁(yè)涉及Ajax技術(shù),我們須要進(jìn)行一些中級選項的設置。選中“點(diǎn)擊元素”步驟,打開(kāi)“高級選項”,勾選“Ajax加載數據”,設置時(shí)間為“2秒”
微信熱門(mén)文章采集方法步驟5
注:AJAX即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺與服務(wù)器進(jìn)行少量數據交換,可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份進(jìn)行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址不會(huì )改變;b、網(wǎng)頁(yè)不是完全加載,只是局部進(jìn)行了數據加載,有所變化。
微信公眾號之獲取openId
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2020-08-18 03:00
在小伙伴們開(kāi)發(fā)微信公眾號、小程序或則是在陌陌外置瀏覽器打開(kāi)的項目時(shí),會(huì )碰到的第一個(gè)問(wèn)題就是怎么獲取openId,今天小編就給你們帶來(lái)的是怎樣獲取openId。
首先 我們要從陌陌開(kāi)發(fā)者后臺得到appid,這個(gè)appid是管理員在設置陌陌后臺時(shí)獲取的,而且是惟一的,而且還須要在陌陌后臺設置反彈域名。
其次這種都打算好之后,我們就可以使用陌陌自帶的方式獲取openId:
注意:劃線(xiàn)部份是要獲取的openId和反彈域名,而location.href=url 是當頁(yè)面第一次渲染時(shí),自動(dòng)獲取openId,當然,這些還是打算工作
1 //截取URL字段
2 GetQueryString: function(name) {
3 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
4 var r = window.location.search.substr(1).match(reg);
5 if (r != null) {
6 return unescape(r[2]);
7 }
8 return null;
9 },
10 getToken: function() {
11 //判斷是否有openid
12 if (this.$cookieStore.getCookie("openid") == null) {
13 var url =
14 "https://open.weixin.qq.com/con ... ot%3B +
15 encodeURIComponent(
16 "https://www.baidu.com/"
17 ) +
18 "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect&connect_redirect=1#wechat_redirect";
19 location.href = url;
20 var code = this.GetQueryString("code");
21 // console.log(code);
22 axios({
23 url: "接口名" + code
24 }).then(res => {
25 // console.log(res);
26 if (res.data.code == 0) {
27 this.$cookieStore.setCookie("openid", res.data.result);
28 }
29 });
30 } else {
31 this.openid = this.$cookieStore.getCookie("openid");
32 }
33 },
我們要使用上圖的方式來(lái)獲取code值,通過(guò)插口,來(lái)獲取openId,然后把openId存在cookie里每次調用就可以了。
這就是小編給你們帶來(lái)的獲取openId的方式,下面是完整代碼。 查看全部
微信公眾號之獲取openId
在小伙伴們開(kāi)發(fā)微信公眾號、小程序或則是在陌陌外置瀏覽器打開(kāi)的項目時(shí),會(huì )碰到的第一個(gè)問(wèn)題就是怎么獲取openId,今天小編就給你們帶來(lái)的是怎樣獲取openId。
首先 我們要從陌陌開(kāi)發(fā)者后臺得到appid,這個(gè)appid是管理員在設置陌陌后臺時(shí)獲取的,而且是惟一的,而且還須要在陌陌后臺設置反彈域名。
其次這種都打算好之后,我們就可以使用陌陌自帶的方式獲取openId:

注意:劃線(xiàn)部份是要獲取的openId和反彈域名,而location.href=url 是當頁(yè)面第一次渲染時(shí),自動(dòng)獲取openId,當然,這些還是打算工作

1 //截取URL字段
2 GetQueryString: function(name) {
3 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
4 var r = window.location.search.substr(1).match(reg);
5 if (r != null) {
6 return unescape(r[2]);
7 }
8 return null;
9 },
10 getToken: function() {
11 //判斷是否有openid
12 if (this.$cookieStore.getCookie("openid") == null) {
13 var url =
14 "https://open.weixin.qq.com/con ... ot%3B +
15 encodeURIComponent(
16 "https://www.baidu.com/"
17 ) +
18 "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect&connect_redirect=1#wechat_redirect";
19 location.href = url;
20 var code = this.GetQueryString("code");
21 // console.log(code);
22 axios({
23 url: "接口名" + code
24 }).then(res => {
25 // console.log(res);
26 if (res.data.code == 0) {
27 this.$cookieStore.setCookie("openid", res.data.result);
28 }
29 });
30 } else {
31 this.openid = this.$cookieStore.getCookie("openid");
32 }
33 },
我們要使用上圖的方式來(lái)獲取code值,通過(guò)插口,來(lái)獲取openId,然后把openId存在cookie里每次調用就可以了。
這就是小編給你們帶來(lái)的獲取openId的方式,下面是完整代碼。
R語(yǔ)言爬蟲(chóng)系列6|動(dòng)態(tài)數據抓取范例
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 172 次瀏覽 ? 2020-08-15 12:32
作者:魯偉,熱愛(ài)數據,堅信數據技術(shù)和代碼改變世界。R語(yǔ)言和Python的忠實(shí)擁躉,為成為一名未來(lái)的數據科學(xué)家而拼搏終身。個(gè)人公眾號:數據科學(xué)家養成記 (微信ID:louwill12)
第一篇戳:
第二篇戳:
第三篇戳:
第四篇戳:
第五篇戳:
通過(guò)上面幾期的推送,小編基本上早已將R語(yǔ)言爬蟲(chóng)所須要的基本知識介紹完了。R其實(shí)是以一門(mén)統計剖析工具出現在大多數人印象中的,但其雖然本質(zhì)上是一門(mén)編程語(yǔ)言,對于爬蟲(chóng)的支持雖不如Python那樣多快好省,但細心研究一下總能作出一些使你驚喜的療效。
大約很早之前,小編就寫(xiě)過(guò)關(guān)于R語(yǔ)言爬蟲(chóng)新貴rvest的抓取介紹,之前說(shuō)rvest+SelectGadgetor是結構化網(wǎng)頁(yè)抓取的實(shí)戰神器,大家的溢美之詞不斷。詳情可見(jiàn)推文:
R語(yǔ)言爬蟲(chóng)神器:rvest包+SelectorGadget抓取鏈家上海二手房數據
但網(wǎng)路爬蟲(chóng)這個(gè)江湖很險惡,單靠一招rvest行走江湖必然兇多吉少,一不小心遇到哪些AJAX和動(dòng)態(tài)網(wǎng)頁(yè)憑僅把握rvest的諸位必將束手無(wú)策。本文小編就簡(jiǎn)單介紹下在用R語(yǔ)言進(jìn)行實(shí)際的網(wǎng)路數據抓取時(shí)怎樣將動(dòng)態(tài)數據給弄到手。
所謂動(dòng)態(tài)網(wǎng)頁(yè)和異步加載,在之前的系列4的時(shí)侯小編已通過(guò)AJAX介紹過(guò)了,簡(jiǎn)單而言就是我明明在網(wǎng)頁(yè)中聽(tīng)到了這個(gè)數據,但到后臺HTML中卻找不到了,這一般就是XHR在作怪。這時(shí)候我們就不要看原創(chuàng )的HTML數據了,需要進(jìn)行二次懇求,通過(guò)web開(kāi)發(fā)者工具找到真實(shí)懇求的url。下面小編就以?xún)蓚€(gè)網(wǎng)頁(yè)為例,分別通過(guò)GET和POST懇求領(lǐng)到動(dòng)態(tài)網(wǎng)頁(yè)數據,全過(guò)程主要使用httr包來(lái)實(shí)現,httr包堪稱(chēng)是RCurl包的精簡(jiǎn)版,說(shuō)其短小精悍也不為過(guò)。httr包與RCurl包在主要函數的區別如下所示:
GET懇求抓取陌陌好友列表數據
很早之前圈子里就聽(tīng)到過(guò)用Python抓取自己陌陌好友數據的案例分享,今天便以陌陌網(wǎng)頁(yè)版為例,探一探其網(wǎng)頁(yè)結構。首先登陸個(gè)人陌陌網(wǎng)頁(yè)版,右鍵打開(kāi)web開(kāi)發(fā)者工具,下來(lái)一大堆懇求:
簡(jiǎn)單找一下發(fā)覺(jué)網(wǎng)頁(yè)中的陌陌好友列表信息并沒(méi)有呈現在HTML 中,大概可以推斷陌陌好友數據是通過(guò)動(dòng)態(tài)加載來(lái)顯示的,所以直接定位到XHR中,經(jīng)過(guò)幾番嘗試,結合兩側的preview,我們會(huì )發(fā)覺(jué)大量整齊劃一的數據,所以二次懇求的url真的就是它了:
找到真正的url以后,接下來(lái)就是獲取懇求信息了,切換到Headers版塊,Header版塊下的4個(gè)子信息我們都須要關(guān)注,它們是我們構造爬蟲(chóng)懇求頭的關(guān)鍵。
從Header中我們可以看見(jiàn)該信息是通過(guò)GET方式懇求得到的,General信息下的Request URL,Request Method, Status Code; Response Headers信息下的Connection, Content-Type; Request Headers信息下的Accept, Cookie, Referer, User-Agent以及最后的Query String Parameters都是我們須要重點(diǎn)關(guān)注的。
找到相應的信息然后,我們便可以直接借助httr包在R中建立爬蟲(chóng)懇求:
<p>#傳入微信cookie信息<br />Cookie Accept: application/json<br />-> Content-Type: text/plain<br />-> User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0<br />-> Referer: https://wx.qq.com/<br />-> Connection: keep-alive<br />-> cookie: 我的微信cookie<br />-> <br /> Connection: keep-alive<br />-> cookie: 網(wǎng)易云課堂cookie<br />-> Content-Length: 69<br />-> <br />>> {"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":-1}<br /><br /> 查看全部
作者:魯偉,熱愛(ài)數據,堅信數據技術(shù)和代碼改變世界。R語(yǔ)言和Python的忠實(shí)擁躉,為成為一名未來(lái)的數據科學(xué)家而拼搏終身。個(gè)人公眾號:數據科學(xué)家養成記 (微信ID:louwill12)
第一篇戳:
第二篇戳:
第三篇戳:
第四篇戳:
第五篇戳:
通過(guò)上面幾期的推送,小編基本上早已將R語(yǔ)言爬蟲(chóng)所須要的基本知識介紹完了。R其實(shí)是以一門(mén)統計剖析工具出現在大多數人印象中的,但其雖然本質(zhì)上是一門(mén)編程語(yǔ)言,對于爬蟲(chóng)的支持雖不如Python那樣多快好省,但細心研究一下總能作出一些使你驚喜的療效。
大約很早之前,小編就寫(xiě)過(guò)關(guān)于R語(yǔ)言爬蟲(chóng)新貴rvest的抓取介紹,之前說(shuō)rvest+SelectGadgetor是結構化網(wǎng)頁(yè)抓取的實(shí)戰神器,大家的溢美之詞不斷。詳情可見(jiàn)推文:
R語(yǔ)言爬蟲(chóng)神器:rvest包+SelectorGadget抓取鏈家上海二手房數據
但網(wǎng)路爬蟲(chóng)這個(gè)江湖很險惡,單靠一招rvest行走江湖必然兇多吉少,一不小心遇到哪些AJAX和動(dòng)態(tài)網(wǎng)頁(yè)憑僅把握rvest的諸位必將束手無(wú)策。本文小編就簡(jiǎn)單介紹下在用R語(yǔ)言進(jìn)行實(shí)際的網(wǎng)路數據抓取時(shí)怎樣將動(dòng)態(tài)數據給弄到手。
所謂動(dòng)態(tài)網(wǎng)頁(yè)和異步加載,在之前的系列4的時(shí)侯小編已通過(guò)AJAX介紹過(guò)了,簡(jiǎn)單而言就是我明明在網(wǎng)頁(yè)中聽(tīng)到了這個(gè)數據,但到后臺HTML中卻找不到了,這一般就是XHR在作怪。這時(shí)候我們就不要看原創(chuàng )的HTML數據了,需要進(jìn)行二次懇求,通過(guò)web開(kāi)發(fā)者工具找到真實(shí)懇求的url。下面小編就以?xún)蓚€(gè)網(wǎng)頁(yè)為例,分別通過(guò)GET和POST懇求領(lǐng)到動(dòng)態(tài)網(wǎng)頁(yè)數據,全過(guò)程主要使用httr包來(lái)實(shí)現,httr包堪稱(chēng)是RCurl包的精簡(jiǎn)版,說(shuō)其短小精悍也不為過(guò)。httr包與RCurl包在主要函數的區別如下所示:
GET懇求抓取陌陌好友列表數據
很早之前圈子里就聽(tīng)到過(guò)用Python抓取自己陌陌好友數據的案例分享,今天便以陌陌網(wǎng)頁(yè)版為例,探一探其網(wǎng)頁(yè)結構。首先登陸個(gè)人陌陌網(wǎng)頁(yè)版,右鍵打開(kāi)web開(kāi)發(fā)者工具,下來(lái)一大堆懇求:
簡(jiǎn)單找一下發(fā)覺(jué)網(wǎng)頁(yè)中的陌陌好友列表信息并沒(méi)有呈現在HTML 中,大概可以推斷陌陌好友數據是通過(guò)動(dòng)態(tài)加載來(lái)顯示的,所以直接定位到XHR中,經(jīng)過(guò)幾番嘗試,結合兩側的preview,我們會(huì )發(fā)覺(jué)大量整齊劃一的數據,所以二次懇求的url真的就是它了:
找到真正的url以后,接下來(lái)就是獲取懇求信息了,切換到Headers版塊,Header版塊下的4個(gè)子信息我們都須要關(guān)注,它們是我們構造爬蟲(chóng)懇求頭的關(guān)鍵。
從Header中我們可以看見(jiàn)該信息是通過(guò)GET方式懇求得到的,General信息下的Request URL,Request Method, Status Code; Response Headers信息下的Connection, Content-Type; Request Headers信息下的Accept, Cookie, Referer, User-Agent以及最后的Query String Parameters都是我們須要重點(diǎn)關(guān)注的。
找到相應的信息然后,我們便可以直接借助httr包在R中建立爬蟲(chóng)懇求:
<p>#傳入微信cookie信息<br />Cookie Accept: application/json<br />-> Content-Type: text/plain<br />-> User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0<br />-> Referer: https://wx.qq.com/<br />-> Connection: keep-alive<br />-> cookie: 我的微信cookie<br />-> <br /> Connection: keep-alive<br />-> cookie: 網(wǎng)易云課堂cookie<br />-> Content-Length: 69<br />-> <br />>> {"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":-1}<br /><br />
微信公眾號 文章的爬蟲(chóng)系統
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 242 次瀏覽 ? 2020-08-13 19:03
1、做了倆次爬蟲(chóng)了,第一次怕的鳳凰網(wǎng),那個(gè)沒(méi)有限制,隨便爬,所以也就對自動(dòng)化執行代碼模塊放松了提防,覺(jué)得很簡(jiǎn)單的,但是畢竟不是這樣的,我被這個(gè)問(wèn)題困惑了好幾天,差不多4天的一個(gè)樣子,因為搜狗做的限制,同一個(gè)ip獲取的次數多了,首先是出現驗證碼,其次是就是訪(fǎng)問(wèn)限制了,直接就是不能訪(fǎng)問(wèn),利用 request得到的就是訪(fǎng)問(wèn)次數過(guò)分頻繁,這樣子的提示,所以說(shuō)開(kāi)發(fā)過(guò)程中最頭痛的不是代碼的編撰,而是測試,寫(xiě)完代碼不能立刻測試,這種覺(jué)得相信大多數的程序員是不能喜歡的,我如今寫(xiě)的程序是每晚執行三次,這樣的一個(gè)頻度挺好,而且由于是多公眾號采集嘛,每個(gè)公眾號之間的間隔時(shí)間也的有,要不然同時(shí)訪(fǎng)問(wèn)十幾個(gè)公眾號的上百篇文章也是不現實(shí)的,說(shuō)到這兒插一句,怎么使每位公眾號怕去玩過(guò)后,等一段具體的時(shí)間,在執行下一個(gè),最后用的setInterval函數解決的,
每過(guò)80秒執行一個(gè)公眾號,把每次的執行代碼講到hello中,泡的有點(diǎn)遠了,收一收哈,說(shuō)說(shuō)cron這個(gè)包,自動(dòng)化執行,npm官網(wǎng)上只給了一個(gè)反例,但是我這個(gè)指桑拿可能是有點(diǎn)壓制的厲害,不能否玩卻理解他的用法,然后我說(shuō)理解不了怎樣辦啊,上網(wǎng)搜唄,百度,cron包的具體用法,一看,嚯,還很多,于是就看啊看啊,但是仔細以剖析就不是這么回事兒了,都是屁話(huà),沒(méi)哪些用,網(wǎng)上通常的用法中都帶有一個(gè)問(wèn)號,但是我加上問(wèn)號的時(shí)侯,就報錯了,所以說(shuō)都是胡扯,最后在朋友組的一個(gè)后端技術(shù)討論群中說(shuō)了一聲,還真有熱心的群友,給我找了一個(gè)鏈接,我進(jìn)去一看,試了一下,還行,所以呢,非常謝謝這個(gè)幫助我解惑的朋友,再次我把qq群號,和鏈接附上,方便正在看這篇文章的你學(xué)習,QQ群號:435012561,鏈接:,這個(gè)鏈接上面說(shuō)的挺好,至少能用,這里我挺好到一個(gè)問(wèn)題,就是timezone,我們之前用過(guò)一次,用的是紐約時(shí)間,但是此次顯著(zhù)不行啊,要用俺們中國的時(shí)間啊,但是我試了幾次上海的不行,重慶的可以,所以我就用了上海的。
2、這里要說(shuō)的是,從地址欄獲取參數的問(wèn)題,我上一個(gè)做的沒(méi)問(wèn)題,但是這個(gè)不知道如何就不行了,上一個(gè)從地址欄得到的是數字,但是這個(gè)得到的是字符串,再加上mongodb中的對數組的要求還是很?chē)栏竦?,所以一個(gè)分頁(yè)功能也困惑了我幾個(gè)小時(shí)吧,最后是如何解決的呢,是通過(guò)我加的一個(gè)mongodb的討論群,在里面問(wèn)了一句這是如何了,發(fā)了個(gè)截圖,里面就有一個(gè)熱心的網(wǎng)友說(shuō)你這顯著(zhù)是傳入的數據格式不對啊,一語(yǔ)驚醒夢(mèng)中人,我說(shuō)是啊,然后就把得到的參數,我用Number()函數處理了一下,讓string類(lèi)型的數字,變成了number類(lèi)型的數字,就好了,所以說(shuō)你們在用mongodb的時(shí)侯一定要注意儲存數據的格式,
3、mongodb查詢(xún)數據句子組織形式:
其實(shí)說(shuō)白了就是limit和skip倆個(gè)函數的使用,但是具體的格式可的看好了,還有我這個(gè)是接受的參數,不過(guò)mongo的參數接受也好弄直接寫(xiě)就好了,不用象sql那樣搞哪些${""}這種類(lèi)型的,后面的sort函數說(shuō)明了排序的方法,這里是設置的以ctime數組為標準,-1表示逆序,1表示亂序,
4、在本次代碼編撰中,我首次使用了try catch 這個(gè)補錯的形式,事實(shí)證明,還行,可以把時(shí)常的錯誤正常的復印下來(lái),但是不影響代碼的整體執行,或者是說(shuō)下一次執行,整體覺(jué)得非常好,
具體的使用方式,在try中倒入你要執行的代碼,在最后加上一行,throw Error();
然后給catch傳入一個(gè)參數e,在catch中可以復印好多個(gè)信息,我只復印了其中的一個(gè),e.message,
5、這次編碼過(guò)程中主要用到了anync包,其中的ansyc.each循環(huán),ansyc.waterfall執行完前面的才可以執行下邊的,而且說(shuō)謊給你下之間還可以從上至下傳遞參數,這個(gè)很重要,因為在本次編程中,每次獲取的內容不同,每次代碼執行的條件不同,即須要的參數也不同,即有可能下一次代碼的執行就須要用到上一次代碼執行得到的結果,所以說(shuō)這個(gè)anync包,真的是值得研究,他的每位方式都不同,有時(shí)候可以得到意想不到的療效。
6、在mysql中若果想要達到這樣一個(gè)療效,就是說(shuō),如果數據庫中早已存在了,那就不予理會(huì ),或者說(shuō)不重復儲存,如果數據庫中不存在,那么就儲存進(jìn)來(lái),很簡(jiǎn)單,直接把插入數據的insert 換成 replace 。但是在mongodb中,應該是沒(méi)有,或者說(shuō)是我還沒(méi)有發(fā)覺(jué),我是那么解決的,定義了一個(gè)開(kāi)關(guān),令這個(gè)開(kāi)關(guān)為真,每次儲存之前,先把所有的數據循環(huán)一遍,看看有沒(méi)有這條數據,如果有,讓開(kāi)關(guān)變?yōu)榧?,如果沒(méi)有,繼續執行,即判定此時(shí)開(kāi)關(guān)的真偽,如果是真的,那就執行插入操作,如果是假的,就不予理會(huì ),這就達到了類(lèi)似的療效,否則每次就會(huì )儲存大量的重復數據,
7、本次采集的核心,就是我文件中的common.js了,首先由于要采集,所以須要用到request包,采集到以后,要處理html格式的數據,使之可以使用類(lèi)jquery的操作,那么久用到了cheerio這個(gè)包,然后在循環(huán)采集的時(shí)侯,會(huì )用到anync.each這個(gè)方式,所以會(huì )用到async這個(gè)包,
7-1、
通過(guò)搜狗陌陌采集,就要剖析搜狗陌陌的路徑,每個(gè)公眾號的頁(yè)面的路徑是這樣的
%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=
這個(gè)是“這才是臺灣”的頁(yè)面的鏈接,經(jīng)過(guò)剖析,所有的公眾號的鏈接只有query前面的參數不同,但是query前面的參數是哪些呢,其實(shí)就是通過(guò)encodeURIComponent()這個(gè)函數轉化以后的“這才是臺灣”,所以說(shuō)都一樣,獲取那種公眾號,就將那種公眾號的名子編碼以后,動(dòng)態(tài)的組合成一個(gè)鏈接,訪(fǎng)問(wèn)就可以步入到每位鏈接上面了,但是這個(gè)鏈接只是懇求到了這個(gè)頁(yè)面,
并不是
這個(gè)頁(yè)面,所以還的進(jìn)一步處理,就是得到當前頁(yè)面的第一個(gè)內容的鏈接,即href
當得到了這個(gè)鏈接,就會(huì )發(fā)覺(jué)他有他的加密方法,其實(shí)很簡(jiǎn)單的,就是在鏈接上面的加了三個(gè)amp;把鏈接上面的這三個(gè)amp;替換為空,就好了,這也就是第一步,得到每一個(gè)公眾號的頁(yè)面鏈接,
7-2
得到鏈接以后,就要進(jìn)行訪(fǎng)問(wèn)了,即懇求,請求每位地址,得到每位地址的內容,但是每位頁(yè)面顯示的內容都不在頁(yè)面中,即html結構中,在js中藏著(zhù),所以要通過(guò)正則匹配,得到整篇文章的對象,然后就循環(huán)每位公眾號的這個(gè)對象,得到這個(gè)對象中的整篇文章的一些信息,包括title,thumb,abstract,URL,time,五個(gè)數組,但是我使用的代碼爛透了,盡然當時(shí)使用了
對象.屬性.foreach(function(item,index){
})
這種爛透了的形式,弄的最后好的在寫(xiě)一次循環(huán)才可以完全的得到每一個(gè)對象,否則只可以得到第一個(gè),在這里應當用async.each,或者async.foreach這倆中形式每種都可以啊,而且都是非常好用的形式。這樣的話(huà)買(mǎi)就得到了整篇文章的以上基本消息,
7-3、
第三個(gè)階段,就是步入到整篇文章的詳情頁(yè),獲得整篇文章的內容,點(diǎn)贊數,作者,公眾號,閱讀量等數據,在這里遇到的主要問(wèn)題是,人家的content直接在在js中,所有的img標簽都有問(wèn)題,他是以這些方式存在雨content中,但是這樣的話(huà),這樣的圖片在我們的網(wǎng)頁(yè)中不能被顯示,因為標簽存在問(wèn)題啊,html文檔不認識這樣的img標簽啊,所以這兒要進(jìn)行一些處理,把所有的用replace替換為
查看全部
差不多倆個(gè)禮拜了吧,一直在調試關(guān)于微信公眾號的文章爬蟲(chóng)系統,終于一切都好了,但是在這期間遇到了好多問(wèn)題,今天就來(lái)回顧一下,總結一下,希望有用到的小伙伴可以學(xué)習學(xué)習。
1、做了倆次爬蟲(chóng)了,第一次怕的鳳凰網(wǎng),那個(gè)沒(méi)有限制,隨便爬,所以也就對自動(dòng)化執行代碼模塊放松了提防,覺(jué)得很簡(jiǎn)單的,但是畢竟不是這樣的,我被這個(gè)問(wèn)題困惑了好幾天,差不多4天的一個(gè)樣子,因為搜狗做的限制,同一個(gè)ip獲取的次數多了,首先是出現驗證碼,其次是就是訪(fǎng)問(wèn)限制了,直接就是不能訪(fǎng)問(wèn),利用 request得到的就是訪(fǎng)問(wèn)次數過(guò)分頻繁,這樣子的提示,所以說(shuō)開(kāi)發(fā)過(guò)程中最頭痛的不是代碼的編撰,而是測試,寫(xiě)完代碼不能立刻測試,這種覺(jué)得相信大多數的程序員是不能喜歡的,我如今寫(xiě)的程序是每晚執行三次,這樣的一個(gè)頻度挺好,而且由于是多公眾號采集嘛,每個(gè)公眾號之間的間隔時(shí)間也的有,要不然同時(shí)訪(fǎng)問(wèn)十幾個(gè)公眾號的上百篇文章也是不現實(shí)的,說(shuō)到這兒插一句,怎么使每位公眾號怕去玩過(guò)后,等一段具體的時(shí)間,在執行下一個(gè),最后用的setInterval函數解決的,

每過(guò)80秒執行一個(gè)公眾號,把每次的執行代碼講到hello中,泡的有點(diǎn)遠了,收一收哈,說(shuō)說(shuō)cron這個(gè)包,自動(dòng)化執行,npm官網(wǎng)上只給了一個(gè)反例,但是我這個(gè)指桑拿可能是有點(diǎn)壓制的厲害,不能否玩卻理解他的用法,然后我說(shuō)理解不了怎樣辦啊,上網(wǎng)搜唄,百度,cron包的具體用法,一看,嚯,還很多,于是就看啊看啊,但是仔細以剖析就不是這么回事兒了,都是屁話(huà),沒(méi)哪些用,網(wǎng)上通常的用法中都帶有一個(gè)問(wèn)號,但是我加上問(wèn)號的時(shí)侯,就報錯了,所以說(shuō)都是胡扯,最后在朋友組的一個(gè)后端技術(shù)討論群中說(shuō)了一聲,還真有熱心的群友,給我找了一個(gè)鏈接,我進(jìn)去一看,試了一下,還行,所以呢,非常謝謝這個(gè)幫助我解惑的朋友,再次我把qq群號,和鏈接附上,方便正在看這篇文章的你學(xué)習,QQ群號:435012561,鏈接:,這個(gè)鏈接上面說(shuō)的挺好,至少能用,這里我挺好到一個(gè)問(wèn)題,就是timezone,我們之前用過(guò)一次,用的是紐約時(shí)間,但是此次顯著(zhù)不行啊,要用俺們中國的時(shí)間啊,但是我試了幾次上海的不行,重慶的可以,所以我就用了上海的。
2、這里要說(shuō)的是,從地址欄獲取參數的問(wèn)題,我上一個(gè)做的沒(méi)問(wèn)題,但是這個(gè)不知道如何就不行了,上一個(gè)從地址欄得到的是數字,但是這個(gè)得到的是字符串,再加上mongodb中的對數組的要求還是很?chē)栏竦?,所以一個(gè)分頁(yè)功能也困惑了我幾個(gè)小時(shí)吧,最后是如何解決的呢,是通過(guò)我加的一個(gè)mongodb的討論群,在里面問(wèn)了一句這是如何了,發(fā)了個(gè)截圖,里面就有一個(gè)熱心的網(wǎng)友說(shuō)你這顯著(zhù)是傳入的數據格式不對啊,一語(yǔ)驚醒夢(mèng)中人,我說(shuō)是啊,然后就把得到的參數,我用Number()函數處理了一下,讓string類(lèi)型的數字,變成了number類(lèi)型的數字,就好了,所以說(shuō)你們在用mongodb的時(shí)侯一定要注意儲存數據的格式,
3、mongodb查詢(xún)數據句子組織形式:

其實(shí)說(shuō)白了就是limit和skip倆個(gè)函數的使用,但是具體的格式可的看好了,還有我這個(gè)是接受的參數,不過(guò)mongo的參數接受也好弄直接寫(xiě)就好了,不用象sql那樣搞哪些${""}這種類(lèi)型的,后面的sort函數說(shuō)明了排序的方法,這里是設置的以ctime數組為標準,-1表示逆序,1表示亂序,
4、在本次代碼編撰中,我首次使用了try catch 這個(gè)補錯的形式,事實(shí)證明,還行,可以把時(shí)常的錯誤正常的復印下來(lái),但是不影響代碼的整體執行,或者是說(shuō)下一次執行,整體覺(jué)得非常好,
具體的使用方式,在try中倒入你要執行的代碼,在最后加上一行,throw Error();
然后給catch傳入一個(gè)參數e,在catch中可以復印好多個(gè)信息,我只復印了其中的一個(gè),e.message,

5、這次編碼過(guò)程中主要用到了anync包,其中的ansyc.each循環(huán),ansyc.waterfall執行完前面的才可以執行下邊的,而且說(shuō)謊給你下之間還可以從上至下傳遞參數,這個(gè)很重要,因為在本次編程中,每次獲取的內容不同,每次代碼執行的條件不同,即須要的參數也不同,即有可能下一次代碼的執行就須要用到上一次代碼執行得到的結果,所以說(shuō)這個(gè)anync包,真的是值得研究,他的每位方式都不同,有時(shí)候可以得到意想不到的療效。
6、在mysql中若果想要達到這樣一個(gè)療效,就是說(shuō),如果數據庫中早已存在了,那就不予理會(huì ),或者說(shuō)不重復儲存,如果數據庫中不存在,那么就儲存進(jìn)來(lái),很簡(jiǎn)單,直接把插入數據的insert 換成 replace 。但是在mongodb中,應該是沒(méi)有,或者說(shuō)是我還沒(méi)有發(fā)覺(jué),我是那么解決的,定義了一個(gè)開(kāi)關(guān),令這個(gè)開(kāi)關(guān)為真,每次儲存之前,先把所有的數據循環(huán)一遍,看看有沒(méi)有這條數據,如果有,讓開(kāi)關(guān)變?yōu)榧?,如果沒(méi)有,繼續執行,即判定此時(shí)開(kāi)關(guān)的真偽,如果是真的,那就執行插入操作,如果是假的,就不予理會(huì ),這就達到了類(lèi)似的療效,否則每次就會(huì )儲存大量的重復數據,
7、本次采集的核心,就是我文件中的common.js了,首先由于要采集,所以須要用到request包,采集到以后,要處理html格式的數據,使之可以使用類(lèi)jquery的操作,那么久用到了cheerio這個(gè)包,然后在循環(huán)采集的時(shí)侯,會(huì )用到anync.each這個(gè)方式,所以會(huì )用到async這個(gè)包,
7-1、
通過(guò)搜狗陌陌采集,就要剖析搜狗陌陌的路徑,每個(gè)公眾號的頁(yè)面的路徑是這樣的
%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=
這個(gè)是“這才是臺灣”的頁(yè)面的鏈接,經(jīng)過(guò)剖析,所有的公眾號的鏈接只有query前面的參數不同,但是query前面的參數是哪些呢,其實(shí)就是通過(guò)encodeURIComponent()這個(gè)函數轉化以后的“這才是臺灣”,所以說(shuō)都一樣,獲取那種公眾號,就將那種公眾號的名子編碼以后,動(dòng)態(tài)的組合成一個(gè)鏈接,訪(fǎng)問(wèn)就可以步入到每位鏈接上面了,但是這個(gè)鏈接只是懇求到了這個(gè)頁(yè)面,

并不是

這個(gè)頁(yè)面,所以還的進(jìn)一步處理,就是得到當前頁(yè)面的第一個(gè)內容的鏈接,即href

當得到了這個(gè)鏈接,就會(huì )發(fā)覺(jué)他有他的加密方法,其實(shí)很簡(jiǎn)單的,就是在鏈接上面的加了三個(gè)amp;把鏈接上面的這三個(gè)amp;替換為空,就好了,這也就是第一步,得到每一個(gè)公眾號的頁(yè)面鏈接,
7-2
得到鏈接以后,就要進(jìn)行訪(fǎng)問(wèn)了,即懇求,請求每位地址,得到每位地址的內容,但是每位頁(yè)面顯示的內容都不在頁(yè)面中,即html結構中,在js中藏著(zhù),所以要通過(guò)正則匹配,得到整篇文章的對象,然后就循環(huán)每位公眾號的這個(gè)對象,得到這個(gè)對象中的整篇文章的一些信息,包括title,thumb,abstract,URL,time,五個(gè)數組,但是我使用的代碼爛透了,盡然當時(shí)使用了
對象.屬性.foreach(function(item,index){
})
這種爛透了的形式,弄的最后好的在寫(xiě)一次循環(huán)才可以完全的得到每一個(gè)對象,否則只可以得到第一個(gè),在這里應當用async.each,或者async.foreach這倆中形式每種都可以啊,而且都是非常好用的形式。這樣的話(huà)買(mǎi)就得到了整篇文章的以上基本消息,
7-3、
第三個(gè)階段,就是步入到整篇文章的詳情頁(yè),獲得整篇文章的內容,點(diǎn)贊數,作者,公眾號,閱讀量等數據,在這里遇到的主要問(wèn)題是,人家的content直接在在js中,所有的img標簽都有問(wèn)題,他是以這些方式存在雨content中,但是這樣的話(huà),這樣的圖片在我們的網(wǎng)頁(yè)中不能被顯示,因為標簽存在問(wèn)題啊,html文檔不認識這樣的img標簽啊,所以這兒要進(jìn)行一些處理,把所有的用replace替換為
微信公眾號推送信息爬取---python爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 160 次瀏覽 ? 2020-08-13 18:34
利用搜狗的陌陌搜索抓取指定公眾號的最新一條推送,并保存相應的網(wǎng)頁(yè)至本地。
注意點(diǎn)搜狗陌陌獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(JavaScript渲染),使用requests.get()獲取的內容是不含推送消息的,這里使用selenium+PhantomJS處理代碼
#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
參考輸出
分析鏈接獲取首先步入搜狗的陌陌搜索頁(yè)面,在地址欄中提取須要的部份鏈接,字符串聯(lián)接公眾號名稱(chēng),即可生成懇求鏈接針對靜態(tài)網(wǎng)頁(yè),利用requests獲取html文件,再用BeautifulSoup選擇須要的內容針對動(dòng)態(tài)網(wǎng)頁(yè),利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇須要的內容遇見(jiàn)驗證碼(CAPTCHA),輸出提示。此版本代碼沒(méi)有對驗證碼做實(shí)際處理,需要人為訪(fǎng)問(wèn)后,再跑程序,才能避免驗證碼。文件寫(xiě)入使用os.path.join()構造儲存路徑可以提升通用性。比如Windows路徑分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通過(guò)該函數能依據平臺進(jìn)行手動(dòng)轉換。open()使用b(binary mode)參數同樣為了提升通用性(適應Windows)使用datetime.now()獲取當前時(shí)間進(jìn)行命名,并通過(guò)strftime()格式化時(shí)間(函數名中的f代表format),具體使用參考下表(摘自 Automate the Boring Stuff with Python)
參考鏈接:文件夾創(chuàng )建: 異常處理的使用: enumerate的使用: open()使用b參數理由: 查看全部
問(wèn)題描述
利用搜狗的陌陌搜索抓取指定公眾號的最新一條推送,并保存相應的網(wǎng)頁(yè)至本地。
注意點(diǎn)搜狗陌陌獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(JavaScript渲染),使用requests.get()獲取的內容是不含推送消息的,這里使用selenium+PhantomJS處理代碼
#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
參考輸出


分析鏈接獲取首先步入搜狗的陌陌搜索頁(yè)面,在地址欄中提取須要的部份鏈接,字符串聯(lián)接公眾號名稱(chēng),即可生成懇求鏈接針對靜態(tài)網(wǎng)頁(yè),利用requests獲取html文件,再用BeautifulSoup選擇須要的內容針對動(dòng)態(tài)網(wǎng)頁(yè),利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇須要的內容遇見(jiàn)驗證碼(CAPTCHA),輸出提示。此版本代碼沒(méi)有對驗證碼做實(shí)際處理,需要人為訪(fǎng)問(wèn)后,再跑程序,才能避免驗證碼。文件寫(xiě)入使用os.path.join()構造儲存路徑可以提升通用性。比如Windows路徑分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通過(guò)該函數能依據平臺進(jìn)行手動(dòng)轉換。open()使用b(binary mode)參數同樣為了提升通用性(適應Windows)使用datetime.now()獲取當前時(shí)間進(jìn)行命名,并通過(guò)strftime()格式化時(shí)間(函數名中的f代表format),具體使用參考下表(摘自 Automate the Boring Stuff with Python)

參考鏈接:文件夾創(chuàng )建: 異常處理的使用: enumerate的使用: open()使用b參數理由:
Python爬取微信公眾號文章、點(diǎn)贊數
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 215 次瀏覽 ? 2020-08-13 18:31
2、3 設置Fiddler 并保存配置
微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據req_id 、 pass_ticket 、 appmsg_tojen
微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據cookie 和user-agent
最后恢復Fiddler的配置,會(huì )報錯的
END?。?!前面的獲取工作就結束了…
一、獲取cookie
# -*- coding: utf-8 -*-
import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')
post = {}
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)
driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('訂閱號賬號')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('訂閱號密碼')
# 自動(dòng)輸入密碼后點(diǎn)擊記住密碼
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 掃碼
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
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('cookie write ok ...')
二、獲取文章數據(文章列表寫(xiě)入數據庫)
<p># -*- coding: utf-8 -*-
import time, datetime
import json
import requests
import re
import random
import MySQLdb
#設置要爬取的公眾號列表
gzlist=['ckxxwx']
# 打開(kāi)數據庫連接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 數據的開(kāi)始日期 - 結束日期
start_data = '20190630';
end_data = '20190430'
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 獲取閱讀數和點(diǎn)贊數
def getMoreInfo(link, query):
pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"
if query == 'ckxxwx':
appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"
phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"
mid = link.split("&")[1].split("=")[1]
idx = link.split("&")[2].split("=")[1]
sn = link.split("&")[3].split("=")[1]
_biz = link.split("&")[0].split("_biz=")[1]
# 目標url
url = "http://mp.weixin.qq.com/mp/getappmsgext"
# 添加Cookie避免登陸操作,這里的"User-Agent"最好為手機瀏覽器的標識
headers = {
"Cookie": phoneCookie,
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400"
}
# 添加data,`req_id`、`pass_ticket`分別對應文章的信息,從fiddler復制即可。
data = {
"is_only_read": "1",
"is_temp_url": "0",
"appmsg_type": "9",
'reward_uin_count': '0'
}
params = {
"__biz": _biz,
"mid": mid,
"sn": sn,
"idx": idx,
"key": '777',
"pass_ticket": pass_ticket,
"appmsg_token": appmsg_token,
"uin": '777',
"wxtoken": "777"
}
# 使用post方法進(jìn)行提交
content = requests.post(url, headers=headers, data=data, params=params).json()
# 提取其中的閱讀數和點(diǎn)贊數
if 'appmsgstat' in content:
readNum = content["appmsgstat"]["read_num"]
likeNum = content["appmsgstat"]["like_num"]
else:
print('請求參數過(guò)期!')
# 歇10s,防止被封
time.sleep(10)
return readNum, likeNum
#爬取微信公眾號文章,并存在本地文本中
def get_content(query):
#query為要爬取的公眾號名稱(chēng)
#公眾號主頁(yè)
url = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(2)
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
if appmsg_response.json().get('base_resp').get('ret') == 200013:
print('搜索公眾號文章操作頻繁,?。?!')
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0 # 根據內容自定義
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
time.sleep(5)
#獲取每一頁(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')
for item in fakeid_list:
content_link=item.get('link')
content_title=item.get('title')
update_time=item.get('update_time')
timeArray = time.localtime(update_time)
DataTime = time.strftime("%Y%m%d", timeArray)
print(DataTime)
Yearsmonth = time.strftime("%Y%m", timeArray)
if DataTime 查看全部
2、2 關(guān)注須要爬取的公眾號
2、3 設置Fiddler 并保存配置

微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據req_id 、 pass_ticket 、 appmsg_tojen


微信客戶(hù)端懇求公眾號文章, fiddler抓取到的數據cookie 和user-agent

最后恢復Fiddler的配置,會(huì )報錯的
END?。?!前面的獲取工作就結束了…
一、獲取cookie
# -*- coding: utf-8 -*-
import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')
post = {}
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)
driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('訂閱號賬號')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('訂閱號密碼')
# 自動(dòng)輸入密碼后點(diǎn)擊記住密碼
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 掃碼
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
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('cookie write ok ...')
二、獲取文章數據(文章列表寫(xiě)入數據庫)

<p># -*- coding: utf-8 -*-
import time, datetime
import json
import requests
import re
import random
import MySQLdb
#設置要爬取的公眾號列表
gzlist=['ckxxwx']
# 打開(kāi)數據庫連接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 數據的開(kāi)始日期 - 結束日期
start_data = '20190630';
end_data = '20190430'
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 獲取閱讀數和點(diǎn)贊數
def getMoreInfo(link, query):
pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"
if query == 'ckxxwx':
appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"
phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"
mid = link.split("&")[1].split("=")[1]
idx = link.split("&")[2].split("=")[1]
sn = link.split("&")[3].split("=")[1]
_biz = link.split("&")[0].split("_biz=")[1]
# 目標url
url = "http://mp.weixin.qq.com/mp/getappmsgext"
# 添加Cookie避免登陸操作,這里的"User-Agent"最好為手機瀏覽器的標識
headers = {
"Cookie": phoneCookie,
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400"
}
# 添加data,`req_id`、`pass_ticket`分別對應文章的信息,從fiddler復制即可。
data = {
"is_only_read": "1",
"is_temp_url": "0",
"appmsg_type": "9",
'reward_uin_count': '0'
}
params = {
"__biz": _biz,
"mid": mid,
"sn": sn,
"idx": idx,
"key": '777',
"pass_ticket": pass_ticket,
"appmsg_token": appmsg_token,
"uin": '777',
"wxtoken": "777"
}
# 使用post方法進(jìn)行提交
content = requests.post(url, headers=headers, data=data, params=params).json()
# 提取其中的閱讀數和點(diǎn)贊數
if 'appmsgstat' in content:
readNum = content["appmsgstat"]["read_num"]
likeNum = content["appmsgstat"]["like_num"]
else:
print('請求參數過(guò)期!')
# 歇10s,防止被封
time.sleep(10)
return readNum, likeNum
#爬取微信公眾號文章,并存在本地文本中
def get_content(query):
#query為要爬取的公眾號名稱(chēng)
#公眾號主頁(yè)
url = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(2)
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
if appmsg_response.json().get('base_resp').get('ret') == 200013:
print('搜索公眾號文章操作頻繁,?。?!')
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0 # 根據內容自定義
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
time.sleep(5)
#獲取每一頁(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')
for item in fakeid_list:
content_link=item.get('link')
content_title=item.get('title')
update_time=item.get('update_time')
timeArray = time.localtime(update_time)
DataTime = time.strftime("%Y%m%d", timeArray)
print(DataTime)
Yearsmonth = time.strftime("%Y%m", timeArray)
if DataTime
Python 抓取微信公眾號文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 195 次瀏覽 ? 2020-08-11 15:51
然后按照時(shí)效性鏈接獲取文章內容,并從中提取參數信息:
from html import unescape from urllib.parse import urlencode def weixin_params(link): html = req.get(link) rParams = r'var (biz =.*?".*?");\s*var (sn =.*?".*?");\s*var (mid =.*?".*?");\s*var (idx =.*?".*?");' params = re.findall(rParams, html) if len(params) == 0: return None return {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]} for (link, title, abstract) in infos: title = unescape(self.remove_tag(title)) abstract = unescape(self.remove_tag(abstract)) params = weixin_params(link) if params is not None: link = "http://mp.weixin.qq.com/s?" + urlencode(params) print(link, title, abstract)
由此可以搜集到以 Python 為關(guān)鍵詞的微信公眾號文章,包括鏈接、標題和摘要。如需文章內容也可以隨時(shí)通過(guò)鏈接提取,但是為了尊重創(chuàng )作者,請在抓取文章正文的時(shí)侯請復查原創(chuàng )信息并合理標明作者及引用信息。
來(lái)自:#rd 查看全部
def remove_tags(s): return re.sub(r'', '', s)
然后按照時(shí)效性鏈接獲取文章內容,并從中提取參數信息:
from html import unescape from urllib.parse import urlencode def weixin_params(link): html = req.get(link) rParams = r'var (biz =.*?".*?");\s*var (sn =.*?".*?");\s*var (mid =.*?".*?");\s*var (idx =.*?".*?");' params = re.findall(rParams, html) if len(params) == 0: return None return {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]} for (link, title, abstract) in infos: title = unescape(self.remove_tag(title)) abstract = unescape(self.remove_tag(abstract)) params = weixin_params(link) if params is not None: link = "http://mp.weixin.qq.com/s?" + urlencode(params) print(link, title, abstract)
由此可以搜集到以 Python 為關(guān)鍵詞的微信公眾號文章,包括鏈接、標題和摘要。如需文章內容也可以隨時(shí)通過(guò)鏈接提取,但是為了尊重創(chuàng )作者,請在抓取文章正文的時(shí)侯請復查原創(chuàng )信息并合理標明作者及引用信息。
來(lái)自:#rd
微信公眾號采集小爬蟲(chóng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 300 次瀏覽 ? 2020-08-11 12:49
## 公眾號爬取形式
爬取公眾號目前主流的方案主要有兩種,一種是通過(guò)搜狗搜索微信公眾號的頁(yè)面去找到文章地址,再去爬取具體文章內容;第二種是通過(guò)注冊公眾號之后通過(guò)公眾號的搜索插口去查詢(xún)到文章地址,然后再按照地址去爬文章內容。
這兩種方案各有優(yōu)缺點(diǎn),通過(guò)搜狗搜索來(lái)做雖然核心思路就是通過(guò)request模擬搜狗搜索公眾號,然后解析搜索結果頁(yè)面,再依照公眾號主頁(yè)地址爬蟲(chóng),爬取文章明細信息,但是這兒須要注意下,因為搜狗和騰訊之間的合同問(wèn)題,只能顯示最新的10條文章,沒(méi)辦法領(lǐng)到所有的文章。如果要領(lǐng)到所有文章的同學(xué)可能要采用第二種形式了。第二種方法的缺點(diǎn)就是要注冊公眾號通過(guò)騰訊認證,流程麻煩些,通過(guò)調用插口公眾號查詢(xún)插口查詢(xún),但是翻頁(yè)須要通過(guò)selenium去模擬滑動(dòng)翻頁(yè)操作,整個(gè)過(guò)程還是很麻煩的。因為我的項目里不需要歷史文章,所以我采用通過(guò)搜狗搜索去做爬取公眾號的功能。
爬取近來(lái)10篇公眾號文章
python須要依賴(lài)的三方庫如下:
urllib、pyquery、requests、selenium
具體的邏輯都寫(xiě)在注釋里了,沒(méi)有非常復雜的地方。
爬蟲(chóng)核心類(lèi)
```python
#!/usr/bin/python
# coding: utf-8
import sys
?
reload(sys)
sys.setdefaultencoding('utf-8')
?
from urllib import quote
from pyquery import PyQuery as pq
?
import requests
import time
import re
import os
?
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
?
?
# 搜索入口地址,以公眾為關(guān)鍵字搜索該公眾號
def get_search_result_by_keywords(sogou_search_url):
????# 爬蟲(chóng)偽裝頭部設置
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
?
????# 設置操作超時(shí)時(shí)長(cháng)
????timeout = 5
????# 爬蟲(chóng)模擬在一個(gè)request.session中完成
????s = requests.Session()
????log(u'搜索地址為:%s' % sogou_search_url)
????return s.get(sogou_search_url, headers=headers, timeout=timeout).content
?
?
# 獲得公眾號主頁(yè)地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
????doc = pq(sougou_search_html)
????return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
?
?
# 使用webdriver 加載公眾號主頁(yè)內容,主要是js渲染的部分
def get_selenium_js_html(url):
????options = Options()
????options.add_argument('-headless')? # 無(wú)頭參數
????driver = Chrome(executable_path='chromedriver', chrome_options=options)
????wait = WebDriverWait(driver, timeout=10)
?
????driver.get(url)
????time.sleep(3)
????# 執行js得到整個(gè)頁(yè)面內容
????html = driver.execute_script("return document.documentElement.outerHTML")
????driver.close()
????return html
?
?
# 獲取公眾號文章內容
def parse_wx_articles_by_html(selenium_html):
????doc = pq(selenium_html)
????return doc('div[class="weui_media_box appmsg"]')
?
?
# 將獲取到的文章轉換為字典
def switch_arctiles_to_list(articles):
????# 定義存貯變量
????articles_list = []
????i = 1
?
????# 遍歷找到的文章,解析里面的內容
????if articles:
????????for article in articles.items():
????????????log(u'開(kāi)始整合(%d/%d)' % (i, len(articles)))
????????????# 處理單個(gè)文章
????????????articles_list.append(parse_one_article(article))
????????????i += 1
????return articles_list
?
?
# 解析單篇文章
def parse_one_article(article):
????article_dict = {}
?
????# 獲取標題
????title = article('h4[class="weui_media_title"]').text().strip()
????###log(u'標題是: %s' % title)
????# 獲取標題對應的地址
????url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
????log(u'地址為: %s' % url)
????# 獲取概要內容
????summary = article('.weui_media_desc').text()
????log(u'文章簡(jiǎn)述: %s' % summary)
????# 獲取文章發(fā)表時(shí)間
????date = article('.weui_media_extra_info').text().strip()
????log(u'發(fā)表時(shí)間為: %s' % date)
????# 獲取封面圖片
????pic = parse_cover_pic(article)
?
????# 返回字典數據
????return {
????????'title': title,
????????'url': url,
????????'summary': summary,
????????'date': date,
????????'pic': pic
????}
?
?
# 查找封面圖片,獲取封面圖片地址
def parse_cover_pic(article):
????pic = article('.weui_media_hd').attr('style')
?
????p = re.compile(r'background-image:url\((.*?)\)')
????rs = p.findall(pic)
????log(u'封面圖片是:%s ' % rs[0] if len(rs) > 0 else '')
?
????return rs[0] if len(rs) > 0 else ''
?
?
# 自定義log函數,主要是加上時(shí)間
def log(msg):
????print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
?
?
# 驗證函數
def need_verify(selenium_html):
????' 有時(shí)候對方會(huì )封鎖ip,這里做一下判斷,檢測html中是否包含id=verify_change的標簽,有的話(huà),代表被重定向了,提醒過(guò)一陣子重試 '
????return pq(selenium_html)('#verify_change').text() != ''
?
?
# 創(chuàng )建公眾號命名的文件夾
def create_dir(keywords):
????if not os.path.exists(keywords):
????????os.makedirs(keywords)
?
????????# 爬蟲(chóng)主函數
?
?
def run(keywords):
????' 爬蟲(chóng)入口函數 '
????# Step 0 :? 創(chuàng )建公眾號命名的文件夾
????create_dir(keywords)
?
????# 搜狐微信搜索鏈接入口
????sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
????????keywords)
?
????# Step 1:GET請求到搜狗微信引擎,以微信公眾號英文名稱(chēng)作為查詢(xún)關(guān)鍵字
????log(u'開(kāi)始獲取,微信公眾號英文名為:%s' % keywords)
????log(u'開(kāi)始調用sougou搜索引擎')
????sougou_search_html = get_search_result_by_keywords(sogou_search_url)
?
????# Step 2:從搜索結果頁(yè)中解析出公眾號主頁(yè)鏈接
????log(u'獲取sougou_search_html成功,開(kāi)始抓取公眾號對應的主頁(yè)wx_url')
????wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
????log(u'獲取wx_url成功,%s' % wx_url)
?
????# Step 3:Selenium+PhantomJs獲取js異步加載渲染后的html
????log(u'開(kāi)始調用selenium渲染html')
????selenium_html = get_selenium_js_html(wx_url)
?
????# Step 4: 檢測目標網(wǎng)站是否進(jìn)行了封鎖
????if need_verify(selenium_html):
????????log(u'爬蟲(chóng)被目標網(wǎng)站封鎖,請稍后再試')
????else:
????????# Step 5: 使用PyQuery,從Step 3獲取的html中解析出公眾號文章列表的數據
????????log(u'調用selenium渲染html完成,開(kāi)始解析公眾號文章')
????????articles = parse_wx_articles_by_html(selenium_html)
????????log(u'抓取到微信文章%d篇' % len(articles))
?
????????# Step 6: 把微信文章數據封裝成字典的list
????????log(u'開(kāi)始整合微信文章數據為字典')
????????articles_list = switch_arctiles_to_list(articles)
????????return [content['title'] for content in articles_list]
?
```
?
main入口函數:
?
```python
# coding: utf8
import spider_weixun_by_sogou
?
if __name__ == '__main__':
?
????gongzhonghao = raw_input(u'input weixin gongzhonghao:')
????if not gongzhonghao:
????????gongzhonghao = 'spider'
????text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
?
????print text
爬取公眾號注意事項
下面這3個(gè)是我在爬取的過(guò)程中遇見(jiàn)的一些問(wèn)題,希望能幫到你們避坑。
1. Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
網(wǎng)上好多的文章都還在使用PhantomJS,其實(shí)從今年Selenium就早已不支持PhantomJS了,現在使用Selenium初始化瀏覽器的話(huà)須要使用webdriver初始化無(wú)頭參數的Chrome或則Firefox driver。
具體可以參考官網(wǎng)鏈接:
2. Can not connect to the Service chromedriver/firefoxdriver
在開(kāi)發(fā)過(guò)程中還碰到這個(gè)坑,這個(gè)問(wèn)題通常有兩種可能性,一種是沒(méi)有配置chromedriver或則geckodriver的環(huán)境變量,這里須要注意下將chromedriver或則geckodriver文件一定要配置環(huán)境變量到PATH下,或者干脆粗魯一點(diǎn)直接將這兩個(gè)文件復制到/usr/bin目錄下;
還有種可能是沒(méi)有配置hosts,如果你們發(fā)覺(jué)這個(gè)問(wèn)題復查下自己的hosts文件是不是沒(méi)有配置`127.0.0.1 localhost`,只要配置上就好了。
這里還有一點(diǎn)要注意的就是使用chrome瀏覽器的話(huà),還要注意chrome瀏覽器版本和chromedriver的對應關(guān)系,可以在這篇文章中查看也可以翻墻去google官網(wǎng)查看最新的對應關(guān)系。
3. 防盜鏈
微信公眾號對文章中的圖片做了防盜鏈處理,所以假如在公眾號和小程序、PC瀏覽器以外的地方是未能顯示圖片的,這里推薦你們可以看下這篇文章了解下怎樣處理陌陌的防盜鏈。
總結
好了前面說(shuō)了那么多,大家最關(guān)心的就是源代碼,這里放出github地址:,好用的話(huà)記得strar。
另外附上作品項目: 查看全部
最近在做一個(gè)自己的項目,涉及到須要通過(guò)python爬取微信公眾號的文章,因為陌陌奇特一些手段,導致難以直接爬取,研究了一些文章大概有了思路,并且網(wǎng)上目前能搜到的方案思路都沒(méi)啥問(wèn)題,但是上面的代碼由于一些三方庫的變動(dòng)基本都不能用了,這篇文章寫(xiě)給須要爬取公眾號文章的朋友們,文章最后也會(huì )提供python源碼下載。
## 公眾號爬取形式
爬取公眾號目前主流的方案主要有兩種,一種是通過(guò)搜狗搜索微信公眾號的頁(yè)面去找到文章地址,再去爬取具體文章內容;第二種是通過(guò)注冊公眾號之后通過(guò)公眾號的搜索插口去查詢(xún)到文章地址,然后再按照地址去爬文章內容。
這兩種方案各有優(yōu)缺點(diǎn),通過(guò)搜狗搜索來(lái)做雖然核心思路就是通過(guò)request模擬搜狗搜索公眾號,然后解析搜索結果頁(yè)面,再依照公眾號主頁(yè)地址爬蟲(chóng),爬取文章明細信息,但是這兒須要注意下,因為搜狗和騰訊之間的合同問(wèn)題,只能顯示最新的10條文章,沒(méi)辦法領(lǐng)到所有的文章。如果要領(lǐng)到所有文章的同學(xué)可能要采用第二種形式了。第二種方法的缺點(diǎn)就是要注冊公眾號通過(guò)騰訊認證,流程麻煩些,通過(guò)調用插口公眾號查詢(xún)插口查詢(xún),但是翻頁(yè)須要通過(guò)selenium去模擬滑動(dòng)翻頁(yè)操作,整個(gè)過(guò)程還是很麻煩的。因為我的項目里不需要歷史文章,所以我采用通過(guò)搜狗搜索去做爬取公眾號的功能。
爬取近來(lái)10篇公眾號文章
python須要依賴(lài)的三方庫如下:
urllib、pyquery、requests、selenium
具體的邏輯都寫(xiě)在注釋里了,沒(méi)有非常復雜的地方。
爬蟲(chóng)核心類(lèi)
```python
#!/usr/bin/python
# coding: utf-8
import sys
?
reload(sys)
sys.setdefaultencoding('utf-8')
?
from urllib import quote
from pyquery import PyQuery as pq
?
import requests
import time
import re
import os
?
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
?
?
# 搜索入口地址,以公眾為關(guān)鍵字搜索該公眾號
def get_search_result_by_keywords(sogou_search_url):
????# 爬蟲(chóng)偽裝頭部設置
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
?
????# 設置操作超時(shí)時(shí)長(cháng)
????timeout = 5
????# 爬蟲(chóng)模擬在一個(gè)request.session中完成
????s = requests.Session()
????log(u'搜索地址為:%s' % sogou_search_url)
????return s.get(sogou_search_url, headers=headers, timeout=timeout).content
?
?
# 獲得公眾號主頁(yè)地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
????doc = pq(sougou_search_html)
????return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
?
?
# 使用webdriver 加載公眾號主頁(yè)內容,主要是js渲染的部分
def get_selenium_js_html(url):
????options = Options()
????options.add_argument('-headless')? # 無(wú)頭參數
????driver = Chrome(executable_path='chromedriver', chrome_options=options)
????wait = WebDriverWait(driver, timeout=10)
?
????driver.get(url)
????time.sleep(3)
????# 執行js得到整個(gè)頁(yè)面內容
????html = driver.execute_script("return document.documentElement.outerHTML")
????driver.close()
????return html
?
?
# 獲取公眾號文章內容
def parse_wx_articles_by_html(selenium_html):
????doc = pq(selenium_html)
????return doc('div[class="weui_media_box appmsg"]')
?
?
# 將獲取到的文章轉換為字典
def switch_arctiles_to_list(articles):
????# 定義存貯變量
????articles_list = []
????i = 1
?
????# 遍歷找到的文章,解析里面的內容
????if articles:
????????for article in articles.items():
????????????log(u'開(kāi)始整合(%d/%d)' % (i, len(articles)))
????????????# 處理單個(gè)文章
????????????articles_list.append(parse_one_article(article))
????????????i += 1
????return articles_list
?
?
# 解析單篇文章
def parse_one_article(article):
????article_dict = {}
?
????# 獲取標題
????title = article('h4[class="weui_media_title"]').text().strip()
????###log(u'標題是: %s' % title)
????# 獲取標題對應的地址
????url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
????log(u'地址為: %s' % url)
????# 獲取概要內容
????summary = article('.weui_media_desc').text()
????log(u'文章簡(jiǎn)述: %s' % summary)
????# 獲取文章發(fā)表時(shí)間
????date = article('.weui_media_extra_info').text().strip()
????log(u'發(fā)表時(shí)間為: %s' % date)
????# 獲取封面圖片
????pic = parse_cover_pic(article)
?
????# 返回字典數據
????return {
????????'title': title,
????????'url': url,
????????'summary': summary,
????????'date': date,
????????'pic': pic
????}
?
?
# 查找封面圖片,獲取封面圖片地址
def parse_cover_pic(article):
????pic = article('.weui_media_hd').attr('style')
?
????p = re.compile(r'background-image:url\((.*?)\)')
????rs = p.findall(pic)
????log(u'封面圖片是:%s ' % rs[0] if len(rs) > 0 else '')
?
????return rs[0] if len(rs) > 0 else ''
?
?
# 自定義log函數,主要是加上時(shí)間
def log(msg):
????print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
?
?
# 驗證函數
def need_verify(selenium_html):
????' 有時(shí)候對方會(huì )封鎖ip,這里做一下判斷,檢測html中是否包含id=verify_change的標簽,有的話(huà),代表被重定向了,提醒過(guò)一陣子重試 '
????return pq(selenium_html)('#verify_change').text() != ''
?
?
# 創(chuàng )建公眾號命名的文件夾
def create_dir(keywords):
????if not os.path.exists(keywords):
????????os.makedirs(keywords)
?
????????# 爬蟲(chóng)主函數
?
?
def run(keywords):
????' 爬蟲(chóng)入口函數 '
????# Step 0 :? 創(chuàng )建公眾號命名的文件夾
????create_dir(keywords)
?
????# 搜狐微信搜索鏈接入口
????sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
????????keywords)
?
????# Step 1:GET請求到搜狗微信引擎,以微信公眾號英文名稱(chēng)作為查詢(xún)關(guān)鍵字
????log(u'開(kāi)始獲取,微信公眾號英文名為:%s' % keywords)
????log(u'開(kāi)始調用sougou搜索引擎')
????sougou_search_html = get_search_result_by_keywords(sogou_search_url)
?
????# Step 2:從搜索結果頁(yè)中解析出公眾號主頁(yè)鏈接
????log(u'獲取sougou_search_html成功,開(kāi)始抓取公眾號對應的主頁(yè)wx_url')
????wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
????log(u'獲取wx_url成功,%s' % wx_url)
?
????# Step 3:Selenium+PhantomJs獲取js異步加載渲染后的html
????log(u'開(kāi)始調用selenium渲染html')
????selenium_html = get_selenium_js_html(wx_url)
?
????# Step 4: 檢測目標網(wǎng)站是否進(jìn)行了封鎖
????if need_verify(selenium_html):
????????log(u'爬蟲(chóng)被目標網(wǎng)站封鎖,請稍后再試')
????else:
????????# Step 5: 使用PyQuery,從Step 3獲取的html中解析出公眾號文章列表的數據
????????log(u'調用selenium渲染html完成,開(kāi)始解析公眾號文章')
????????articles = parse_wx_articles_by_html(selenium_html)
????????log(u'抓取到微信文章%d篇' % len(articles))
?
????????# Step 6: 把微信文章數據封裝成字典的list
????????log(u'開(kāi)始整合微信文章數據為字典')
????????articles_list = switch_arctiles_to_list(articles)
????????return [content['title'] for content in articles_list]
?
```
?
main入口函數:
?
```python
# coding: utf8
import spider_weixun_by_sogou
?
if __name__ == '__main__':
?
????gongzhonghao = raw_input(u'input weixin gongzhonghao:')
????if not gongzhonghao:
????????gongzhonghao = 'spider'
????text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
?
????print text
爬取公眾號注意事項
下面這3個(gè)是我在爬取的過(guò)程中遇見(jiàn)的一些問(wèn)題,希望能幫到你們避坑。
1. Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
網(wǎng)上好多的文章都還在使用PhantomJS,其實(shí)從今年Selenium就早已不支持PhantomJS了,現在使用Selenium初始化瀏覽器的話(huà)須要使用webdriver初始化無(wú)頭參數的Chrome或則Firefox driver。
具體可以參考官網(wǎng)鏈接:
2. Can not connect to the Service chromedriver/firefoxdriver
在開(kāi)發(fā)過(guò)程中還碰到這個(gè)坑,這個(gè)問(wèn)題通常有兩種可能性,一種是沒(méi)有配置chromedriver或則geckodriver的環(huán)境變量,這里須要注意下將chromedriver或則geckodriver文件一定要配置環(huán)境變量到PATH下,或者干脆粗魯一點(diǎn)直接將這兩個(gè)文件復制到/usr/bin目錄下;
還有種可能是沒(méi)有配置hosts,如果你們發(fā)覺(jué)這個(gè)問(wèn)題復查下自己的hosts文件是不是沒(méi)有配置`127.0.0.1 localhost`,只要配置上就好了。
這里還有一點(diǎn)要注意的就是使用chrome瀏覽器的話(huà),還要注意chrome瀏覽器版本和chromedriver的對應關(guān)系,可以在這篇文章中查看也可以翻墻去google官網(wǎng)查看最新的對應關(guān)系。
3. 防盜鏈
微信公眾號對文章中的圖片做了防盜鏈處理,所以假如在公眾號和小程序、PC瀏覽器以外的地方是未能顯示圖片的,這里推薦你們可以看下這篇文章了解下怎樣處理陌陌的防盜鏈。
總結
好了前面說(shuō)了那么多,大家最關(guān)心的就是源代碼,這里放出github地址:,好用的話(huà)記得strar。
另外附上作品項目:
python3下載公眾號歷史文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 214 次瀏覽 ? 2020-08-11 07:24
好吧,其實(shí)也完全是照搬,感謝高手!
還沒(méi)有安裝python可以先下載一個(gè)anoconda3:
1.終端加載python selenium模塊包
加載包
2.使用webdriver功能須要安裝對應瀏覽器的驅動(dòng)插件,我用的是谷歌瀏覽器。安裝和瀏覽器版本對應的webdriver版本,解壓雜記下 chromedriver.exe 路徑。對應版本查詢(xún)和下載鏈接:
3.注冊自己的公眾號:微信公眾號登錄地址:
4.參考:
我照搬代碼的這位前輩:
崔慶才原文(另有探究代碼過(guò)程視頻):
6.我的webdriver不知道是版本沒(méi)對上還是哪些緣由,不能實(shí)現手動(dòng)輸入,注釋掉,手動(dòng)輸入解決。
7.原文保存的是文章標題和鏈接,我需要保存到本地。用過(guò)兩種方式,一個(gè)是生成pdf格式,一個(gè)是保存為html格式。
?。?)保存為html格式,終端加載pip install urllib,然后
import urllib.request
使用:urllib.request.urlretrieve('','taobao.html')
?。?)生成pdf較為復雜一些,不過(guò)有此方式,以后假如有須要,保存網(wǎng)址為pdf也便捷許多。不過(guò)這方面的需求用印象筆記的瀏覽器插件早已相當滿(mǎn)足了。
pip intall pdfkit
pip install requests
pip install beautifulsoup4
安裝 wkhtmltopdf,Windows平臺直接在 下載穩定版的 wkhtmltopdf 進(jìn)行安裝,安裝完成以后把該程序的執行路徑加入到系統環(huán)境 $PATH 變量中,否則 pdfkit 找不到 wkhtmltopdf 就出現錯誤 “No wkhtmltopdf executable found”
方便使用,自己寫(xiě)了一個(gè)簡(jiǎn)單的模塊:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'a html to pdf model'
'''
使用示例:python htmltopdf_dl.py www.taobao.com baidu.pdf
'''
_author_ = 'dengling'
import pdfkit
import sys
def htmltopdf_dl():
ags = sys.argv
pdfkit.from_url(ags[1],ags[2])
if __name__ =='__main__':
htmltopdf_dl()
8.缺點(diǎn):(1)用這個(gè)方式只在一個(gè)安靜平和的夜間奇妙地爬完了所有的文章。其余時(shí)侯再也沒(méi)有完整的爬取過(guò)所有的鏈接了。(2)因為保存本地html時(shí)參數辨識標題的特殊符號例如''時(shí)會(huì )出錯,所以不能一下子全轉換過(guò)來(lái)。(3)圖片不能一起保存出來(lái)。
完整代碼:
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import json
import requests
import re
import random
#微信公眾號賬號
user="你的賬戶(hù)"
#公眾號密碼
password="你的密碼"
#設置要爬取的公眾號列表
gzlist=['公眾號名字']
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
def weChat_login():
#定義一個(gè)空的字典,存放cookies內容
post={}
#用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='E:\微信公眾號\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('https://mp.weixin.qq.com/')
#等待5秒鐘
time.sleep(5)
print("正在輸入微信公眾號登錄賬號和密碼......")
#清空賬號框中的內容
driver.find_element_by_xpath("./*//input[@id='account']").clear()
#自動(dòng)填入登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@id='account']").send_keys(user)
#清空密碼框中的內容
driver.find_element_by_xpath("./*//input[@id='pwd']").clear()
#自動(dòng)填入登錄密碼
driver.find_element_by_xpath("./*//input[@id='pwd']").send_keys(password)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_xpath("./*//a[@id='loginBt']").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新載入公眾號登錄頁(yè),登錄之后會(huì )顯示公眾號后臺首頁(yè),從這個(gè)返回內容中獲取cookies信息
driver.get('https://mp.weixin.qq.com/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
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 = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
#獲取每一頁(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')
for item in 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")
# fh.write("urllib.request.urlretrieve('"+content_link + "','" + content_title +".html')\n")由于還沒(méi)有解決標題的符號參數識別會(huì )報錯的問(wèn)題,用了這個(gè)笨方法去解決的。
num -= 1
begin = int(begin)
begin+=5
time.sleep(2)
if __name__=='__main__':
try:
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
weChat_login()
#登錄之后,通過(guò)微信公眾號后臺提供的微信公眾號文章接口爬取文章
for query in gzlist:
#爬取微信公眾號文章,并存在本地文本中
print("開(kāi)始爬取公眾號:"+query)
get_content(query)
print("爬取完成")
except Exception as e:
print(str(e))
還好我要的文章都能下載出來(lái)了,圖片也沒(méi)有哪些用,所以暫時(shí)早已能滿(mǎn)足了。至于解決這種問(wèn)題,之后有時(shí)間有須要的時(shí)侯再鉆研。 查看全部
于是百度微軟必應各類(lèi)搜索引擎上手,第一次爬蟲(chóng)經(jīng)歷就這樣玉米了~~~
好吧,其實(shí)也完全是照搬,感謝高手!
還沒(méi)有安裝python可以先下載一個(gè)anoconda3:
1.終端加載python selenium模塊包

加載包
2.使用webdriver功能須要安裝對應瀏覽器的驅動(dòng)插件,我用的是谷歌瀏覽器。安裝和瀏覽器版本對應的webdriver版本,解壓雜記下 chromedriver.exe 路徑。對應版本查詢(xún)和下載鏈接:
3.注冊自己的公眾號:微信公眾號登錄地址:
4.參考:
我照搬代碼的這位前輩:
崔慶才原文(另有探究代碼過(guò)程視頻):
6.我的webdriver不知道是版本沒(méi)對上還是哪些緣由,不能實(shí)現手動(dòng)輸入,注釋掉,手動(dòng)輸入解決。
7.原文保存的是文章標題和鏈接,我需要保存到本地。用過(guò)兩種方式,一個(gè)是生成pdf格式,一個(gè)是保存為html格式。
?。?)保存為html格式,終端加載pip install urllib,然后
import urllib.request
使用:urllib.request.urlretrieve('','taobao.html')
?。?)生成pdf較為復雜一些,不過(guò)有此方式,以后假如有須要,保存網(wǎng)址為pdf也便捷許多。不過(guò)這方面的需求用印象筆記的瀏覽器插件早已相當滿(mǎn)足了。
pip intall pdfkit
pip install requests
pip install beautifulsoup4
安裝 wkhtmltopdf,Windows平臺直接在 下載穩定版的 wkhtmltopdf 進(jìn)行安裝,安裝完成以后把該程序的執行路徑加入到系統環(huán)境 $PATH 變量中,否則 pdfkit 找不到 wkhtmltopdf 就出現錯誤 “No wkhtmltopdf executable found”
方便使用,自己寫(xiě)了一個(gè)簡(jiǎn)單的模塊:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'a html to pdf model'
'''
使用示例:python htmltopdf_dl.py www.taobao.com baidu.pdf
'''
_author_ = 'dengling'
import pdfkit
import sys
def htmltopdf_dl():
ags = sys.argv
pdfkit.from_url(ags[1],ags[2])
if __name__ =='__main__':
htmltopdf_dl()
8.缺點(diǎn):(1)用這個(gè)方式只在一個(gè)安靜平和的夜間奇妙地爬完了所有的文章。其余時(shí)侯再也沒(méi)有完整的爬取過(guò)所有的鏈接了。(2)因為保存本地html時(shí)參數辨識標題的特殊符號例如''時(shí)會(huì )出錯,所以不能一下子全轉換過(guò)來(lái)。(3)圖片不能一起保存出來(lái)。
完整代碼:
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import json
import requests
import re
import random
#微信公眾號賬號
user="你的賬戶(hù)"
#公眾號密碼
password="你的密碼"
#設置要爬取的公眾號列表
gzlist=['公眾號名字']
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
def weChat_login():
#定義一個(gè)空的字典,存放cookies內容
post={}
#用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome(executable_path='E:\微信公眾號\chromedriver.exe')
#打開(kāi)微信公眾號登錄頁(yè)面
driver.get('https://mp.weixin.qq.com/')
#等待5秒鐘
time.sleep(5)
print("正在輸入微信公眾號登錄賬號和密碼......")
#清空賬號框中的內容
driver.find_element_by_xpath("./*//input[@id='account']").clear()
#自動(dòng)填入登錄用戶(hù)名
driver.find_element_by_xpath("./*//input[@id='account']").send_keys(user)
#清空密碼框中的內容
driver.find_element_by_xpath("./*//input[@id='pwd']").clear()
#自動(dòng)填入登錄密碼
driver.find_element_by_xpath("./*//input[@id='pwd']").send_keys(password)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
time.sleep(10)
#自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_xpath("./*//a[@id='loginBt']").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(20)
print("登錄成功")
#重新載入公眾號登錄頁(yè),登錄之后會(huì )顯示公眾號后臺首頁(yè),從這個(gè)返回內容中獲取cookies信息
driver.get('https://mp.weixin.qq.com/')
#獲取cookies
cookie_items = driver.get_cookies()
#獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
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 = 'https://mp.weixin.qq.com'
#設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
#讀取上一步獲取到的cookies
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
#登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
#搜索微信公眾號的接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
#搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
'action': 'search_biz',
'token' : token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5'
}
#打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
#取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get('list')[0]
#獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
#微信公眾號文章接口地址
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
#搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',#不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
#打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
#獲取文章總數
max_num = appmsg_response.json().get('app_msg_cnt')
#每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
#起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
while num + 1 > 0 :
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('正在翻頁(yè):--------------',begin)
#獲取每一頁(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')
for item in 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")
# fh.write("urllib.request.urlretrieve('"+content_link + "','" + content_title +".html')\n")由于還沒(méi)有解決標題的符號參數識別會(huì )報錯的問(wèn)題,用了這個(gè)笨方法去解決的。
num -= 1
begin = int(begin)
begin+=5
time.sleep(2)
if __name__=='__main__':
try:
#登錄微信公眾號,獲取登錄之后的cookies信息,并保存到本地文本中
weChat_login()
#登錄之后,通過(guò)微信公眾號后臺提供的微信公眾號文章接口爬取文章
for query in gzlist:
#爬取微信公眾號文章,并存在本地文本中
print("開(kāi)始爬取公眾號:"+query)
get_content(query)
print("爬取完成")
except Exception as e:
print(str(e))
還好我要的文章都能下載出來(lái)了,圖片也沒(méi)有哪些用,所以暫時(shí)早已能滿(mǎn)足了。至于解決這種問(wèn)題,之后有時(shí)間有須要的時(shí)侯再鉆研。
搜狗微信公眾號熱門(mén)文章如何采集
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 380 次瀏覽 ? 2020-08-10 18:46
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址丌會(huì )改變;b、網(wǎng)頁(yè) 丌是完全加載,只是局部迚行了數據加載,有所變化。 驗證方法:點(diǎn)擊操作后,在瀏覽器中,網(wǎng)址輸入欄丌會(huì )出現加載中的狀態(tài)戒者轉 圈狀態(tài)。 優(yōu)采云云采集服務(wù)平臺 觀(guān)察網(wǎng)頁(yè),我們發(fā)覺(jué),通過(guò)5 次點(diǎn)擊“加載更多內容”,頁(yè)面加載到最頂部,一 共顯示100 篇文章。因此,我們設置整個(gè)“循環(huán)翻頁(yè)”步驟執行5 次。選中“循 環(huán)翻頁(yè)”步驟,打開(kāi)“高級選項”,打開(kāi)“滿(mǎn)足以下條件時(shí)退出循環(huán)”,設置循 環(huán)次數等于“5 次”,點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖5 步驟3:創(chuàng )建列表循環(huán)并提取數據 1)移勱鍵盤(pán),選中頁(yè)面里第一篇文章的區塊。系統會(huì )辨識此區塊中的子元素, 在操作提示框中,選擇“選中子元素” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖6 2)繼續選中頁(yè)面中第二篇文章的區塊,系統會(huì )自勱選中第二篇文章中的子元素, 并辨識出頁(yè)面中的其他10 組同類(lèi)元素,在操作提示框中,選擇“選中全部” 搜狗微信公眾號熱門(mén)文章如何采集圖7 優(yōu)采云云采集服務(wù)平臺 3)我們可以看見(jiàn),頁(yè)面中文章區塊里的所有元素均被選中,變?yōu)榧t色。右側操 作提示框中,出現數組預覽表,將滑鼠移到表頭,點(diǎn)擊垃圾桶圖標,可刪掉丌需 要的主鍵。
字段選擇完成后,選擇“采集以下數據” 搜狗微信公眾號熱門(mén)文章如何采集圖8 4)我們還想要采集每篇文章的URL,因而還須要提取一個(gè)主鍵。點(diǎn)擊第一篇文 章的鏈接,系統會(huì )自勱選中頁(yè)面中的一組文章鏈接。在左側操作提示框中,選擇 “選中全部” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖9 5)選擇“采集以下鏈接地址” 搜狗微信公眾號熱門(mén)文章如何采集圖10 優(yōu)采云云采集服務(wù)平臺 6)字段選擇完成后,選中相應的數組,可以迚行數組的自定義命名 搜狗微信公眾號熱門(mén)文章如何采集圖11 步驟4:修改Xpath 我們繼續觀(guān)察,通過(guò) 次點(diǎn)擊“加載更多內容”后,此網(wǎng)頁(yè)加載出全部100 文章。因而我們配置規則的思路是,先構建翻頁(yè)循環(huán),加載出全部100篇文章, 再完善循環(huán)列表,提取數據 1)選中整個(gè)“循環(huán)”步驟,將其拖出“循環(huán)翻頁(yè)”步驟。如果丌迚行此項操作, 那么將會(huì )出現好多重復數據 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖12 拖勱完成后,如下圖所示 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖13 2)在“列表循環(huán)”步驟中,我們構建100 篇文章的循環(huán)列表。選中整個(gè)“循環(huán) 步驟”,打開(kāi)“高級選項”,將丌固定元素列表中的這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,復制粘貼到火 狐瀏覽器中的相應位置 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖14 Xpath:是一種路徑查詢(xún)語(yǔ)言,簡(jiǎn)單的說(shuō)就是借助一個(gè)路徑表達式找到我們須要 的數據位置。
Xpath 是用于XML 中順著(zhù)路徑查找數據用的,但是優(yōu)采云采集器內部有一套針 對HTML 的Xpath 引擎,使得直接用XPATH能夠精準的查找定位網(wǎng)頁(yè)上面的 數據。 3)在火狐瀏覽器中,我們發(fā)覺(jué),通過(guò)這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,頁(yè)面中被定位 的是20 篇文章 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖15 4)將Xpath 修改為: //BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 我們發(fā)覺(jué)頁(yè)面中所有要采集的文章都被定位了 搜狗微信公眾號熱門(mén)文章如何采集圖16 優(yōu)采云云采集服務(wù)平臺 5)將改好的Xpath://BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 復制粘貼到圖片中所示的位置,然后點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖17 6)點(diǎn)擊左上角的“保存并啟勱”,選擇“啟勱本地采集” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖18 步驟5:數據采集及導入 1)采集完成后,會(huì )跳出提示,選擇“導出數據”,選擇“合適的導入方法”, 將采集好的搜狗陌陌文章的數據導入 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖19 2)這里我們選擇excel 作為導入為格式,數據導入后如下圖 搜狗微信公眾號熱門(mén)文章如何采集圖20 優(yōu)采云云采集服務(wù)平臺 優(yōu)采云——70 萬(wàn)用戶(hù)選擇的網(wǎng)頁(yè)數據采集器。
1、操作簡(jiǎn)單,任何人都可以用:無(wú)需技術(shù)背景,會(huì )上網(wǎng)才能采集。完全可視化 流程,點(diǎn)擊滑鼠完成操作,2 分鐘即可快速入門(mén)。 2、功能強悍,任何網(wǎng)站都可以采:對于點(diǎn)擊、登陸、翻頁(yè)、識別驗證碼、瀑布 流、Ajax 腳本異步加載數據的網(wǎng)頁(yè),均可經(jīng)過(guò)簡(jiǎn)單設置迚行采集。 3、云采集,關(guān)機也可以。配置好采集任務(wù)后可死機,任務(wù)可在云端執行。龐大 云采集集群24*7 丌間斷運行,丌用害怕IP 被封,網(wǎng)絡(luò )中斷。 4、功能免費+增值服務(wù),可按需選擇。免費版具備所有功能,能夠滿(mǎn)足用戶(hù)的 基本采集需求。同時(shí)設置了一些增值服務(wù)(如私有云),滿(mǎn)足低端付費企業(yè)用戶(hù) 的須要。 查看全部
優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集 本文介紹使用優(yōu)采云采集搜狗陌陌文章(以熱門(mén)文章為例)的方式 采集網(wǎng)站: 規則下載: 使用功能點(diǎn): 分頁(yè)列表信息采集 Xpath AJAX點(diǎn)擊和翻頁(yè) 相關(guān)采集教程: 天貓商品信息采集 百度搜索結果采集 步驟1:創(chuàng )建采集任務(wù) 1)迚入主界面,選擇“自定義模式” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖1 2)將要采集的網(wǎng)址URL 復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖2 步驟2:創(chuàng )建翻頁(yè)循環(huán) 1)在頁(yè)面右上角,打開(kāi)“流程”,以突顯出“流程設計器”和“定制當前操作” 兩個(gè)藍籌股。網(wǎng)頁(yè)打開(kāi)后,默認顯示“熱門(mén)”文章。下拉頁(yè)面,找到并點(diǎn)擊“加載 更多內容”按鈕,在操作提示框中,選擇“更多操作” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖2 2)選擇“循環(huán)點(diǎn)擊單個(gè)元素”,以創(chuàng )建一個(gè)翻頁(yè)循環(huán) 搜狗微信公眾號熱門(mén)文章如何采集圖3 優(yōu)采云云采集服務(wù)平臺 因為此網(wǎng)頁(yè)涉及 Ajax 技術(shù),我們須要迚行一些中級選項的設置。選中“點(diǎn)擊元 素”步驟,打開(kāi)“高級選項”,勾選“Ajax 加載數據”,設置時(shí)間為“2 搜狗微信公眾號熱門(mén)文章如何采集圖4注:AJAX 即延時(shí)加載、異步更新的一種腳本技術(shù),通過(guò)在后臺不服務(wù)器迚行少 量數據交換,可以在丌重新加載整個(gè)網(wǎng)頁(yè)的情況下,對網(wǎng)頁(yè)的某部份迚行更新。
表現特點(diǎn):a、點(diǎn)擊網(wǎng)頁(yè)中某個(gè)選項時(shí),大部分網(wǎng)站的網(wǎng)址丌會(huì )改變;b、網(wǎng)頁(yè) 丌是完全加載,只是局部迚行了數據加載,有所變化。 驗證方法:點(diǎn)擊操作后,在瀏覽器中,網(wǎng)址輸入欄丌會(huì )出現加載中的狀態(tài)戒者轉 圈狀態(tài)。 優(yōu)采云云采集服務(wù)平臺 觀(guān)察網(wǎng)頁(yè),我們發(fā)覺(jué),通過(guò)5 次點(diǎn)擊“加載更多內容”,頁(yè)面加載到最頂部,一 共顯示100 篇文章。因此,我們設置整個(gè)“循環(huán)翻頁(yè)”步驟執行5 次。選中“循 環(huán)翻頁(yè)”步驟,打開(kāi)“高級選項”,打開(kāi)“滿(mǎn)足以下條件時(shí)退出循環(huán)”,設置循 環(huán)次數等于“5 次”,點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖5 步驟3:創(chuàng )建列表循環(huán)并提取數據 1)移勱鍵盤(pán),選中頁(yè)面里第一篇文章的區塊。系統會(huì )辨識此區塊中的子元素, 在操作提示框中,選擇“選中子元素” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖6 2)繼續選中頁(yè)面中第二篇文章的區塊,系統會(huì )自勱選中第二篇文章中的子元素, 并辨識出頁(yè)面中的其他10 組同類(lèi)元素,在操作提示框中,選擇“選中全部” 搜狗微信公眾號熱門(mén)文章如何采集圖7 優(yōu)采云云采集服務(wù)平臺 3)我們可以看見(jiàn),頁(yè)面中文章區塊里的所有元素均被選中,變?yōu)榧t色。右側操 作提示框中,出現數組預覽表,將滑鼠移到表頭,點(diǎn)擊垃圾桶圖標,可刪掉丌需 要的主鍵。
字段選擇完成后,選擇“采集以下數據” 搜狗微信公眾號熱門(mén)文章如何采集圖8 4)我們還想要采集每篇文章的URL,因而還須要提取一個(gè)主鍵。點(diǎn)擊第一篇文 章的鏈接,系統會(huì )自勱選中頁(yè)面中的一組文章鏈接。在左側操作提示框中,選擇 “選中全部” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖9 5)選擇“采集以下鏈接地址” 搜狗微信公眾號熱門(mén)文章如何采集圖10 優(yōu)采云云采集服務(wù)平臺 6)字段選擇完成后,選中相應的數組,可以迚行數組的自定義命名 搜狗微信公眾號熱門(mén)文章如何采集圖11 步驟4:修改Xpath 我們繼續觀(guān)察,通過(guò) 次點(diǎn)擊“加載更多內容”后,此網(wǎng)頁(yè)加載出全部100 文章。因而我們配置規則的思路是,先構建翻頁(yè)循環(huán),加載出全部100篇文章, 再完善循環(huán)列表,提取數據 1)選中整個(gè)“循環(huán)”步驟,將其拖出“循環(huán)翻頁(yè)”步驟。如果丌迚行此項操作, 那么將會(huì )出現好多重復數據 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖12 拖勱完成后,如下圖所示 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖13 2)在“列表循環(huán)”步驟中,我們構建100 篇文章的循環(huán)列表。選中整個(gè)“循環(huán) 步驟”,打開(kāi)“高級選項”,將丌固定元素列表中的這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,復制粘貼到火 狐瀏覽器中的相應位置 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖14 Xpath:是一種路徑查詢(xún)語(yǔ)言,簡(jiǎn)單的說(shuō)就是借助一個(gè)路徑表達式找到我們須要 的數據位置。
Xpath 是用于XML 中順著(zhù)路徑查找數據用的,但是優(yōu)采云采集器內部有一套針 對HTML 的Xpath 引擎,使得直接用XPATH能夠精準的查找定位網(wǎng)頁(yè)上面的 數據。 3)在火狐瀏覽器中,我們發(fā)覺(jué),通過(guò)這條Xpath: //BODY[@id='loginWrap']/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI ,頁(yè)面中被定位 的是20 篇文章 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖15 4)將Xpath 修改為: //BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 我們發(fā)覺(jué)頁(yè)面中所有要采集的文章都被定位了 搜狗微信公眾號熱門(mén)文章如何采集圖16 優(yōu)采云云采集服務(wù)平臺 5)將改好的Xpath://BODY[@id='loginWrap']/DIV/DIV[1]/DIV[3]/UL/LI, 復制粘貼到圖片中所示的位置,然后點(diǎn)擊“確定” 搜狗微信公眾號熱門(mén)文章如何采集圖17 6)點(diǎn)擊左上角的“保存并啟勱”,選擇“啟勱本地采集” 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖18 步驟5:數據采集及導入 1)采集完成后,會(huì )跳出提示,選擇“導出數據”,選擇“合適的導入方法”, 將采集好的搜狗陌陌文章的數據導入 優(yōu)采云云采集服務(wù)平臺 搜狗微信公眾號熱門(mén)文章如何采集圖19 2)這里我們選擇excel 作為導入為格式,數據導入后如下圖 搜狗微信公眾號熱門(mén)文章如何采集圖20 優(yōu)采云云采集服務(wù)平臺 優(yōu)采云——70 萬(wàn)用戶(hù)選擇的網(wǎng)頁(yè)數據采集器。
1、操作簡(jiǎn)單,任何人都可以用:無(wú)需技術(shù)背景,會(huì )上網(wǎng)才能采集。完全可視化 流程,點(diǎn)擊滑鼠完成操作,2 分鐘即可快速入門(mén)。 2、功能強悍,任何網(wǎng)站都可以采:對于點(diǎn)擊、登陸、翻頁(yè)、識別驗證碼、瀑布 流、Ajax 腳本異步加載數據的網(wǎng)頁(yè),均可經(jīng)過(guò)簡(jiǎn)單設置迚行采集。 3、云采集,關(guān)機也可以。配置好采集任務(wù)后可死機,任務(wù)可在云端執行。龐大 云采集集群24*7 丌間斷運行,丌用害怕IP 被封,網(wǎng)絡(luò )中斷。 4、功能免費+增值服務(wù),可按需選擇。免費版具備所有功能,能夠滿(mǎn)足用戶(hù)的 基本采集需求。同時(shí)設置了一些增值服務(wù)(如私有云),滿(mǎn)足低端付費企業(yè)用戶(hù) 的須要。
搜狗陌陌反爬蟲(chóng)機制剖析及應對方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 175 次瀏覽 ? 2020-08-10 04:50
下面是對探求過(guò)程的記錄。
首先參考了以下博客:
博主的探求過(guò)程,建議在他的博客中直接進(jìn)行查看,這里我關(guān)注的是他說(shuō)的關(guān)于Cookie的部份。
博主覺(jué)得懇求時(shí),SUID、SUV和SNUID最為重要,我在谷歌瀏覽器中看見(jiàn)以下Cookie
除了兩個(gè)SUID和SUV這三個(gè)Cookie,我對Cookie進(jìn)行了挨個(gè)剔除,并重新進(jìn)行查詢(xún),發(fā)現其他Cookie都是可以手動(dòng)生成的。而且不會(huì )報502,也不會(huì )觸發(fā)驗證碼頁(yè)面。
由于Java中使用Connection.headers(Map cookies)方法,會(huì )導致第一個(gè)SUID被第二個(gè)覆蓋掉(雖然我當時(shí)確實(shí)添加了兩個(gè)SUID),請求也是正常的,所以,我進(jìn)一步提不僅第一個(gè)SUID,發(fā)現刷新頁(yè)面,也沒(méi)有問(wèn)題。
紅框之外的Cookie就會(huì )手動(dòng)生成,也沒(méi)有觸發(fā)驗證碼。只有當我剔除SUV時(shí),才會(huì )觸發(fā)驗證碼機制,從而使輸入驗證碼:
所以,目前為止,需要帶上的Cookie只有SUV!
那么,SUV這個(gè)Cookie怎么獲取呢?
一般來(lái)說(shuō),通過(guò)懇求搜狗陌陌網(wǎng)站,然后獲取到Cookie,作為自己的Cookie使用,但是無(wú)疑會(huì )降低懇求。當時(shí)朋友有個(gè)大膽的看法,說(shuō)試試能不能直接傳一個(gè)32位字符串呢?也真是腦洞大開(kāi)!這里很自然地就想到了UUID,然后將UUID形成的32位字符串轉小寫(xiě)。
想著(zhù)搜狗陌陌不至于做的如此傻吧?但還是試了試,沒(méi)想到還真的通過(guò)了,而且懇求還比較穩定。
綜上,處理辦法是——在懇求搜狗陌陌時(shí),生成一個(gè)名為SUV的Cookie,請求時(shí)加上即可。
UUID的生成方式網(wǎng)上有很多,這里不再贅言,注意除去字符串中的短橫線(xiàn)!
祝你們好運!
參考博客: 查看全部
最近項目中,由于須要從微信公眾號中獲取一些文章內容,所以用到了搜狗陌陌。一旦搜索的次數稍為多一點(diǎn),就會(huì )觸發(fā)搜狗陌陌的反爬蟲(chóng)機制,最初是須要加上User-Agent懇求頭,后來(lái)是要求輸入驗證碼,現在輸入驗證碼以后,竟然時(shí)常都會(huì )報502,導致爬蟲(chóng)極不穩定。搜狗陌陌的反爬蟲(chóng)機制仍然在更新,特別是近來(lái)的一次更新,更使人一時(shí)半會(huì )兒摸不著(zhù)腦子,也是耗費了好一會(huì )兒時(shí)間進(jìn)行了突破。
下面是對探求過(guò)程的記錄。
首先參考了以下博客:
博主的探求過(guò)程,建議在他的博客中直接進(jìn)行查看,這里我關(guān)注的是他說(shuō)的關(guān)于Cookie的部份。
博主覺(jué)得懇求時(shí),SUID、SUV和SNUID最為重要,我在谷歌瀏覽器中看見(jiàn)以下Cookie

除了兩個(gè)SUID和SUV這三個(gè)Cookie,我對Cookie進(jìn)行了挨個(gè)剔除,并重新進(jìn)行查詢(xún),發(fā)現其他Cookie都是可以手動(dòng)生成的。而且不會(huì )報502,也不會(huì )觸發(fā)驗證碼頁(yè)面。
由于Java中使用Connection.headers(Map cookies)方法,會(huì )導致第一個(gè)SUID被第二個(gè)覆蓋掉(雖然我當時(shí)確實(shí)添加了兩個(gè)SUID),請求也是正常的,所以,我進(jìn)一步提不僅第一個(gè)SUID,發(fā)現刷新頁(yè)面,也沒(méi)有問(wèn)題。

紅框之外的Cookie就會(huì )手動(dòng)生成,也沒(méi)有觸發(fā)驗證碼。只有當我剔除SUV時(shí),才會(huì )觸發(fā)驗證碼機制,從而使輸入驗證碼:

所以,目前為止,需要帶上的Cookie只有SUV!
那么,SUV這個(gè)Cookie怎么獲取呢?
一般來(lái)說(shuō),通過(guò)懇求搜狗陌陌網(wǎng)站,然后獲取到Cookie,作為自己的Cookie使用,但是無(wú)疑會(huì )降低懇求。當時(shí)朋友有個(gè)大膽的看法,說(shuō)試試能不能直接傳一個(gè)32位字符串呢?也真是腦洞大開(kāi)!這里很自然地就想到了UUID,然后將UUID形成的32位字符串轉小寫(xiě)。
想著(zhù)搜狗陌陌不至于做的如此傻吧?但還是試了試,沒(méi)想到還真的通過(guò)了,而且懇求還比較穩定。
綜上,處理辦法是——在懇求搜狗陌陌時(shí),生成一個(gè)名為SUV的Cookie,請求時(shí)加上即可。
UUID的生成方式網(wǎng)上有很多,這里不再贅言,注意除去字符串中的短橫線(xiàn)!
祝你們好運!
參考博客:
記一次批量定時(shí)抓取微信公眾號文章的實(shí)現
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2020-08-09 15:40
抓取前的說(shuō)明和打算
本次抓取的選擇的語(yǔ)言是java,本文章不會(huì )將整個(gè)工程的全部代碼全部貼出,只會(huì )提供核心代碼和抓取思路的說(shuō)明。
數據的抓取
抓取文章的來(lái)源為搜狗陌陌網(wǎng)站,網(wǎng)站如下圖。
抓取的思路如下
一般抓取微信公眾號的文章都是以微信公眾號的id為關(guān)鍵字 ,我們可以通過(guò)url+ keyword的方式直接跳轉到想要抓取公眾號頁(yè)面,keyword即為想要搜索微信公眾號的名稱(chēng)或則是id;
// 搜狗微信搜索鏈接入口
String sogou_search_url = "http://weixin.sogou.com/weixin ... ot%3B
+ keyword + "&ie=utf8&s_from=input&_sug_=n&_sug_type_=";
為了防止網(wǎng)站對爬蟲(chóng)的初步攔截,我們可以使用Selenium (瀏覽器自動(dòng)化測試框架)來(lái)偽裝自己的爬蟲(chóng),我們使用的chrome,這里須要注意自己的chrome版本與使用的webdriver的版本是對應的;
ChromeOptions chromeOptions = new ChromeOptions();
// 全屏,為了接下來(lái)防抓取做準備
chromeOptions.addArguments("--start-maximized");
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver webDriver = new ChromeDriver(chromeOptions);
到達微信公眾號列表頁(yè)面,如下圖,獲取微信公眾號鏈接。
<p> // 獲取當前頁(yè)面的微信公眾號列表
List weixin_list = webDriver
.findElements(By.cssSelector("div[class='txt-box']"));
// 獲取進(jìn)入公眾號的鏈接
String weixin_url = "";
for (int i = 0; i 查看全部
記一次批量定時(shí)抓取微信公眾號文章的實(shí)現
抓取前的說(shuō)明和打算
本次抓取的選擇的語(yǔ)言是java,本文章不會(huì )將整個(gè)工程的全部代碼全部貼出,只會(huì )提供核心代碼和抓取思路的說(shuō)明。
數據的抓取
抓取文章的來(lái)源為搜狗陌陌網(wǎng)站,網(wǎng)站如下圖。

抓取的思路如下
一般抓取微信公眾號的文章都是以微信公眾號的id為關(guān)鍵字 ,我們可以通過(guò)url+ keyword的方式直接跳轉到想要抓取公眾號頁(yè)面,keyword即為想要搜索微信公眾號的名稱(chēng)或則是id;
// 搜狗微信搜索鏈接入口
String sogou_search_url = "http://weixin.sogou.com/weixin ... ot%3B
+ keyword + "&ie=utf8&s_from=input&_sug_=n&_sug_type_=";
為了防止網(wǎng)站對爬蟲(chóng)的初步攔截,我們可以使用Selenium (瀏覽器自動(dòng)化測試框架)來(lái)偽裝自己的爬蟲(chóng),我們使用的chrome,這里須要注意自己的chrome版本與使用的webdriver的版本是對應的;
ChromeOptions chromeOptions = new ChromeOptions();
// 全屏,為了接下來(lái)防抓取做準備
chromeOptions.addArguments("--start-maximized");
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver webDriver = new ChromeDriver(chromeOptions);
到達微信公眾號列表頁(yè)面,如下圖,獲取微信公眾號鏈接。

<p> // 獲取當前頁(yè)面的微信公眾號列表
List weixin_list = webDriver
.findElements(By.cssSelector("div[class='txt-box']"));
// 獲取進(jìn)入公眾號的鏈接
String weixin_url = "";
for (int i = 0; i
建立微信公眾號測試帳號-Java本地服務(wù)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 166 次瀏覽 ? 2020-08-09 03:56
這是第一個(gè)坑. 在測試編號中,您可以填寫(xiě)域名ip,甚至不需要填寫(xiě)域名,這極大地方便了測試授權的使用. 回調頁(yè)面表示微信用戶(hù)關(guān)注您的官方賬號. 當他選擇授權登錄時(shí),我們可以調用微信界面來(lái)獲取他的基本微信信息,例如唯一的微信openid,然后返回到我們的頁(yè)面之一,或者這是用于采集用戶(hù)信息的服務(wù). 頁(yè)面或服務(wù)必須在此域名下. 假設我填寫(xiě)了
例如,如果我想返回頁(yè)面,它可以是:
,
返回服務(wù):
只要在此域名下,無(wú)論嵌入多少層. 請注意,不能在前面添加https或http前綴.
在回調域名中,如果您的項目名稱(chēng)由下劃線(xiàn)組成,
例如,要訪(fǎng)問(wèn)您的項目,請刪除帶下劃線(xiàn)的項目名稱(chēng). 盡管刪除的項目名稱(chēng)只能映射回本地啟動(dòng)服務(wù)器,而不是映射回項目,但這不會(huì )造成傷害.
好的,這里很多人說(shuō),如果沒(méi)有域名,我該怎么辦,那是第二種材料,一個(gè)可以映射到Intranet的域名.
我使用的花生殼域名.
新用戶(hù)可以獲得幾個(gè)免費域名,他們也可以使用這些域名,但是對于我來(lái)說(shuō),測試并購買(mǎi)100個(gè)大洋的.com域名非常方便.
然后通過(guò)花生殼內部網(wǎng)下載客戶(hù)端
您擁有的域名將顯示在這里,包括您發(fā)送的域名.
隨意編寫(xiě)應用程序名稱(chēng),域名是下屬之一,映射是HTTP80. 內部主機不知道您可以打開(kāi)cmd ip config / all來(lái)查看您的地址. 我的項目從tomact開(kāi)始,使用默認端口8080. 最后,進(jìn)行診斷并在地址欄中鍵入Internet域名,以確保其他人可以訪(fǎng)問(wèn)您的本地項目.
到目前為止,第二種材料已經(jīng)準備好了.
第三個(gè)是可以運行的項目...這里將不討論. 您可以使用springboot + myb,springMVC,struts2來(lái)構建可以運行的項目. 如果沒(méi)有,請搜索其他博客以快速建立一個(gè)博客,至少您可以輸入一個(gè)servelet. 我只是直接運行公司的項目.
連接授權界面
首先編寫(xiě)一個(gè)鏈接: APPID&redirect_uri = l&response_type = code&scope = snsapi_base&state = 123#wechat_redirect
此鏈接已發(fā)送至微信,表明我要開(kāi)始??看私缑?br /> appid: 是測試編號上的appid
redirect_uri: 我們剛剛在上面填寫(xiě)了,因此這里是在該域名下填寫(xiě)一個(gè)HTML以供回調. 必須添加或在這里,必須!
scope: 這是指要調用的微信界面,snsapi_base是指用戶(hù)的靜默授權,這是用戶(hù)執行微信授權而沒(méi)有彈出框提示是否進(jìn)行授權的情況,因此該界面獲取的信息較少,您可以查看詳細信息官方技術(shù)文檔.
狀態(tài): 填寫(xiě)您想要的任何內容.
我下載了官方的微信調試工具. 如果您按照上述步驟進(jìn)行操作,則您的鏈接將不會(huì )出現代碼錯誤,redirect_uri和其他錯誤.
如您所見(jiàn),在返回的頁(yè)面上,后綴附有代碼. 該代碼將被發(fā)送到微信以交換剛剛登錄的用戶(hù)的信息. 當然,您可以對上述授權鏈接進(jìn)行異步請求,并使用js在頁(yè)面上獲取它. 我是這樣子的
函數GetQueryString(name)
{
var reg = new RegExp(“(^ |&)” + name +“ =([^&] *)(&| $)”);
var r = window.location.search.substr(1).match(reg);
if(r!= null)返回unescape(r [2]);返回null;
}
調用GetQueryString(code)獲取地址的參數值.
獲取后,將其發(fā)送到后臺進(jìn)行處理. 有很多提交方法. 異步也是可能的,或者將整個(gè)表單直接連接到其他值并提交到后臺. 根仍然由后臺處理.
僅使用老式的struts2粘貼密鑰代碼,因此返回String映射以返回到頁(yè)面,如果您是springMVC控制器,請自行更改
public String juvenileSubsidy() {
//如果是第二次驗證登錄則直接發(fā)送微信的opendid
String openId =getOpenId();
.......//省略各種去到信息以后的service
return "login_jsp";
}
........
private String getOpenId(){
//appid和secret是測試公眾號上的,自行填寫(xiě),別直接copy,
//code是剛剛獲取到的,自行改寫(xiě)參數
String url="https://api.weixin.qq.com/sns/oa"
+ "uth2/access_token?appid="+wxappid+"&"
+ "secret="+appsecret+"&code="+wxcode+""
+ "&grant_type=authorization_code";
String openId="";
try {
URL getUrl=new URL(url);
HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] b = new byte[size];
is.read(b);
String message = new String(b, "UTF-8");
JSONObject json = JSONObject.parseObject(message);
openId=json.get("openid").toString();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return openId;
}
當然,許多博客文章都是關(guān)于如何封裝地址參數名稱(chēng)的,以便以后可以調用. 一開(kāi)始,我寫(xiě)得很粗糙以顯示效果. 您可以在將來(lái)輕松封裝它,甚至可以使用xml讀取配置信息. 我的私有方法只是返回我需要的String openid. 您可以選擇返回對象,或檢查正式文檔,更改原創(chuàng )范圍,非靜默授權可以獲取更多用戶(hù)信息.
接下來(lái)是調試觀(guān)察.
{"access_token":"15_0D9_XTsx2YdwoD5KPd6WHAEc47xLqy4uuQAb06irOd5UgOnzwW3zPRdhMXinpJ7ucvkW3D7coema7QAdA",
"expires_in":7200,
"refresh_token":"15_cz_GGe-k41d_YVVgmrFvQBUvF_LuyuNSB2PTq8YWXHLz0l7Vg8hJnBWjGFMNhTT2NRFqqRYT5gSofww",
"openid":"o-MN1B0FGR1JV398vbSPNZ70xa424",
"scope":"snsapi_base"}
以上是成功發(fā)送到微信界面的json對象. 我叫snsapi_base,所以我只能返回此信息. 這些令牌每次都會(huì )刷新,并且這些密鑰也被微信用于驗證服務(wù)器的重要數據,但是在這里它們是無(wú)用的. 我得到了所需的openid.
通過(guò)這種方式,獲得了微信登錄官方賬號上唯一識別的ID,并可以通過(guò)該ID實(shí)現業(yè)務(wù)邏輯. 同時(shí),可以在本地測試官方帳戶(hù)服務(wù).
對于本文開(kāi)頭提到的接口配置信息,此處不需要使用它. 這要求后端發(fā)送令牌進(jìn)行驗證.
最后,您可以將此嬰兒鏈接放在官方帳戶(hù)的自定義菜單中. 這就是所謂的用戶(hù)登錄授權.
當然,這是測試帳戶(hù)授權. 正式啟動(dòng)后,它將替換為注冊域名,appid被替換為官方官方帳戶(hù)的ID,其余部分保持不變.
到目前為止,官方帳戶(hù)的靜默授權已完成! 查看全部
這里的重點(diǎn)是頁(yè)面授權回調的域名.


這是第一個(gè)坑. 在測試編號中,您可以填寫(xiě)域名ip,甚至不需要填寫(xiě)域名,這極大地方便了測試授權的使用. 回調頁(yè)面表示微信用戶(hù)關(guān)注您的官方賬號. 當他選擇授權登錄時(shí),我們可以調用微信界面來(lái)獲取他的基本微信信息,例如唯一的微信openid,然后返回到我們的頁(yè)面之一,或者這是用于采集用戶(hù)信息的服務(wù). 頁(yè)面或服務(wù)必須在此域名下. 假設我填寫(xiě)了
例如,如果我想返回頁(yè)面,它可以是:
,
返回服務(wù):
只要在此域名下,無(wú)論嵌入多少層. 請注意,不能在前面添加https或http前綴.
在回調域名中,如果您的項目名稱(chēng)由下劃線(xiàn)組成,
例如,要訪(fǎng)問(wèn)您的項目,請刪除帶下劃線(xiàn)的項目名稱(chēng). 盡管刪除的項目名稱(chēng)只能映射回本地啟動(dòng)服務(wù)器,而不是映射回項目,但這不會(huì )造成傷害.
好的,這里很多人說(shuō),如果沒(méi)有域名,我該怎么辦,那是第二種材料,一個(gè)可以映射到Intranet的域名.
我使用的花生殼域名.



新用戶(hù)可以獲得幾個(gè)免費域名,他們也可以使用這些域名,但是對于我來(lái)說(shuō),測試并購買(mǎi)100個(gè)大洋的.com域名非常方便.
然后通過(guò)花生殼內部網(wǎng)下載客戶(hù)端



您擁有的域名將顯示在這里,包括您發(fā)送的域名.


隨意編寫(xiě)應用程序名稱(chēng),域名是下屬之一,映射是HTTP80. 內部主機不知道您可以打開(kāi)cmd ip config / all來(lái)查看您的地址. 我的項目從tomact開(kāi)始,使用默認端口8080. 最后,進(jìn)行診斷并在地址欄中鍵入Internet域名,以確保其他人可以訪(fǎng)問(wèn)您的本地項目.

到目前為止,第二種材料已經(jīng)準備好了.
第三個(gè)是可以運行的項目...這里將不討論. 您可以使用springboot + myb,springMVC,struts2來(lái)構建可以運行的項目. 如果沒(méi)有,請搜索其他博客以快速建立一個(gè)博客,至少您可以輸入一個(gè)servelet. 我只是直接運行公司的項目.
連接授權界面
首先編寫(xiě)一個(gè)鏈接: APPID&redirect_uri = l&response_type = code&scope = snsapi_base&state = 123#wechat_redirect
此鏈接已發(fā)送至微信,表明我要開(kāi)始??看私缑?br /> appid: 是測試編號上的appid
redirect_uri: 我們剛剛在上面填寫(xiě)了,因此這里是在該域名下填寫(xiě)一個(gè)HTML以供回調. 必須添加或在這里,必須!
scope: 這是指要調用的微信界面,snsapi_base是指用戶(hù)的靜默授權,這是用戶(hù)執行微信授權而沒(méi)有彈出框提示是否進(jìn)行授權的情況,因此該界面獲取的信息較少,您可以查看詳細信息官方技術(shù)文檔.
狀態(tài): 填寫(xiě)您想要的任何內容.
我下載了官方的微信調試工具. 如果您按照上述步驟進(jìn)行操作,則您的鏈接將不會(huì )出現代碼錯誤,redirect_uri和其他錯誤.

如您所見(jiàn),在返回的頁(yè)面上,后綴附有代碼. 該代碼將被發(fā)送到微信以交換剛剛登錄的用戶(hù)的信息. 當然,您可以對上述授權鏈接進(jìn)行異步請求,并使用js在頁(yè)面上獲取它. 我是這樣子的
函數GetQueryString(name)
{
var reg = new RegExp(“(^ |&)” + name +“ =([^&] *)(&| $)”);
var r = window.location.search.substr(1).match(reg);
if(r!= null)返回unescape(r [2]);返回null;
}
調用GetQueryString(code)獲取地址的參數值.
獲取后,將其發(fā)送到后臺進(jìn)行處理. 有很多提交方法. 異步也是可能的,或者將整個(gè)表單直接連接到其他值并提交到后臺. 根仍然由后臺處理.
僅使用老式的struts2粘貼密鑰代碼,因此返回String映射以返回到頁(yè)面,如果您是springMVC控制器,請自行更改
public String juvenileSubsidy() {
//如果是第二次驗證登錄則直接發(fā)送微信的opendid
String openId =getOpenId();
.......//省略各種去到信息以后的service
return "login_jsp";
}
........
private String getOpenId(){
//appid和secret是測試公眾號上的,自行填寫(xiě),別直接copy,
//code是剛剛獲取到的,自行改寫(xiě)參數
String url="https://api.weixin.qq.com/sns/oa"
+ "uth2/access_token?appid="+wxappid+"&"
+ "secret="+appsecret+"&code="+wxcode+""
+ "&grant_type=authorization_code";
String openId="";
try {
URL getUrl=new URL(url);
HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] b = new byte[size];
is.read(b);
String message = new String(b, "UTF-8");
JSONObject json = JSONObject.parseObject(message);
openId=json.get("openid").toString();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return openId;
}
當然,許多博客文章都是關(guān)于如何封裝地址參數名稱(chēng)的,以便以后可以調用. 一開(kāi)始,我寫(xiě)得很粗糙以顯示效果. 您可以在將來(lái)輕松封裝它,甚至可以使用xml讀取配置信息. 我的私有方法只是返回我需要的String openid. 您可以選擇返回對象,或檢查正式文檔,更改原創(chuàng )范圍,非靜默授權可以獲取更多用戶(hù)信息.
接下來(lái)是調試觀(guān)察.

{"access_token":"15_0D9_XTsx2YdwoD5KPd6WHAEc47xLqy4uuQAb06irOd5UgOnzwW3zPRdhMXinpJ7ucvkW3D7coema7QAdA",
"expires_in":7200,
"refresh_token":"15_cz_GGe-k41d_YVVgmrFvQBUvF_LuyuNSB2PTq8YWXHLz0l7Vg8hJnBWjGFMNhTT2NRFqqRYT5gSofww",
"openid":"o-MN1B0FGR1JV398vbSPNZ70xa424",
"scope":"snsapi_base"}
以上是成功發(fā)送到微信界面的json對象. 我叫snsapi_base,所以我只能返回此信息. 這些令牌每次都會(huì )刷新,并且這些密鑰也被微信用于驗證服務(wù)器的重要數據,但是在這里它們是無(wú)用的. 我得到了所需的openid.
通過(guò)這種方式,獲得了微信登錄官方賬號上唯一識別的ID,并可以通過(guò)該ID實(shí)現業(yè)務(wù)邏輯. 同時(shí),可以在本地測試官方帳戶(hù)服務(wù).
對于本文開(kāi)頭提到的接口配置信息,此處不需要使用它. 這要求后端發(fā)送令牌進(jìn)行驗證.
最后,您可以將此嬰兒鏈接放在官方帳戶(hù)的自定義菜單中. 這就是所謂的用戶(hù)登錄授權.

當然,這是測試帳戶(hù)授權. 正式啟動(dòng)后,它將替換為注冊域名,appid被替換為官方官方帳戶(hù)的ID,其余部分保持不變.
到目前為止,官方帳戶(hù)的靜默授權已完成!
微信抓取過(guò)程中的參數分析
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2020-08-08 17:17
mid是圖形消息的ID
idx是發(fā)布的頭幾條消息(1表示標題位置消息)
sn是一個(gè)隨機加密的字符串(對于圖形消息來(lái)說(shuō)是唯一的,如果您想詢(xún)問(wèn)此sn的生成規則是什么或如何破解它,您基本上只能從微信公眾平臺開(kāi)發(fā)中獲得答案. 團隊)變相煮
三: 偽裝微信客戶(hù)端登錄并獲取歷史信息頁(yè)面. 4個(gè)最重要的參數是: __biz; uin =; key =; pass_ticket =;這四個(gè)參數. [有時(shí)需要手機]
四: 獲得general_msg_list后,分析每個(gè)字段
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "摘要",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""摘要"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
五: 獲取程序的原型
創(chuàng )建表格:
1. 微信公眾號列表
CREATE TABLE `weixin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) DEFAULT '' COMMENT '公眾號唯一標識biz',
`collect` int(11) DEFAULT '1' COMMENT '記錄采集時(shí)間的時(shí)間戳',
PRIMARY KEY (`id`)
) ;
2,微信文章列表
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '文章對應的公眾號biz',
`field_id` int(11) NOT NULL COMMENT '微信定義的一個(gè)id,每條文章唯一',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章標題',
`title_encode` text CHARACTER SET utf8 NOT NULL COMMENT '文章編碼,防止文章出現emoji',
`digest` varchar(500) NOT NULL DEFAULT '' COMMENT '文章摘要',
`content_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '文章地址',
`source_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '閱讀原文地址',
`cover` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '封面圖片',
`is_multi` int(11) NOT NULL COMMENT '是否多圖文',
`is_top` int(11) NOT NULL COMMENT '是否頭條',
`datetime` int(11) NOT NULL COMMENT '文章時(shí)間戳',
`readNum` int(11) NOT NULL DEFAULT '1' COMMENT '文章閱讀量',
`likeNum` int(11) NOT NULL DEFAULT '0' COMMENT '文章點(diǎn)贊量',
PRIMARY KEY (`id`)
) ;
3. 采集團隊名單
CREATE TABLE `tmplist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`content_url` varchar(255) DEFAULT NULL COMMENT '文章地址',
`load` int(11) DEFAULT '0' COMMENT '讀取中標記',
PRIMARY KEY (`id`),
UNIQUE KEY `content_url` (`content_url`)
) ;
采集:
1,getMsgJson.php: 該程序負責接收已解析并存儲在數據庫中的歷史消息的json
<p> 查看全部
__ biz可被視為在微信公眾平臺上公開(kāi)宣布的公共賬戶(hù)的唯一ID
mid是圖形消息的ID
idx是發(fā)布的頭幾條消息(1表示標題位置消息)
sn是一個(gè)隨機加密的字符串(對于圖形消息來(lái)說(shuō)是唯一的,如果您想詢(xún)問(wèn)此sn的生成規則是什么或如何破解它,您基本上只能從微信公眾平臺開(kāi)發(fā)中獲得答案. 團隊)變相煮
三: 偽裝微信客戶(hù)端登錄并獲取歷史信息頁(yè)面. 4個(gè)最重要的參數是: __biz; uin =; key =; pass_ticket =;這四個(gè)參數. [有時(shí)需要手機]
四: 獲得general_msg_list后,分析每個(gè)字段
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。
{//這個(gè)大闊號之內是一條多圖文或單圖文消息,通俗的說(shuō)就是一天的群發(fā)都在這里
"app_msg_ext_info":{//圖文消息的擴展信息
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": "摘要",
"is_multi": "是否多圖文,值為1和0",
"multi_app_msg_item_list": [//這里面包含的是從第二條開(kāi)始的圖文消息,如果is_multi=0,這里將為空
{
"content_url": "圖文消息的鏈接地址",
"cover": "封面圖片",
"digest": ""摘要"",
"source_url": "閱讀原文的地址",
"title": "子內容標題"
},
...//循環(huán)被省略
],
"source_url": "閱讀原文的地址",
"title": "頭條標題"
},
"comm_msg_info":{//圖文消息的基本信息
"datetime": '發(fā)布時(shí)間,值為unix時(shí)間戳',
"type": 49 //類(lèi)型為49的時(shí)候是圖文消息
}
},
...//循環(huán)被省略
]
五: 獲取程序的原型
創(chuàng )建表格:
1. 微信公眾號列表
CREATE TABLE `weixin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) DEFAULT '' COMMENT '公眾號唯一標識biz',
`collect` int(11) DEFAULT '1' COMMENT '記錄采集時(shí)間的時(shí)間戳',
PRIMARY KEY (`id`)
) ;
2,微信文章列表
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`biz` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '文章對應的公眾號biz',
`field_id` int(11) NOT NULL COMMENT '微信定義的一個(gè)id,每條文章唯一',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章標題',
`title_encode` text CHARACTER SET utf8 NOT NULL COMMENT '文章編碼,防止文章出現emoji',
`digest` varchar(500) NOT NULL DEFAULT '' COMMENT '文章摘要',
`content_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '文章地址',
`source_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '閱讀原文地址',
`cover` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '封面圖片',
`is_multi` int(11) NOT NULL COMMENT '是否多圖文',
`is_top` int(11) NOT NULL COMMENT '是否頭條',
`datetime` int(11) NOT NULL COMMENT '文章時(shí)間戳',
`readNum` int(11) NOT NULL DEFAULT '1' COMMENT '文章閱讀量',
`likeNum` int(11) NOT NULL DEFAULT '0' COMMENT '文章點(diǎn)贊量',
PRIMARY KEY (`id`)
) ;
3. 采集團隊名單
CREATE TABLE `tmplist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`content_url` varchar(255) DEFAULT NULL COMMENT '文章地址',
`load` int(11) DEFAULT '0' COMMENT '讀取中標記',
PRIMARY KEY (`id`),
UNIQUE KEY `content_url` (`content_url`)
) ;
采集:
1,getMsgJson.php: 該程序負責接收已解析并存儲在數據庫中的歷史消息的json
<p>
通過(guò)微信公眾平臺獲取官方帳戶(hù)文章
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 186 次瀏覽 ? 2020-08-08 10:12
選擇自己創(chuàng )建的圖形:
好像是公共帳戶(hù)操作教學(xué)
進(jìn)入編輯頁(yè)面后,單擊超鏈接
彈出一個(gè)選擇框,我們在框中輸入相應的正式帳戶(hù)名稱(chēng),并出現相應的商品列表
您感到驚訝嗎?您可以打開(kāi)控制臺并檢查請求的界面
打開(kāi)回復,有我們需要的文章鏈接
確認數據后,我們需要分析此界面.
感覺(jué)很簡(jiǎn)單. GET請求帶有一些參數.
Fakeid是官方帳戶(hù)的唯一ID,因此,如果要直接按名稱(chēng)獲取商品列表,則需要先獲取偽造品.
當我們輸入官方帳戶(hù)名時(shí),單擊“搜索”. 您會(huì )看到搜索界面已觸發(fā),并返回了偽造品.
此界面不需要很多參數.
接下來(lái),我們可以使用代碼來(lái)模擬上述操作.
但是您還需要使用現有的cookie以避免登錄.
目前,我尚未測試過(guò)cookie的有效期. 可能需要及時(shí)更新cookie.
測試代碼:
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
通過(guò)這種方式,您可以獲得最新的10篇文章. 如果要獲取更多歷史文章,可以修改數據中的“ begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(依此類(lèi)推)
但是,如果您想進(jìn)行大規模爬網(wǎng):
請為您自己安排穩定的代理商,降低爬蟲(chóng)速度,并準備多個(gè)帳戶(hù)以減少被阻止的可能性. 查看全部

選擇自己創(chuàng )建的圖形:

好像是公共帳戶(hù)操作教學(xué)
進(jìn)入編輯頁(yè)面后,單擊超鏈接

彈出一個(gè)選擇框,我們在框中輸入相應的正式帳戶(hù)名稱(chēng),并出現相應的商品列表

您感到驚訝嗎?您可以打開(kāi)控制臺并檢查請求的界面

打開(kāi)回復,有我們需要的文章鏈接

確認數據后,我們需要分析此界面.
感覺(jué)很簡(jiǎn)單. GET請求帶有一些參數.

Fakeid是官方帳戶(hù)的唯一ID,因此,如果要直接按名稱(chēng)獲取商品列表,則需要先獲取偽造品.
當我們輸入官方帳戶(hù)名時(shí),單擊“搜索”. 您會(huì )看到搜索界面已觸發(fā),并返回了偽造品.

此界面不需要很多參數.

接下來(lái),我們可以使用代碼來(lái)模擬上述操作.
但是您還需要使用現有的cookie以避免登錄.

目前,我尚未測試過(guò)cookie的有效期. 可能需要及時(shí)更新cookie.
測試代碼:
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
通過(guò)這種方式,您可以獲得最新的10篇文章. 如果要獲取更多歷史文章,可以修改數據中的“ begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(依此類(lèi)推)
但是,如果您想進(jìn)行大規模爬網(wǎng):
請為您自己安排穩定的代理商,降低爬蟲(chóng)速度,并準備多個(gè)帳戶(hù)以減少被阻止的可能性.