通过搜狗搜索采集公众年夜众号历史有几个问题:
1、有验证码;
2、历史列表只有最近10条群发内容;
3、文章地址是有有效期的;
4、听说批量采集还要换ip;
通过我前面文章的方法就没有这些问题,虽然采集系统搭建不如传统采集器写个规则去爬就可以了那么大略。但是一次搭建好之后批量采集的效率还是可以的。而且采集的文章地址是永久有效的,并且可以采集到一个"大众年夜众号所有的历史。
我们还是从一个公众年夜众号文章的链接地址开始看:
1、从微信右上角菜单复制到的链接地址:
http://mp.weixin.qq.com/s/fF34bERZ0je_8RWEJjoZ5A
2、历史列表中获取到的地址:
http://mp.weixin.qq.com/s?__biz=MjM5NDAwMTA2MA==&mid=2695729619&idx=1&sn=8be0b6bd0210cee0d492ebdf20f7371f&chksm=83d74818b4a0c10ef286b33bb7deb73226125f866ddb5b2781166066a69afef3705eabdb3b85&scene=4#wechat_redirect
3、完全的真实地址:
https://mp.weixin.qq.com/s?__biz=MjM5NDAwMTA2MA==&mid=2695729619&idx=1&sn=8be0b6bd0210cee0d492ebdf20f7371f&chksm=83d74818b4a0c10ef286b33bb7deb73226125f866ddb5b2781166066a69afef3705eabdb3b85&scene=37&key=c81d77271180a0e6ce32be2d9dcaa2a7436aeba2c1d47a20d02194d1c944a8286a8eded93495eeadd05da412bbfaa638a379750aeaa4cf5c00e4d7851c5710d9b9736b80e3c72770a57a515c23ff2400&ascene=3&uin=MzUyOTIyNQ%3D%3D&devicetype=iOS10.1.1&version=16050120&nettype=WIFI&fontScale=100&pass_ticket=FGRyGfXLPEa4AeOsIZu7KFJo6CiXOZex83Y5YBRglW4%3D&wx_header=1
以上这3个地址是同一篇文章的地址,在不同位置获取到就得到了完备不同的3个结果。
和历史页一样,微信有一套自动补充参数的机制。第一个地址是复制链接得到的,看起来是一个伪装的编码。实在没什么用我们不做考虑了。第二个地址是通过前面文章先容的方法,从历史的json文章列表中获得到的链接地址,我们便是可以将这个地址保存到数据库中。之后就可以通过这个地址从做事器获取到文章内容。而第三个链接补充了参数之后,目的是为了让文章页面中的阅读量js可以获取到阅读量点赞量的json结果而加上的参数。我们前面文章的方法中由于文章页面被客户端打开显示了出来,由于有了这些参数,文章页面中的js就去自动获取阅读量了,以是我们才能通过代理做事获取到这篇文章的阅读量。
这篇文章的内容便是以通过本专栏前面文章先容的方法已经获取到了大量微信文章的根本上,详细研究如何获取到文章内容和其它一些有用的信息的方法。
(我的数据库中保存的文章列表,一部分字段)
1、获取文章源代码:
通过php的函数file_get_content()就可以将文章源代码读取到变量中。微信文章的源代码由于可以从浏览器中打开以是我就不在这里粘贴了,以免摧残浪费蹂躏页面空间。
<?
//$content_url 变量的值为文章地址
$html = file_get_contents($content_url);
?>
2、源代码中有用的信息:
1)原文内容:
原文内容是包含在一个<p id='js_content'></p>标签中的,通过php代码获取:
<?
preg_match_all(\公众/id=\\"大众js_content\\公众>(.)<script/iUs\"大众,$html,$content,PREG_PATTERN_ORDER);
$content = \"大众<p id='js_content'>\"大众.$content[1][0];
?>
正则的开头识别<p id='js_content'>,结尾识别<script/iUs,匹配到之后前面再补充一个<p id='js_content'>;我的正则匹配水平有限,只能写成这样的了。希望有高人能指示更好的正则匹配方法。
其余把稳:这个匹配规则会可能在一段韶光之后有变革。这篇文章会只管即便保持更新。如果你根据我的文章制作了采集系统之后,当某一天失落效了,别忘了回来再看看文章是否有更新。
2)内容处理:
通过上面的方法我们得到了文章内容的html,但是你将文章内容显示出来之后就会创造,图片和视频不能正常显示。由于这个html还须要一些加工:
首先是图片,微信文章中的<img>标签中的src属性全部都用了src属性代替。只有在显示的时候才会被更换过来。以是我们也有两个方案,将源代码直接更换过来,或者用js在显示时候再更换。下面我先先容直接更换html的方法:
<?
//$content变量的值是前面获取到的文章内容html
$content = str_replace(\公众src\"大众,\公众src\公众,$content);
?>
然后是视频,视频的显示不正常,经由长期测试后创造只要更换一个页面地址就能办理,过程就不说了,直接说结果:
<?
//$content变量的值是前面获取到的文章内容html
$content = str_replace(\"大众preview.html\公众,\"大众player.html\"大众,$content);
?>
通过这两个更换之后,文章内容html中的图片和视频就都正常了。
3) "大众年夜众号干系信息:
通过本专栏之前的文章,先容了我们利用微信客户端,任意打开一个"大众年夜众号的历史页之后。系统从数据库中识别biz的值,创造数据库中没有记录,就会插入一条新的记录。之后的采集行列步队就会定期根据这个biz来获取这个"大众年夜众号的历史列表。
但是我们只得到了这个公众年夜众号的biz,"大众年夜众号的名称,头像这两个主要信息还是没有获取到。紧张缘故原由是历史页面中没有这两个信息。但是我们可以从文章页面中获取到。
在微信文章页面html的底部,有一些js的变量赋值的代码,通过正则匹配之后我们就可以得到这两个"大众年夜众号的信息:
<?
//$html变量的值是前面获取到的文章全部html
preg_match_all('/var nickname = \\"大众(.?)\\"大众;/si',$html,$m);
$nickname = $m[1][0];//公众年夜众号昵称
preg_match_all('/var round_head_img = \\公众(.?)\\"大众;/si',$html,$m);
$head_img = $m[1][0];//公众年夜众号头像
?>
通过这两个正则匹配,我们就能获取到"大众年夜众号的头像和昵称,然后根据文章地址中的biz,可以保存到对应的微旗子暗记数据表中。
3、文章的保存和处理
前面的代码已经将文章内容获取到变量中了。如何保存实在每个人大概都有自己的想法。我这里先容一下我的保存内容的方法:
将文章内容的html以数据库id为文件名保存成html文件,以biz字段为目录。
<?
$dir = \"大众./\"大众.$biz.\"大众/\"大众;
$filename = $dir.$id.\"大众.html\"大众;
if(!is_dir($dir)) {
mkdir($cache_dir);
chmod($cache_dir,0777);
}
$file = fopen($filename, \公众w\"大众);
fwrite($file, $content);
fclose($file);
?>
以上代码是一个标准的php建立文件夹保存文件的代码,大家可以根据自己的实际情形安排保存方法。
在这之后我们就可以在自己的做事器上得到一个html文件,内容便是"大众年夜众号的文章内容。我们可以从浏览器中打开看一下。这时你大概会创造图片防盗链了!
无法正常显示!
包括数据库中保存的文章封面图,"大众年夜众号的头像都是防盗链的。
别急,这个问题很好办理,只须要将图片也保存到自己的做事器,无非是将来会占用自己的做事器空间和带宽。
图片防盗链的事理是当图片在网页中显示的时候,图片做事器会检测到引用这张图片的做事器域名,当创造做事器域名不包含http://qq.com或http://qpic.cn的时候就会被更换成防盗链图片。
但是如果检测不到引用页面的域名就会正常显示,以是我们通过php的函数file_get_content()就可以将图片的二进制代码获取过来,然后根据自己的想法起个文件名保存到自己的做事器上。在这里再先容一个保存图片的方法,我目前利用了腾讯云的“万象优图”,通过它们供应的api将图片保存到云空间,这样的好处是读取图片时直接在图片的链接地址加上希望得到的图片尺寸大小参数,就可以直接得到一张缩略图。比存在自己的做事器方便得多。阿里云也该当有同样的产品,彷佛名叫工具存储。
其余,我采集"大众年夜众号内容的目的是制作成一个新闻app,在app中将html代码显示出来之后,由于app同样没有域名,防盗链做事器也同样不会认为图片被盗链了。这样就可以直接显示图片出来。