PHP写⽂章页采集⽅法
通过搜狗搜索采集历史消息有⼏个问题:
1、有验证码;
灾难电影2、历史消息列表只有最近10条发内容;
3、⽂章地址是有有效期的;
4、据说批量采集还要换ip;
通过我前⾯⽂章的⽅法就没有这些问题,虽然采集系统搭建不如传统采集器写个规则去爬就可以了那么简单。但是⼀次搭建好之后批量采集的效率还是可以的。⽽且采集的⽂章地址是永久有效的,并且可以采集到⼀个所有的历史消息。
我们还是从⼀个⽂章的链接地址开始看:
拍了拍怎么设置1、从右上⾓菜单复制到的链接地址:
2、历史消息列表中获取到的地址:
3、完整的真实地址:
以上这3个地址是同⼀篇⽂章的地址,在不同位置获取到就得到了完全不同的3个结果。
和历史消息页⼀样,有⼀套⾃动补充参数的机制。第⼀个地址是复制链接得到的,看起来是⼀个伪装的编码。其实没什么⽤我们不做考虑了。第⼆个地址是通过前⾯⽂章介绍的⽅法,从历史消息的json⽂章列表中获得到的链接地址,我们就是可以将这个地址保存到数据库中。之后就可以通过这个地址从服务器获取到⽂章内容。⽽第三个链接补充了参数之后,⽬的是为了让⽂章页⾯中的阅读量js可以获取到阅读量点赞量的json结果⽽加上的参数。我们前⾯⽂章的⽅法中因为⽂章页⾯被客户端打开显⽰了出来,因为有了这些参数,⽂章页⾯中的js就去⾃动获取阅读量了,所以我们才能通过代理服务获取到这篇⽂章的阅读量。
这篇⽂章的内容就是以通过本专栏前⾯⽂章介绍的⽅法已经获取到了⼤量⽂章的基础上,详细研究如何获取到⽂章内容和其它⼀些有⽤的信息的⽅法。
(我的数据库中保存的⽂章列表,⼀部分字段)
1、获取⽂章源代码:
通过php的函数file_get_content()就可以将⽂章源代码读取到变量中。⽂章的源代码因为可以从浏览器中打开所以我就不在这⾥粘贴了,以免浪费页⾯空间。
<?
//$content_url 变量的值为⽂章地址
$html = file_get_contents($content_url);
>
2、源代码中有⽤的信息:
1)原⽂内容:
原⽂内容是包含在⼀个<div id='js_content'></div>标签中的,通过php代码获取:
<?
preg_match_all("/id=\"js_content\">(.*)<script/iUs",$html,$content,PREG_PATTERN_ORDER);
$content = "<div id='js_content'>".$content[1][0];
>
正则的开头识别<div id='js_content'>,结尾识别<script/iUs,匹配到之后前⾯再补充⼀个<div id='js_c
ontent'>;我的正则匹配⽔平有限,只能写成这样的了。希望有⾼⼈能指点更好的正则匹配⽅法。
梁祝的歌词另外注意:这个匹配规则会可能在⼀段时间之后有变化。这篇⽂章会尽量保持更新。如果你根据我的⽂章制作了采集系统之后,当某⼀天失效了,别忘了回来再看看⽂章是否有更新。
2)内容处理:
通过上⾯的⽅法我们获得了⽂章内容的html,但是你将⽂章内容显⽰出来之后就会发现,图⽚和视频不能正常显⽰。因为这个html还需要⼀些加⼯:
⾸先是图⽚,⽂章中的<img>标签中的src属性全部都⽤了data-src属性代替。只有在显⽰的时候才会被替换过来。所以我们也有两个⽅案,将源代码直接替换过来,或者⽤js在显⽰时候再替换。下⾯我先介绍直接替换html的⽅法:
<?
//$content变量的值是前⾯获取到的⽂章内容html
$content = str_replace("data-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);
>抖音网名女霸气2021
以上代码是⼀个标准的php建⽴⽂件夹保存⽂件的代码,⼤家可以根据⾃⼰的实际情况安排保存⽅法。
在这之后我们就可以在⾃⼰的服务器上得到⼀个html⽂件,内容就是的⽂章内容。我们可以从浏览器中打开看⼀下。这时你也许会发现图⽚防盗链了!⽆法正常显⽰!包括数据库中保存的⽂章封⾯图,的头像都是防盗链的。
别急,这个问题很好解决,只需要将图⽚也保存到⾃⼰的服务器,⽆⾮是将来会占⽤⾃⼰的服务器空间和带宽。
但是如果检测不到引⽤页⾯的域名就会正常显⽰,所以我们通过php的函数file_get_content()就可以将图⽚的⼆进制代码获取过来,然后根据⾃⼰的想法起个⽂件名保存到⾃⼰的服务器上。在这⾥再介绍⼀个保存图⽚的⽅法,我⽬前使⽤了腾讯云的“万象优图”,通过它们提供的api将图⽚保存到云空间,这样的好处是读取图⽚时直接在图⽚的链接地址加上希望得到的图⽚尺⼨⼤⼩参数,就可以直接得到⼀张缩略图。⽐存在⾃⼰的服务器⽅便得多。阿⾥云也应该有同样的产品,好像名叫对象存储。
另外,我采集内容的⽬的是制作成⼀个新闻app,在app中将html代码显⽰出来之后,因为app同样没有域名,防盗链服务器也同样不会认为图⽚被盗链了。这样就可以直接显⽰图⽚出来。
以上就是我总结的⽂章内容的采集与存储⽅法,希望能够帮到你。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论