【教程】以抓取网易博客帖子中的最近读者信息为例,手把手教你如何抓取动态网页中的内容

背景

前面已经通过:

【教程】如何抓取动态网页内容

介绍了,关于抓取动态网页中的内容的逻辑过程。

下面通过具体的例子,来说明是如何实现此过程的。

前提知识

1.了解网页抓取等的基本背景知识

不了解的去参考:

【整理】关于抓取网页,分析网页内容,模拟登陆网站的逻辑/流程和注意事项

2.了解抓取动态网页中的内容的背后的逻辑

如前所述,不了解的自己去看:

【教程】如何抓取动态网页内容

3.已经会使用工具去分析网页执行过程

不了解的先去参考:

【总结】浏览器中的开发人员工具(IE9的F12和Chrome的Ctrl+Shift+I)-网页分析的利器

知道IE9的F12大概是啥,然后再参考:

【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

去知道如何使用IE9的F12.

明确此处的需求:想要获得对应的某个网易帖子中的最近读者的相关信息

先说明一下我们此处举的例子的是啥。

此处,假设,我们希望获得的是,我之前的某个网易博客的某个帖子:

http://green-waste.blog.163.com/blog/static/3267767820096221127554/

中的“最近读者”,都有哪些。

截图如下:

post recent reader

我们想要抓取其中的,最近读者,都有哪些,至少包括有几个人,每个人的名字是啥等等这些内容;

而这些内容,对应的,就是我们所说的动态内容中的一种,即,在网页源码中找不到。

比如第三个读者是longlong,在网页html代码中,找不到这个值:

can not find longlong

而我们接下来的主要的目的就是,至少,先要分析出这些数据,都是从哪里来的。

或者说,至少先找到这些数据,在哪里。

通过工具分析网易博客帖子中的最近读者信息这个数据是从哪里来的

接下来,才是演示如何用IE9的F12,去分析此查找所需数据的过程。

比如上面举例提到的longlong,我们先要找到,这个值,在哪里。

查找动态数据longlong在哪里

打开IE9,打开任意网页,然后再按F12,即可打开“F12 Developer Tools”,

切换到Network标签,然后点击Start Capturing,其变成了Stop Capturing,说明现在已经启动抓取过程了。

然后输入地址:

http://green-waste.blog.163.com/blog/static/3267767820096221127554/

然后等网页加载完毕,就可以看到抓取出来的全部过程了:

post loading complete

对应的,把页面拉到底部,先看看我们要提取的数据longlong:

longlong info

对应的,我们可以再去验证一下,此数据,是动态加载的,是本身html中没有的:

view source

no hl html src

set to html lan

find but not found

而对于想要找longlong,我们很自然就想到,在F12中去搜索:

search longlong

就可以搜到对应的数据了:

found longlong in another url html

其中,也很明显的可以看到,对应的longlong所出现的html中,其旁边也有对应的其他读者的信息,分别对应着各个读者:

user corresponding reader

此时,很明显的,我们已经找到,我们所需要的,最近读者的相关读者信息了。

其中,可以看到,此处对应的url地址是:

http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr

其就属于我们在:

【教程】如何抓取动态网页内容

所说的,对应的动态数据,是从访问另外一个url中所返回的内容中,所包含的。

此处,很明显,要得到对应的我们要的数据,接下来,就要搞懂,如何去访问对应的url:

http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr

然后才能得到我们所需要返回的信息,然后从中提取出来我们要的读者的信息。

不过,此时,我们已经可以总结出来相关的,最终获得所需内容的,最后一步的过程了:

已得到的东西

      

要如何处理

  

    

      从        
http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr          
所返回的内容
提取我们要的longlong等读者信息

访问对应的getBlogReaders的url(以获得所的返回的内容)

接下来,很明显,就是要去看看,如何访问:

http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr

去获得所返回的内容。

然后我们可以通过点击对应所抓取的各项内容,从中找到,是如何访问此url,如何获得对应的返回内容的。

其中,此处如:

【整理】关于抓取网页,分析网页内容,模拟登陆网站的逻辑/流程和注意事项

所介绍的,对应的,需要关注的部分是:

Request Headers中看到对应的是POST方法:

request headers POST

对应地址是:

http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr

对应的Headers是:

