htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容 )
优采云 发布时间: 2021-12-19 11:08htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容
)
最近在做一个项目,扫描营业执照二维码得到一个网址链接。链接重定向后,将进入企业信息公示页面。您需要通过此链接获取所需信息(公司名称、法人、信用代码等)。
我在网上查了很多,找到了很多方法,但是都爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,我们只获取静态信息等等。所以并不是所有的方法都可行。
最后的解决方案是:WebClient模拟浏览器客户端,设置JS动态加载on(必须的,主要针对那些JS,Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用Jsoup清理数据,得到我们需要的内容。值得一提的是
Jsoup 的用法和 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以通过这两种方法获取。我们在谷歌浏览器中使用F12打开开发调试工具。使用定位功能定位我们需要的数据的位置,并查看标签的id。这个id就是我们在使用Jsoup函数时使用的ID。这样就可以得到具体的数值。具体Jsoup用户可以百度搜索。
下面废话不多说,直接上代码:
(1)环境
1)Jsoup 环境
org.jsoup
jsoup
1.10.2
2)WebClient 环境
这个比较麻烦
我在自己的项目中直接贴了Jar的截图(有需要的可以联系我)
(2)源码(这是获取企业信息的源码,其他类似,webclient模拟一样,只是清洗不同)
public static List analysisQyInfoForOld(String url){
final WebClient client = new WebClient();
client.getOptions().setJavaScriptEnabled(true);// 默认执行js
client.getOptions().setCssEnabled(false);
client.setAjaxController(new NicelyResynchronizingAjaxController());
client.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = null;
try {
page = client.getPage(url);
} catch (FailingHttpStatusCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String pageXml = page.asXml(); //以xml的形式获取响应文本
List lists = new ArrayList();
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml);
Element element1 = doc.getElementById("REG_NO"); //统一社会信用代码/注册号
Element element2 = doc.getElementById("CORP_NAME");//名称
Element element3 = doc.getElementById("ZJ_ECON_KIND");//类型
Element element4 = doc.getElementById("OPER_MAN_NAME");//经营者
Element element5 = doc.getElementById("FARE_PLACE");//经营场所
Element element7 = doc.getElementById("ADDR"); //住址
Element element6 = doc.getElementById("BELONG_ORG");//所属部门
lists.add(element1.text());
lists.add(element2.text());
lists.add(element3.text());
lists.add(element4.text());
if(element5 == null ) {
lists.add(element7.text());
}else {
lists.add(element5.text());
}
lists.add(element6.text());
return lists;
}