网页信息抓取 Jsoup的不足之处 httpunit
遇到一个网页数据抓取的任务,给大家分享下。
说到网页信息抓取,相信Jsoup基本是首选的工具,完全的类JQuery操作,让人感觉很舒服。但是,今天我们就要说一说Jsoup的不足。
这是某网站的一个搜索栏,填入一些格式化数据进行经纬度转换,初始化是这样的,然后用jsoup抓取的代码如下:
当我们进行数据添加后,抓取的页面信息是没有变化的,这就是Jsoup的不足,如果Jsoup去抓取的页面,全都是页面加载完成后的数据,ajax加载的异步数据,是抓取不到的。
下面给大家推荐另一个开源项目:HttpUnit,看名字是用于测试的,但是用来抓取数据也不错,完美解决,HttpUnit其实就相当于一个没有UI的浏览器,它可以让页面上的js执行完成后,再抓取信息。
有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有。这是因为requests获取的都是原始的HTML文档,而浏览器中的页面则是经过JavaScript处理数据后生成的结果,这些数据的来源有多种,可能是通过Ajax加载的,可能是包含在HTML文档中的,也可能是经过JavaScript和特定算法计算后生成的。
对于第一种情况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个Ajax请求。
照Web发展的趋势来看,这种形式的页面越来越多。网页的原始HTML文档不会包含任何数据,数据都是通过Ajax统一加载后再呈现出来的,这样在Web开发上可以做到前后端分离,而且降低服务器直接渲染页面带来的压力。
所以如果遇到这样的页面,直接利用requests等库来抓取原始页面,是无法获取到有效数据的,这时需要分析网页后台向接口发送的Ajax请求,如果可以用requests来模拟Ajax请求,那么就可以成功抓取了。
但是我没用这个测试框架:我解决问题的思路为
总结:ajax数据的爬取流程:
1.当提交我们的搜索时,它会加载这部分内容https://earthexplorer.usgs.gov/result/index,并且会有表单数据生成,
程序中体现在:
2.服务器加载好这个页面,我们输入表单信息,这个表单信息也就是我们的搜索条件,例如:
在程序中体现在:
3.由js返回加载的页面,并将信息添加到这个页面
jsoup解析页面即可。
4.模拟登陆部分: