記錄微信公衆號歷史文章採集(三、爬取歷史文章信息和原文地址)

記錄微信公眾號歷史文章採集(三、爬取歷史文章信息和原文地址)

記錄微信公眾號歷史文章採集(三、爬取歷史文章信息和原文地址)

原作者(飯口組組長)有一句話:我的方法來源於許多同行的分享精神,所以我也會延續這個精神,將我的成果分享出來。

這系列的文章也是為了延續這份分享精神!

該系列文章是根據知乎專題的教程一步一步實現過程,以及實現過程中踩過的一些坑。

關於原理介紹這裡就不重複了,大家可以參考知乎專題。

前期的代碼可以在專題中找到。

PHP代碼修改

在完善php代碼之前,我們要先準備一份鏈接數據的代碼。這裡也沒準備用啥框架實現,就直接寫了個簡單的獲取pdo鏈接的函數:

記錄微信公眾號歷史文章採集(三、爬取歷史文章信息和原文地址)

代碼這裡就不做詳細解釋了,感興趣的可以去了解下pdo。

接下來完善getMsgJson.php,這個文件。該php就能實現爬取歷史頁面的文章信息和原文地址了。但爬取微信文章內容還需要其他代碼。

嗯嗯,直接給改好的代碼吧,有不懂的可以私聊問作者吧,有空儘量回。


include 'getConnection.php';
$str = $_POST['str'];
$url = $_POST['url'];//先獲取到兩個POST變量
//先針對url參數進行操作
parse_str(parse_url(htmlspecialchars_decode(urldecode($url)),PHP_URL_QUERY ),$query);//解析url地址
$biz = $query['__biz'];//得到公眾號的biz
//接下來進行以下操作
//從數據庫中查詢biz是否已經存在,如果不存在則插入,這代表著我們新添加了一個採集目標公眾號。
$pdo = getConnection();
$sql = 'SELECT * FROM weixin WHERE biz = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $biz);
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$res) {
$sql = 'INSERT INTO weixin (biz, collect) VALUES (?, ?)';
$stmt = $pdo->prepare($sql);
$stmt->execute(array($biz, strtotime("now")));
}
//再解析str變量
$json = urldecode($str);//首先進行json_decode
file_put_contents('./his.txt', $json);

// $json = htmlspecialchars_decode($json);//首先進行json_decode
$json = json_decode($json, true);//首先進行json_decode
if(!$json){
$json = json_decode(htmlspecialchars_decode($str),true);//如果不成功,就增加一步htmlspecialchars_decode
}
foreach($json['list'] as $k=>$v){
$type = $v['comm_msg_info']['type'];
if($type==49){//type=49代表是圖文消息
$content_url = str_replace("\", "", htmlspecialchars_decode($v['app_msg_ext_info']['content_url']));//獲得圖文消息的鏈接地址
$is_multi = $v['app_msg_ext_info']['is_multi'];//是否是多圖文消息
$datetime = $v['comm_msg_info']['datetime'];//圖文消息發送時間
//在這裡將圖文消息鏈接地址插入到採集隊列庫中(隊列庫將在後文介紹,主要目的是建立一個批量採集隊列,另一個程序將根據隊列安排下一個採集的公眾號或者文章內容)
$sql = 'SELECT id FROM tmplist WHERE content_url = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $content_url);
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$res) {
$sql = 'INSERT INTO tmplist (content_url) VALUES (?)';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $content_url);
$res = $stmt->execute();
$post = array();
$post['field_id'] = $v['app_msg_ext_info']['fileid'];//一個微信給的id
$post['title'] = $v['app_msg_ext_info']['title'];//文章標題
$post['title_encode'] = urlencode(str_replace(" ", "", $post['title']));//建議將標題進行編碼,這樣就可以存儲emoji特殊符號了
$post['digest'] = $v['app_msg_ext_info']['digest'];//文章摘要
$post['source_url'] = str_replace("\", "", htmlspecialchars_decode($v['app_msg_ext_info']['source_url']));//閱讀原文的鏈接
$post['cover'] = str_replace("\", "", htmlspecialchars_decode($v['app_msg_ext_info']['cover']));//封面圖片
$post['is_top'] = 1;//標記一下是頭條內容
$post['is_multi'] = $is_multi;
$post['biz'] = $biz;

$post['content_url'] = $content_url;
$post['zdatetime'] = $datetime;//文章摘要
//現在存入數據庫
$sql = 'INSERT INTO post (biz, field_id, title, title_encode, digest, content_url, source_url, cover, is_top, is_multi, zdatetime) VALUES (:biz, :field_id, :title, :title_encode, :digest, :content_url, :source_url, :cover, :is_top, :is_multi, :zdatetime)';
$stmt = $pdo->prepare($sql);
$res = $stmt->execute($post);
}
if($is_multi==1){//如果是多圖文消息
foreach($v['app_msg_ext_info']['multi_app_msg_item_list'] as $kk=>$vv){//循環後面的圖文消息
$content_url = str_replace("\","",htmlspecialchars_decode($vv['content_url']));//圖文消息鏈接地址
//這裡再次根據$content_url判斷一下數據庫中是否重複以免出錯
$sql = 'SELECT id FROM tmplist WHERE content_url = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $content_url);
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$res) {
$sql = 'INSERT INTO tmplist (content_url) VALUES (?)';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $content_url);
$res = $stmt->execute();
//在這裡將圖文消息鏈接地址插入到採集隊列庫中(隊列庫將在後文介紹,主要目的是建立一個批量採集隊列,另一個程序將根據隊列安排下一個採集的公眾號或者文章內容)
$post = array();
$post['title'] = $vv['title'];//文章標題
$post['field_id'] = $vv['fileid'];//一個微信給的id
$post['title_encode'] = urlencode(str_replace(" ","",$post['title']));//建議將標題進行編碼,這樣就可以存儲emoji特殊符號了
$post['digest'] = htmlspecialchars($vv['digest']);//文章摘要
$post['source_url'] = str_replace("\","",htmlspecialchars_decode($vv['source_url']));//閱讀原文的鏈接
$post['cover'] = str_replace("\","",htmlspecialchars_decode($vv['cover']));//封面圖片
//$cover = getCover(str_replace("\","",htmlspecialchars_decode($vv['cover'])));
$post['zdatetime'] = $datetime;
$post['is_multi'] = $is_multi;

$post['is_top'] = 0;
$post['biz'] = $biz;
$post['content_url'] = $content_url;
//現在存入數據庫
$sql = 'INSERT INTO post (biz, field_id, title, title_encode, digest, content_url, source_url, cover, is_multi, is_top, zdatetime) VALUES (:biz, :field_id, :title, :title_encode, :digest, :content_url, :source_url, :cover, :is_multi, :is_top, :zdatetime)';
$stmt = $pdo->prepare($sql);
$res = $stmt->execute($post);
}
}
}
}
}

想要看效果的可以把getWxHis.php、getWxPost.php中的echo語句註釋掉。

記錄微信公眾號歷史文章採集(三、爬取歷史文章信息和原文地址)

未完待續……To be Continued……

希望這篇文章能給你帶來知識和樂趣,喜歡博主的文章可以加博主好友哦


分享到:


相關文章: