PHP采集微信文章、图片相关内容

PHP jason 1972℃ 1评论

1 说到php数据采集。大家都很熟悉,抓取微信文章内容也不过如此,不过微信文章里面的图片有防盗链和水印,单纯的抓取是不可取的。

2 那么如果考虑突破防盗链的措施,就需要考虑在HTTPREFERER上面做手脚了。PHP 脚本中对应的变量是$SERVER[‘HTTPREFERER’] ,它存储了 HTTPREFERER 的值。

3 由于直接访问目标URL资源已经被上述防盗链的措施给屏蔽,所以我们需要个类似网关的玩意去获取。说白了就是编写已经包装过的HTTP头的 PHP 脚本,下文的api.php会完美的处理这个问题。

微信采集大致分为以下几个步骤

1 新建api.php文件,可以会用curl和file_get_contents两种方式破解防盗链(微信文章是图片做了防盗链所以我们需要传图片的url)

curl()

$url = $_GET['url']; // 图片url
if(empty($url)) {
    exit('请求url不存在');
}
$refer = 'http://mp.weixin.qq.com'; // 微信网址
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_REFERER, $refer);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
$values = curl_exec($curl);
curl_close($curl);
header("Content-type: image/webp");
echo  $values;

file_get_contents()

$url = $_GET['url']; // 图片url
if(empty($url)) {
    exit('请求url不存在');
}
$refer = 'http://mp.weixin.qq.com'; // 微信网址
$option = array( 
        'http' => array( 
            'header' => "Referer:$refer") 
        ); 
$context = stream_context_create($option); 
echo file_get_contents($url, false, $context); 

2 新建书写抓取文章内容的文件 getWxInfo.php

3 file_get_contents() 获取文章整体内容

 $url = "http://mp.weixin.qq.com/s?__biz=MzAwOTU5ODYwNg==&mid=401750342&idx=1&sn=a4bd018cf36b40621436c5d13ab7ac2a&scene=1&srcid=0331Zj1xe3jXIGAT3daDUmXJ#wechat_redirect";
 $str = file_get_contents($url);

4 正则匹配需要的正文

$pattern1 = "/< div class=\"rich_media_content \" id=\"js_content\">([\d\D]*)<\/div>([^<>]*)< script nonce=\"([^<>]*)\" type=\"([^<>]*)\">/";
preg_match_all($pattern1, $str, $matches1);
$content = $matches1[0][0];

注释:由于正则编码问题$pattern1多加了两个空格下图是完整版截图,请参考

5 获取到文章的图片 ( 用来做替换操作 )

$pattern2="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
preg_match_all($pattern2,$str,$matches2);

6 我们需要抓取每张图片不同的相关参数方便来做替换。( 因文章内容不同,具体的抓取区别数据也就会有出入,这个需要自己查看源代码 )

$pattern3="/data-ratio=([^<>]*) data-w/";
preg_match_all($pattern3,$str,$matches3);

7 执行图片的URL替换操作

foreach($matches2[1] as $key => $val) {
    $a = 'data-src="'.$val.'" class="tn-Powered-by-XIUMI" data-type="jpeg" data-ratio='.$matches3[1][$key].' data-w=""';
    $b = 'data-src="'.$val.'" class="tn-Powered-by-XIUMI" data-type="jpeg" data-ratio='.$matches3[1][$key].' data-w src="http://yuntouhui.cn/getWxApiImgUrl?url='.$val.'"';
    $content = str_replace($a,$b,$content);
}

8 操作数据,将采集的数据库添加数据库或者另存其他地方 ( 我这里是做的修改数据库数据 )

DB::update("update project_grab set content = '".$content."',is_grab = 1 where id = 93");

抓取文章的整体内容

完成! 有不太清楚的请留言

转载请注明:Jason博客 » PHP采集微信文章、图片相关内容

喜欢 (11)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

记载着一个程序员的编码历程