Key    Value          
Request    POST /green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr HTTP/1.1            
Accept    */*            
Accept-Language    en-us            
Referer    http://api.blog.163.com/crossdomain.html?t=20100205            
Content-Type    text/plain            
Accept-Encoding    gzip, deflate            
User-Agent    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)            
Host    api.blog.163.com            
Content-Length    230            
Connection    Keep-Alive            
Cache-Control    no-cache            
Cookie    12_04_post_ad_postid=fks_081075080081086074084094094095087084087068083080081075; 12_04_post_ad_ct=3; NTESBLOGSI=E99863FF24FA53138B538832EC731DA4.app-93-8010; USERTRACK=58.240.218.42.1354607689499283; _ntes_nnid=2b3cdc377ee1621bda1f627d5965a266,1354607692730; _ntes_nuid=2b3cdc377ee1621bda1f627d5965a266

同时,对应着Request Body,也是非空,有对应要提交的post data的:

request body has post data

其中,把对应数据,先列出来:

callCount=1          
scriptSessionId=${scriptSessionId}187            
c0-scriptName=VisitBeanNew            
c0-methodName=getBlogReaders            
c0-id=0            
c0-param0=string:fks_082070080086087066093087094095087084087068083080081075            
c0-param1=number:32677678            
batchId=998946

其中,另外,在访问此url之前,前面Request Headers中,也看到了,是有对应的cookie的,

此处,单独的Cookie一项中,也可以看到对应的详细的值:

cookies to send

对应的cookie的值,此处也列出来:

Direction    Key    Value    Expires    Domain    Path    Secure    HTTP only          
Sent    12_04_post_ad_postid    fks_081075080081086074084094094095087084087068083080081075            
Sent    12_04_post_ad_ct    3                    
Sent    NTESBLOGSI    E99863FF24FA53138B538832EC731DA4.app-93-8010                    
Sent    USERTRACK    58.240.218.42.1354607689499283                    
Sent    _ntes_nnid    2b3cdc377ee1621bda1f627d5965a266,1354607692730                    
Sent    _ntes_nuid    2b3cdc377ee1621bda1f627d5965a266                   

其中,关于如何具体分析,这么多Headers和这么多Post data参数,如何处理,如何取舍,可参考:

【整理】网页抓取,模拟登陆,抓取动态网页内容等过程中,所涉及的Headers信息,Cookie信息,POST数据的处理逻辑

然后,等都搞懂了,如何取舍对应的headers,cookies,post data,然后就可以,根据需要,

针对需要处理的参数,去找到其值是如何得到的。

把所有的变量的值,都清楚怎么得到的。

最后,就是整理出整个流程了。

整理完毕流程,才是去用不同的代码,比如C#,Python等,去实现对应的流程。

【待续。。。】


【后记 2013-09-22】

1.后来,早就写好了教程了给出代码了:

【记录】用Python解析网易163博客的心情随笔FeelingCard返回的DWR-REPLY数据



9 Thoughts on “【教程】以抓取网易博客帖子中的最近读者信息为例,手把手教你如何抓取动态网页中的内容

  1. 无良风筝Fly on 2014 年 12 月 8 日 at 下午 3:39 said:

    博主你好,我按照这方法最后却得到如下结果,该怎么办?
    //#DWR-REPLY
    if (window.dwr) dwr.engine._remoteHandleBatchException({ name:’org.directwebremoting.extend.ServerException’, message:’The specified call count is not a number’ });
    else if (window.parent.dwr) window.parent.dwr.engine._remoteHandleBatchException({ name:’org.directwebremoting.extend.ServerException’, message:’The specified call count is not a number’ });

    • 无良风筝Fly on 2014 年 12 月 9 日 at 上午 9:54 said:

      我解决了~原来DWR是按行读取请求正文的。。。
      用HttpClient访问的时候要用StringEntity来设置请求正文。。。还要用\n来换行。。。
      百度没找到答案结果翻墙出去google了一下就有了。。。

  2. crifan前辈你好!我需要抓取这个网页的查询结果http://www.dce.com.cn/portal/cate?cid=1261730308135。这个网页任意选择然后点击查询,返回的结果的URL都是http://www.dce.com.cn/PublicWeb/MainServlet。我无论使用IE的F12还是Chrome的审查元素,都捕获不到点击查询按钮动作的任何数据包get或者post。十分奇怪。现在陷入迷茫了,请问我该如何下手去做?多谢前辈!

    小葛

  3. 您好,可不可以把这篇文章的续文写出来啊? 我按此文的分析方法,
    写了抓取动态数据的脚本,但没有成功。 我是新手,需要多一些实例来模仿学习。
    如果楼主能写出来就太感谢了!

  4. 前天研究了网页博客的评论、随机文章、推荐文章、最近访客,都是dwr(java ajax)实现的,舒服。

  5. 谢谢,收益良多。
    我现在遇到差不多的问题,就是要模拟点击网页上的链接,而这些链接也是动态生成的,我通过分析找到链接的地址,可以用webbrowser实现直接打开链接,要如何才能实现点击的功能呢?还望能指点下,谢谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量