NO IMAGE

最近單位需要我做個做個可以抓取微信公眾號文章的功能,說實話本人一個菜鳥,居然要完成這樣的工作,真的太難了。本來想說做個爬蟲就好了,但是微信公眾號文章的抓取通常是到搜狗微信搜尋上去抓取,結果他的反爬蟲機制讓我這個菜鳥無從下手。後來在“偉大”的百度幫助下,我找到了現成的抓取爬蟲。不過是python寫的。解決了抓取問題,接下來就是本地化的問題。我用了PHP的file_get_contents()函式,將臨時連結的文章資訊全部儲存為字串資訊儲存在資料庫中,這樣就不擔心連結過時問題了。
接下來上程式碼,抓取的爬蟲連結在此

http://blog.csdn.net/niuxiaojia09/article/details/55260770


Controller層

 //根據文章臨時地址將文章本地化存入資料庫
public function actionGetimg()
{
$query = \Yii::$app->db;
$reulrt = $query->createCommand("SELECT * FROM `wenzhang_info` ;")->queryAll();
foreach($reulrt as $key){
$date_time=strtotime($key['date_time']);
$model = new wenzhang_bendi_static_();
$model->resetPartitionIndex($key['_id']);
$model->id= $key['_id'];
$model->title = html_entity_decode($key['title']);
$model->mpid = $key['mp_id'];
$model->cover_url = $key['cover_url'];
$model->date_time = $key['date_time'];
$model->date_unix = $date_time;
$model->msg_index = $key['msg_index'];
//根據臨時連結獲得網頁的原始碼
$html = file_get_contents($key['content_url']);
//去除<!--headTrap<body></body><head></head><html></html>-->
$html = str_replace("<!--headTrap<body></body><head></head><html></html>-->", "", $html);
//去除多餘重複的空格和<p>標籤
$html = preg_replace(array('/\s*(<br\s*\/?\s*>\s*){2,}/im','/(<p>(\s|\s*<br\s*\/?\s*>\s*)*<\/p>) /im','/(<p>(\s|\s*<span\s*\/?\s*>\s*)*<\/p>) /im'),array('\\1\\1',''), $html);
//微信圖片的跳板
$href='http://pic.visionbang.com/?url=';
//講圖片的data-src裡的連結換成src的連結
$info=preg_replace('/<img. ?data-src=\"(. ?)\"/i','<img src="'.$href.'\1"  ',$html);
//去除JS程式碼,以免視訊無法顯示
$str=preg_replace('/<(script.*?)>(.*?)<(\/script.*?)>/si', " " ,$info);
//轉換視訊連結方便顯示
$str=preg_replace('/<iframe.*?data-src=". ?vid=(. ?)&(. ?)&(. ?)&(. ?)".*?>/','<iframe src="https://v.qq.com/iframe/player.html?vid=\1&\4" style="width:100%;height:auto;display:block;overflow:hidden;"scrolling="no"frameborder="0">" ' ,$str);
$time=date('Ymd',$date_time);
$times=date('d',$date_time);
//建立資料夾
if(!is_dir("html/$time")){
mkdir("html/$time");
}
//建立資料夾
if(!is_dir("html/$time/$times")){
mkdir("html/$time/$times");
}
//路徑儲存
$path='html/'.$time.'/'.$times.'/'.$key['_id'].'.html';
//建立靜態檔案
$f=fopen($path,'w');
fwrite($f,$str);
$y=fclose($f);
//儲存路徑
$model->article_info=$path;
$model->insert();
}
//刪除抓取來的文章內容
$query->createCommand(" delete from wenzhang_info ")->execute();
return $this->render('image');
}
}

主要的困難就是幾個正則而已,因為前面的抓取功能有別人的程式碼所以我打個醬油就完成了這個功能。不過說來還是要去學下python,免得後期搜狗又改了規則我卻不知道怎麼辦。