用HtmlUnit爬取淘宝数据

qq_15710293 2014-08-25 10:13:23
http://jiuxu.taobao.com/

比如我想爬取上面页面的所有宝贝链接
如<a href="http://item.taobao.com/item.htm?spm=a1z10.1.w5003-8452167994.1.fVp17O&id=40416742109&scene=taobao_shop" target="_blank" data-spm-wangpu-module-id="5003-8452167994" data-spm-anchor-id="a1z10.1.w5003-8452167994.1"><img src="http://img02.taobaocdn.com/imgextra/i2/50090008/TB2j6UraXXXXXaUXpXXXXXXXXXX_!!50090008.jpg" width="621" height="442" border="0" alt=""></a>


我想要http://item.taobao.com/item.htm?spm=a1z10.1.w5003-8452167994.1.fVp17O&id=40416742109&scene=taobao_shop 这个内容

HttpUtils没有渲染页面功能所以直接就放弃了(而且的确也抓不出我想要的内容)
在使用htmlUnit渲染页面的时候发现获得tbody内的信息不完整
原因经过查询相关资料大致了解:因为有的js内容需要浏览器滚动下拉才会加载

请问我要如何模拟浏览器的滚动下拉来加载页面上所有的js?

参数设置如下:
// 1 启动JS
webClient.getOptions().setJavaScriptEnabled(true);
// 2 禁用Css,可避免自动二次請求CSS进行渲染
webClient.getOptions().setCssEnabled(false);
// 3 启动客戶端重定向
webClient.getOptions().setRedirectEnabled(true);

// 4 js运行错誤時,是否拋出异常
webClient.getOptions().setThrowExceptionOnScriptError(false);
// 5 设置超时
webClient.getOptions().setTimeout(50000);

HtmlPage htmlPage = webClient.getPage(url);
// 等待JS驱动dom完成获得还原后的网页
webClient.waitForBackgroundJavaScript(10000);
// 网页內容
/* System.out.println(htmlPage.asXml()); */
webClient.closeAllWindows();
return htmlPage.asXml();


然后http://zarakara.tmall.com/这个页面用上述方法根本渲染不出所需的宝贝链接

已经尝试过各种方法包括python下面的phantomjs+casperjs 虽然可以解析 但是依然无法加载下面的内容
还有什么百度蜘蛛 谷歌蜘蛛。
...全文
1381 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuai007 2014-10-08
  • 打赏
  • 举报
回复
http://bbs.aliyun.com/read/169222.html?displayMode=1 有没有遇到这样的问题,在win平台下或是本地eclipse下调试可以获取商品,但是部署在阿里云centos下却不可以
qq_15710293 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
这类脚本都比较复杂,实际上你很难搞到一个比较完备的脚本引擎。 可以考虑用WebKit后台执行该页面,也就是用真正的浏览器来解析页面,然后抓取内容;缺点是开销较高。
嗯哼,你说的方法试过,但是依然会遇到我上面说的问题:不向下滚动页面去激活那些js就无法获得里面的内容 我前段时间用的Selenium +chromeDriver 就是跟你类似的方法吧
MiceRice 2014-08-25
  • 打赏
  • 举报
回复
这类脚本都比较复杂,实际上你很难搞到一个比较完备的脚本引擎。 可以考虑用WebKit后台执行该页面,也就是用真正的浏览器来解析页面,然后抓取内容;缺点是开销较高。
a12939026 2014-08-25
  • 打赏
  • 举报
回复
我猜多数行不通。 淘宝这样的大公司肯定有防爬虫的机制。
MiceRice 2014-08-25
  • 打赏
  • 举报
回复
哈哈。不过以前也碰到项目最后决定还是人工算了的,性价比不合适。
清水裕夏 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 ldh911 的回复:
可以代码触发浏览器的滚动条下滚。不过总的来说是代价比较高。 还有个方案:是研究并分析出该页面在发生滚动后,究竟向服务器发出了什么新的请求,是怎么增量刷出其它内容的。然后直接用程序去构造这个新的HTTP请求。不过这个方案估计难度不小。
多谢 和同事讨论了一下决定放弃 改用人工手工收集信息(这个成本比较小
MiceRice 2014-08-25
  • 打赏
  • 举报
回复
可以代码触发浏览器的滚动条下滚。不过总的来说是代价比较高。 还有个方案:是研究并分析出该页面在发生滚动后,究竟向服务器发出了什么新的请求,是怎么增量刷出其它内容的。然后直接用程序去构造这个新的HTTP请求。不过这个方案估计难度不小。

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