抓取网页新闻(这篇下面这篇分析如何去POST请求网易的".dwr")
优采云 发布时间: 2022-02-12 03:24抓取网页新闻(这篇下面这篇分析如何去POST请求网易的".dwr")
"
BlogBeanNew.getBlogs.dwr”,下面的日志是分析如何POST请求网易的“.dwr”数据:
【教程】以网易博文的最新读者信息为例,教大家如何抓取动态网页的内容。
该日志用于分析获取网易博客读者信息。请求为:VisitBeanNew.getBlogReaders.dwr,获取博客内容的请求为:BlogBeanNew.getBlogs.dwr,都是通过POST请求,原理类似,设置基本相同。
看完分析,就该看代码了。有兴趣的可以看下整个 BlogsToWordPress 工具的 Python 代码。如果您只想查看 POST 代码,可以查看此日志:
【实录】用Python解析FeelingCard返回的DWR-REPLY数据,网易163博客心情随笔
事实上,这篇文章相当复杂。如果您想阅读更简洁,可以阅读以下文章:
[记录] 支持将网易心情文章导出到BlogsToWordPress
我列出的三个日志基本解释了如何设置和请求 POST 来解析网易博客日志数据,它们是用 Python 编写的。以下是我参考后用Java实现的请求用户博客数据的完整代码。
首先,网易博客的目录数据是动态加载的,需要对.dwr进行POST请求,但是博客内容是静态的,可以通过GET请求URL获取,比如小影的一篇博客:
小英:明末文人为何发疯?
地址是:
我的目的是获取日志《小英:明末文人为何疯狂?》的内容。它只需要通过一个GET请求它的地址,然后地址相对格式化。例如,只要将最后解析的这串数字“29”拼接成一个完整的地址。整个地址格式为:
[用户名]./blog/static/[blogId]
小影博客的用户名:“xying1962”,可以通过入口地址“”获取。下面的blogId需要解析目录数据来获取,所以需要POST请求.dwr。
另外,解释一下网易博客地址,有两种地址格式(具体到博客目录地址):
1. [用户名]./blog/
2. [用户名]/blog/
在给出Java代码之前,不得不说谷歌的Chrome浏览器确实是一款不错的产品。它甚至可以很好地请求监控。是网页分析的好帮手。我个人认为它比 Wireshark 更容易使用。详情如下:
1、在网页某处右击,在最后一项选择“Inspect Element”,好像中文叫“Inspect Element”,如图:
“Inspect element”检查元素框出来后,点击“Network”,中文版应该是“Network”,刷新网页,可以看到网页的监控状态,如下图:
可以查看HTTP请求的名称(name)、请求的方法(Method)、请求的状态(Status)、请求返回结果的类型(Type)。点击最左侧的名称查看详细信息,例如点击“blog/”,如下图:
可以查看头部信息、返回结果“Response”和cookies。有时需要 cookie 来模拟登录以发出网页请求,但在许多情况下,标头和响应就足够了。如果想知道当前的信息,再检查一遍,点击底部的“清除”按钮(如图,红色圈出)就足够了。具体怎么用,如果你学过计算机网络,做过抓包分析,自己查一下就明白了。如果不是,那真的需要一段时间才能找到。
下面讲解如何在Java中设置POST请求,首先按照类似于原创Python格式的Java代码
<p>public Set post163Blog(String username, String userId, int startIndex, int returnNumber){
/**
* entityBody用于保存字符串格式的返回结果
*/
String entityBody = null;
/**
* 实例化一个HttpPost,并设置请求dwr地址,username表示博主的用户名,例如肖鹰的username是“xying1962”
*/
HttpPost httppost = new HttpPost("http://api.blog.163.com/" + username + "/dwr/call/plaincall/BlogBeanNew.getBlogs.dwr");
/*
* 设置参数,除了c0-param0、c0-param1和c0-param2外都一样。
* c0-param0 :博主的userId,例如肖鹰的userId是“138445490”
* c0-param1 :返回博客数据的起始项,从0开始
* c0-param2 :一次返回博客的数量,最大值好像是500,具体多少我没有完全去试,600肯定不行,我一般设置500,600以上就不返回数据了。
* 如果一个博主写了超过500篇博客,那就可以分多次请求,只要合理设置c0-param1和c0-param2就可以。
*/
List nvp = new ArrayList();
nvp.add(new BasicNameValuePair("callCount", "1"));
nvp.add(new BasicNameValuePair("scriptSessionId", "${scriptSessionId}187"));
nvp.add(new BasicNameValuePair("c0-scriptName", "BlogBeanNew"));
nvp.add(new BasicNameValuePair("c0-methodName", "getBlogs"));
nvp.add(new BasicNameValuePair("c0-id", "0"));
nvp.add(new BasicNameValuePair("c0-param0", "number:" + userId));
nvp.add(new BasicNameValuePair("c0-param1", "number:" + startIndex));
nvp.add(new BasicNameValuePair("c0-param2", "number:" + (returnNumber