test.rar(15.93 KB, 下载次数: 0)
点击文件名下载附件
这html的内容靠什么是如何排序的,有没有办法让右键查看时候源码里面输出正常排序的
phantomjs不行
会解决的50红包奉上,主要是想学习自己不会的东西。
ps:可以直接浏览器打开html文件看效果
能给他重新排序正常才能去爬。不是指手动改正排序。
现在连原理都不知道,能用php重新排序那最好了。
有些人看不明白我说的,我在详细表达一下问题。
正常打开第一行是
- “对,男孩儿这几年蹿个儿特别快。”
复制代码
查看源码第一行是
- 贺寂摊了摊手,“不知道。
复制代码
答案都在楼下了,js改成本地做个备份给后人参考
请写出php的大佬联系我领红包,同时感谢其他mjj的贡献,此贴保留,为论坛做贡献
浙江网友:正文内容直接就是按dom顺序遍历存为一个数组。
base64.decode(document.getElementsByTagName(‘meta’)[5].getAttribute(‘content’)).split(/[A-Z]+%/)
这里把content里的排序解密,在按 单个字母%分割存为一个数组
比如解密出来后,前三个数字是[13,7,10,……]
再遍历排序数组,通过
var k = Math.ceil((i + 1) % this.code);
k = Math.ceil(m – k);
return k
计算最后得出来的顺序,m就是13,i就是循环的i从0开始,this.code是页面上的codeurl值,这个网页是6。
就是k = Math.ceil((0+1) % 6);
k = Math.ceil(13-1);
那么最后得出排序是12。
那么然后存为一个新的数组 list[12] = this.box.childNodes[0];
也就是说源代码的第一句this.box.childNodes[0],最后算出来是显示的第十三句list[12];
中间有些代码是插入防浏览器里复制的不用管。
湖北网友:楼下了
湖北网友:稍等 我来看看
青海网友:br 是换行,就是靠换行来排序的
湖南网友:哪里有排序???
广东网友:正常的换行啊,没看懂你的意思
云南网友: JS 加密, 扣算法可以了…还不如发网页
湖北网友:里面的域名就是原网页。抠出来只是方便大佬看
福建网友:楼下我不会
海南网友:
干不了。服务器加的随机排序
辽宁网友:
干不了。服务器加的随机排序
辽宁网友:把原页面的js文件 都打包一下,算法很可能在那个article.js?tt=xxxxx 文件中
所以它比较关键 我这里无法访问这个文件
香港网友:算法都在article.js里,排序在<meta name="client" content="MTNKJTdYJTEwRyU4RiU2SSUxOFMlMTBIJTEzTiUyNFclMThKJTIwTyUyMlolMjdIJTIyViUyMlQlMjhFJTEzWiUwWCUyNEwlMjdRJTVUJTE0RiUxOEclM1clMThGJThFJTE5">
base64解密一下content内容,然后分割成数组处理就行了。
重庆网友:
- base64 = {
- map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
- decode: function(a) {
- var b = binary = ”;
- for (var i = 0; i < a.length; i++) {
- if (a.substr(i, 1) == ‘=’) {
- break
- }
- ;var c = this.map.indexOf(a.charAt(i)).toString(2);
- binary += {
- 1: ‘00000’,
- 2: ‘0000’,
- 3: ‘000’,
- 4: ’00’,
- 5: ‘0’,
- 6: ”
- }[c.length] + c
- }
- ;binary = binary.match(/[0-1]{8}/g);
- for (var i = 0; i < binary.length; i++) {
- b += String.fromCharCode(parseInt(binary[i], 2))
- }
- ;return b
- }
- }
- UpWz=function(m, i) {
- var k = Math.ceil((i + 1) % codeurl);
- k = Math.ceil(m – k);
- return k
- }
- var e = base64.decode(document.getElementsByTagName(‘meta’)[5].getAttribute(‘content’)).split(/[A-Z]+%/);
- var childNodes= document.getElementById(‘content’).childNodes;
- var elist=[]
- for (var i = 0; i < e.length; i++) {
- var k = this.UpWz(e[i], i);
- elist[k] = childNodes[i]
- }
复制代码
elist就是排序后的ele列表了,这个站为了反爬使用的是和99lib差不多的方式,都是打乱顺序
湖北网友:厉害,学习了
江西网友:但是那个正文内容div上面没有排序的id,是按什么规律自动填数组值的
青海网友:
- <div class="y26559276">我后来回忆,真正拉近我和路平之间距离的,是一个小姑娘。</div><div class="h449843340">她不爱喝,口渴了就自己偷大人的普洱茶喝去,那么酽的茶,咕嘟咕嘟两声就吞下去了,还知道咂吧咂吧嘴。</div><div class="o165770203">我心里软了一下,说:疼啊……</div><div class="i845318307">我后来回忆,真正拉近我和路平之间距离的,是一个小姑娘。</div><div class="f600733276">
复制代码99lib用phantomjs爬那个内容 div上有排序的id。我发的那个phantomjs执行后还是没id。比99lib要复杂
广东网友:正文内容直接就是按dom顺序遍历存为一个数组。
base64.decode(document.getElementsByTagName(‘meta’)[5].getAttribute(‘content’)).split(/[A-Z]+%/)
这里把content里的排序解密,在按 单个字母%分割存为一个数组
比如解密出来后,前三个数字是[13,7,10,……]
再遍历排序数组,通过
var k = Math.ceil((i + 1) % this.code);
k = Math.ceil(m – k);
return k
计算最后得出来的顺序,m就是13,i就是循环的i从0开始,this.code是页面上的codeurl值,这个网页是6。
就是k = Math.ceil((0+1) % 6);
k = Math.ceil(13-1);
那么最后得出排序是12。
那么然后存为一个新的数组 list[12] = this.box.childNodes[0];
也就是说源代码的第一句this.box.childNodes[0],最后算出来是显示的第十三句list[12];
中间有些代码是插入防浏览器里复制的不用管。
内蒙古网友:源代码里第二行this.box.childNodes[1]
算出来就是
k = Math.ceil((1+1) % 6);
k = Math.ceil(7-2);
排序ist[5],也就是最后显示出来第6行。
反正算法就这样的。
采集要获取页面上的meta content排序,codeurl值,然后正文内容就按源代码的dom遍历存入,再排序就行了。
贵州网友:解释的很详细,谢谢大佬,我去试试能不能搞定。
山东网友:解释的很详细,谢谢大佬,我去试试能不能搞定。
云南网友:一斤多猪肉就要大佬出手啊
甘肃网友:
99lib用phantomjs可以正常爬,上面的就爬不了,js我是不懂,懂也不会来问了。
你没有仔细看我回复,我说的是phantomjs爬之后有排序的id会出来
河北网友:你没仔细看其他人的回复才对,该说的都说了,就差喂嘴里了
你一直说phantomjs爬不到这个站,那是你不会用
你再仔细看看这些个id和排序有没有关系
四川网友:
别人说的我肯定仔细看了,我来求问题能不看吗,18楼说的是解码后根据%分割得到排序 dom的div 分割存到数组 dom什么的我不会,但我也在努力学, 然后使用处理后的数组合并起来重新去排序,你说我不会用phantomjs,那大佬你来讲讲怎么使用。
浙江网友:我承认我很菜,整不明白你在说啥,所以你和其他人讨论这些问题吧,不要再回复我了,我都菜哭了,经不起折腾了
江西网友:js不是很熟,所以写了份py代码来解码
https://gist.github.com/gougou6423/818d6a40d20574e79ff7cd693534e18d
山西网友:能不能写个php版的
山东网友:你稍微修改下那个python代码,加上传参,然后用php的exec()调用不就好了
广西网友:我对py和js一无所知,难道是时候放弃php转投py?
台湾网友:我对py和js一无所知,难道是时候放弃php转投py?
内蒙古网友:
大佬这个代码有排序的效果,但是排序和原来的不一样。
原来的正常排序最后一行是
- 可人小孩儿千里迢迢来到这里,举目无亲,也就自己这一个算得上故旧的人,贺寂就算再是铁石心肠,也干不
复制代码
福建网友:源于@gougou6423
//PHP sort() 处理的不对 搞个for循环一下就好了
- <?php
- class MyHTMLParser {
- private $line = array();
- private $table = array();
- private $content;
- private $lines = array();
- private $codeurl = 0;
- public $count = 0;
- public function MyHTMLParser($name) {
- //print $name;
- $this->content = file_get_contents($name);
- preg_match_all(‘/<meta name="client" content="(.*?)">/’, $this->content, $client);
- $this->table = preg_split("/[A-Z]+%/",base64_decode($client[1][0]));
- $this->getline();
- preg_match_all(‘/var codeurl="(.*?)";/’, $this->content, $c);
- $this->codeurl = $c[1][0];
- }
- private function getline(){
- preg_match_all(‘/<p>(.*?)<\/p>/’, $this->content, $ps);
- $this->lines = $ps[1];
- $this->count = count($ps[1]);
- }
- public function sort(){
- $parr = array();
- $darr = array();
- foreach ($this->table as $i => $code) {
- $k = ceil(($i+1) % $this->codeurl);
- $k = ceil($code – $k);
- $parr[$k] = $this->lines[$i];
- }
- //sort($parr);
- for ($i=0;$i<$this->count;$i++){
- //这里可以处理(<p></p>)之间的内容
- //$darr[]=$parr[$i];
- $darr[]=strip_tags($parr[$i]); //去掉html标签
- }
- return $darr;
- }
- }
- $test = new MyHTMLParser(‘test1.html’); //文件名,url
- print_r($test->sort());
- ?>
复制代码
- Array
- (
- [0] => “对,男孩儿这几年蹿个儿特别快。”
- [1] => 乐闲贪婪看着贺寂英挺的侧脸,用视线描摹着他的眉眼,又顺着脖颈慢慢看下去,直看到微微敞开的浴袍领口露出的小半块胸肌,他倏地收回目光,脸色不由自主地又更红了一层。
- [2] => 他嗓子眼儿有些发干,把水杯凑到嘴边,小小地喝了一口,回道:“对,那会儿我才刚到你胸口,你还说让我快点儿长高。”
- [3] => 贺寂没应声,只点了点头,斟酌了下措辞,打算旁敲侧击,问一下他的来意。
- [4] => 乐闲见他没说话,以为他不记得了,忙急急地提醒道:“你还给我发压岁钱了。”
- [5] => 他在心里又加了句,还揉了我头,让我好好学习,考你这里的a大。
- [6] => 其实贺寂上次回去时,但凡登门拜访的小孩儿,他都发了压岁钱,而且祝福语也都是那几句,快快长高,好好学习,考上a大来找我玩儿之类的。
- [7] => 都是套话。
- [8] => 乐闲郑重其事地把这事儿讲出来,贺寂一边觉得有点儿好笑,一边又觉得这小孩儿天真可爱,稚气未消,挺讨人喜欢的。
- [9] => 不过该问的还是得问清楚。
- [10] => 贺寂笑了笑,委婉道:“你一个人来的?怎么不提前通知一声,我也好开车来机场接你。”
- [11] => 乐闲诧异地睁了睁眼,疑惑道:“贺寂哥你不知道我要来吗?”
- [12] => 贺寂摊了摊手,“不知道。”
- [13] => 乐闲头顶咔嚓一声,响起一道炸雷。
- [14] => 贺寂根本不知道自己要来,那自己现在对他而言,不就是个贸然上门的不知礼数的小鬼头么?
- [15] => 乐闲急急解释道:“王、王阿姨说,她、她已经提前和你打过招呼了,说、说你同意了。我本、本来打算下飞机时给你再打个电话,但手机摔坏了,就没、没打成。”
- [16] => 生怕给贺寂留下坏印象,乐闲急得脸色通红,讲话都磕巴了。
- [17] => 见这小孩儿急得话都捋不清楚了,贺寂心说自己有这么吓人么,他摸了摸鼻子,伸手往乐闲的方向压了压,示意他别紧张,笑道:“没事儿,我随便问问。”
- [18] => 他大概知道问题该是出在他母后那里,于是从冰箱里给乐闲拿了些水果过来,让他随意,之后就假借换衣服的名义,躲进卧室去向他那不靠谱的老妈兴师问罪去了。
- [19] => 打完电话,他总算是摸清了事情的来龙去脉。
- [20] => 乐闲今年高中毕业,考上了他家附近的a大。a大毫无疑问是个著名学府,全国排名头几号的,但美中不足的是,住宿条件太差,尤其是贺寂家旁边的那个老校区。乐闲妈怕乐闲住不惯,打算给他在学校附近租个小房子,贺寂妈听了这事儿,想到贺寂就住a大旁边,又常年独居,就越俎代庖替贺寂揽了回事儿,让乐闲直接住他家去。
- [21] => 贺寂妈先斩后奏,跟乐闲妈谈妥了一应事宜后,才不紧不慢地给贺寂拨了个电话。可事儿就坏在这里,贺寂妈来电话那天,贺寂通宵看球,并且支持的队伍大获全胜,他心情大好,一人自斟自饮,生灌了两瓶洋酒。接到电话那会儿,他正烂泥似地瘫在床上,整个脑子都是糊的,她妈絮絮叨叨说了一通,他一个字儿没听进去,反正不管他妈说什么,他都嗯嗯啊啊地一通敷衍,她妈和他说了几句后,又说乐闲妈就在她身边,让她和贺寂聊几句。乐闲妈温温柔柔地向贺寂道谢,各种给你添麻烦了不好意思之类的,贺寂喝酒喝出了一腔无处发泄的豪气,话都没听明白,就拍着胸脯打包票道“都包在我身上了”。
- [22] => 酒醒之后他断了个片儿,说过啥干过啥全都不记得了,他妈也不知是有意还是无意地,后来再打电话时,也没和他提过这事儿。
- [23] => 贺寂知道自家妈妈摆了自己一道,可她也是一片苦心,贺寂也没法真和她生气啥的。他妈觉得他一人儿在外地打拼,铁定孤单寂寞无依无靠什么的,一直想让他成个家或者找个伴儿。贺寂一个人过惯了,暂时没那方面的想法,每次他妈一说,他就含混过去,次数多了,他妈也就不提成家这茬儿了,但还是常常建议他找个室友啥的先适应适应,说不定时间久了就愿意和人凑堆儿过日子了。贺寂妈提这事儿,贺寂就好好生生地答应着,完了该咋过咋过,仗着天高皇帝远,他妈管不了他。可谁知道高一尺魔高一丈,他妈直接把乐闲给送了过来,贺寂无牵无挂浪了几十年,今儿阴沟里头翻了船。
- [24] => 贺寂他一面换衣服,一边思考着这事儿要怎么处理。其实他住的这地儿挺大的,顶跃小洋房,上下两层,上层是健身房和书房,下层三室两厅带个大露台,再加个乐闲进来,完全不算个事儿。
- [25] => 可问题是他这人是真不爱和人一块儿住,他虽然朋友挺多,但活了三十几年,除了爹妈外,还真没和谁同居过。读大学时,就因为受不了室友之间的边界不明,他才在校外租房的。毕业后这些年也一直一个人住着,每天按照自己的节奏工作生活,过得惬意又悠闲,他已经习惯了这样的生活模式,也没有打破它的计划。
- [26] => 可人小孩儿千里迢迢来到这里,举目无亲,也就自己这一个算得上故旧的人,贺寂就算再是铁石心肠,也干不
- )
复制代码
广西网友:
@wgetrc
留个微信收款码 发红包
另外谢谢其他mjj热心相助。
北京网友:
红包 请给 @gougou6423 我就是改了下…
- <?php
- class MyHTMLParser {
- private $line = array();
- private $table = array();
- private $content;
- private $lines = array();
- private $codeurl = 0;
- public $count = 0;
- public function MyHTMLParser($name) {
- //print $name;
- $this->content = file_get_contents($name);
- $this->content = mb_convert_encoding($this->content, "UTF-8", "gbk");
- //print $this->content;
- preg_match_all(‘/<meta name="client" content="(.*?)"?(\/|)>/’, $this->content, $client);
- $this->table = preg_split("/[A-Z]+%/",base64_decode($client[1][0]));
- $this->getline();
- preg_match_all(‘/var codeurl="(.*?)";/’, $this->content, $c);
- $this->codeurl = intval($c[1][0]);
- }
- private function getline(){
- preg_match_all(‘/<p>(.*?)<\/p>/’, $this->content, $ps);
- $this->lines = $ps[1];
- $this->count = count($ps[1]);
- //print_r($this->lines);
- }
- public function sort(){
- $parr = array();
- $darr = array();
- foreach ($this->table as $i => $code) {
- $k = ceil(($i+1) % $this->codeurl);
- $k = ceil(intval($code) – $k);
- $parr[$k] = $this->lines[$i];
- }
- for ($i=0;$i<$this->count;$i++){
- //这里可以处理(<p></p>)之间的内容
- $darr[]=strip_tags($parr[$i]);
- }
- return $darr;
- }
- }
- //$test = new MyHTMLParser(‘http://m.xxx.com/19/19875/793461.html’); //文件名,url
- $test = new MyHTMLParser(‘test.html’); //文件名,url
- print_r($test->sort());
- ?>
复制代码
陕西网友:
@gougou6423请大佬发个二维码收红包。本来红包是给@wgetrc的,但是他说要我发给你。