php抓取网页动态数据(链接跳转后会进入企业信息公示页面,需要的内容 )
优采云 发布时间: 2022-03-09 01:06php抓取网页动态数据(链接跳转后会进入企业信息公示页面,需要的内容
)
我最近在做一个项目,通过扫描营业执照的二维码得到一个URL链接。一个链接跳转后会进入企业信息公示页面,您需要通过该链接获取所需信息(公司名称、法人、信用代码等)。
在网上搜索了很多,找到了很多方法,但是爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,得到的只是静态信息等等。所以所有的方法都不可行。
最终的解决方案是:WebClient模拟一个浏览器客户端,设置JS动态加载开启(必须的,主要处理那些JS、Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用 Jsoup 清理数据,得到我们需要的东西。值得一提的是
Jsoup 的用法与 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以使用这两种方法获取。我们使用F12在谷歌浏览器中打开开发调试工具。使用定位功能定位我们需要的数据的位置,查看标签的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;
}