正则表达式 - 如何用 php 抓取微信文章正文?
阿神
阿神 2017-04-10 15:43:48
[PHP讨论组]

我是一个新手,想使用php抓取微信页面的正文和标题,标题直接用正则表达式|(.*?)<\/title>|i</code>就抓取到了,但是正文我想的是<code>|>(.*?)<\/|i</code>匹配标签间的内容,再去掉空格,但是还是会匹配到一堆标签,是怎么回事?或者说有其他更好的方法吗?求指教!</p> <p>http://mp.weixin.qq.com/s?__biz=MzA5NTQ2NjUzMA==&mid=207136729&...</p> <p>这是一般的微信文章内容链接</p> <p>下面是这链接的页面代码</p> <pre class='brush:php;toolbar:false;'><code><br><!DOCTYPE html><html> <head> <script type="text/javascript"> var sampling = Math.random() < 0.001; var page_begintime = (+new Date()); (sampling) && ((new Image()).src = "http://isdspeed.qq.com/cgi-bin/r.cgi?flag1=7839&flag2=7&flag3=8&15=1000&r=" + Math.random()); var biz = "MzA5NTQ2NjUzMA=="; var sn = "a82af7b7ba0bee9a7017b607dc7e5d4b" || ""; var mid = "207136729" || ""; var idx = "1" || "" ; //辟谣需求 var is_rumor = ""*1; var norumor = ""*1; if (!!is_rumor&&!norumor){ if (!document.referrer || document.referrer.indexOf("mp.weixin.qq.com/mp/rumor") == -1){ location.href = "http://mp.weixin.qq.com/mp/rumor?action=info&__biz=" + biz + "&mid=" + mid + "&idx=" + idx + "&sn=" + sn + "#wechat_redirect"; } } //原创需求,需要跳转到中间页 /* var copyrightInfo = { display_source : ""*1, nocopyrightsource : ""*1 }; if (!!copyrightInfo.display_source&&!copyrightInfo.nocopyrightsource){ if (!document.referrer || document.referrer.indexOf("mp.weixin.qq.com/mp/reprint") == -1){ location.href = "http://mp.weixin.qq.com/mp/reprint?action=info&__biz=" + biz + "&mid=" + mid + "&idx=" + idx + "&sn=" + sn + "#wechat_redirect"; } }*/ </script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link rel="dns-prefetch" href="//res.wx.qq.com"><link rel="dns-prefetch" href="//mmbiz.qpic.cn"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" /><link rel="shortcut icon" type="image/x-icon" href="http://res.wx.qq.com/mmbizwap/zh_CN/htmledition/images/icon/common/favicon22c41b.ico"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="format-detection" content="telephone=no"><script type="text/javascript"> var uin = ""; var key = ""; var pass_ticket = ""; String.prototype.html= function(encode) { var replace =["'", "'", """, '"', " ", " ", ">", ">", "<", "<", "&", "&", "¥", "¥"]; //console.log(replace); if(encode){ replace.reverse(); } for (var i=0,str=this;i< replace.length;i+= 2){ str=str.replace(new RegExp(replace[i],'g'),replace[i+1]); } return str; }; pass_ticket = encodeURIComponent(pass_ticket.html(false).html(false).replace(/\s/g,"+")); </script> <title>Living Music校园歌唱大赛半决赛距离开赛还有???

Living Music校园歌唱大赛半决赛距离开赛还有???

提交

我的评论

    加载中

    已评论

    Living Music校园歌唱大赛半决赛距离开赛还有???

    2015-04-27 gzgsytw gzgsytw

    gzgsytw

    gzgsytw0

    校园内有关团委的一切动态一切资讯都可在这里接收查找。

    Living Music校园歌唱大赛半决赛距离开赛还有???


    精彩绝伦的复赛没有来观看?没关系!30进15的淘汰赛已经结束,15进5的半决赛就在今晚!



    今晚六点半Living Music大赛花都校区的十五强选手将在实验楼105举行的半决赛当中角逐出进入最终决赛的五名选手,届时将和三水校区进入决赛的五名选手共同组成广工商十强歌手来竞争广工商最强音的宝座!!


    广工商最强音的诞生需要你的见证,come on 小伙伴,即使不是最专业的点评家,你也可以是最专业的聆听者


    Living Music大赛花都校区15进5的半决赛

    4月27日18:30(即今晚)

    实验楼105



    阅读

    举报

    微信扫一扫
    关注该公众号

    阿神
    阿神

    闭关修行中......

    全部回复(11)
    PHPz

    随便折腾~见笑

    php    $url = "http://mp.weixin.qq.com/s?__biz=MzA5NTQ2NjUzMA==&mid=207136729&idx=1&sn=a82af7b7ba0bee9a7017b607dc7e5d4b&scene=5#rd";
        $contents = file_get_contents($url);
        $contents = explode('js_article', $contents);
        $contents = $contents[1];
        $contents = explode('<script>window.moon_map', $contents);
        $contents = $contents[0];
        $contents = '<p id="js_article'.$contents;
    
    高洛峰

    这种问题,放弃用正则吧,要真正完备的你可能得写一篇文章那样长。但 html 已经是结构化的了,找个 html 解析库就行了,我刚用 firebug 粗略的看了下,正文是在 id 为 page-content 的 p 里。

    当然,如果我所看到的是受 js 影响后的页面状态,那你可能得挂个浏览器内核来帮你获取到最终页面状态了。幸好,这个有很多开源的。

    高洛峰

    可以尝试使用DOM操作库simple-html-dom.php,快速获取HTML结构的内容:

    <?php
    require dirname(__FILE__).'/simple_html_dom.php';
    $html = file_get_html('http://php.net/');
    $articles = array();
    foreach($html->find('article.newsentry') as $article) {
        $item['time']    = trim($article->find('time',            0)->plaintext);
        $item['title']   = trim($article->find('h2.newstitle',    0)->plaintext);
        $item['content'] = trim($article->find('p.newscontent', 0)->plaintext);
        $articles[] = $item;
    }
    print_r($articles);
    

    可以把抓取到的内容写入置于内存上的SQLite(/run/shm/php/crawler.db3),避免频繁的磁盘IO.

    ringa_lee

    把文章页面代码贴上来。

    怪我咯

    曾经尝试爬取微信文章,结果被黑警告 = =

    ringa_lee

    没必要用正则表达式的,可以用PHP像jQuery那样直接操作DOM的,你可以参考一下。 http://www.cnphp.info/php-simple-html-dom-parser-intro.html

    高洛峰

    我之前使用的phpquery去抓的微信文章,从搜狗进去的,但是不能太频繁,我是把列表抓下来,存入数据库,然后用计划任务60秒抓一次详情,这里的详情注意里面的html解析,我记得视频地址跟图片解析是要注意下的,

    巴扎黑

    建议使用selenium工具通过浏览器渲染获取到加载完成后的界面,然后通过界面解析获取想要的内容~

    黄舟

    看到一个爬微信的站http://dedecms5.com

    ringa_lee

    是用工具库
    phpquery
    类似jQuery的方式解析html
    用来抓站什么的很方便

    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号