htmlunit抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)

优采云 发布时间: 2021-10-23 19:20

  htmlunit抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)

  汤

  Jsoup:Java HTML 解析器,具有最好的 DOM、CSS 和 jquery

  使用入门案例介绍

  

org.jsoup

jsoup

1.10.2

  使用简单

  Document document = Jsoup.connect(url)

.timeout(30000)

.validateTLSCertificates(false)

.get();

Elements elements = document.select(".book-chapter-list > .cf:last-child > li");

for (Element element : elements) {

String title = element.text();

String chapUrl = url + element.select("a").attr("href");

// 其他构件存储操作

}

  这里的主要目的是指定一个访问的url,然后通过各种选择器获取我们想要的元素信息。

  动态js内容背景

  最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!

  爬取Ajax动态加载的数据,一般有两种方式:

  1.因为js渲染页面的数据也是从后端获取的,而且基本都是AJAX获取的,所以分析AJAX请求,找到对应的数据

  请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。

  缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。

  2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,

  HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。

  好处是写规则

  对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,这对于后面的项目部署到浏览器非常不利!

  所以推荐第一种方法,代码也是第一种方法。

  htmlunitjava 模拟js执行

  ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

engine.eval(new InputStreamReader(Login.class

.getResourceAsStream("/sha1.js")));

Object t = engine.eval("CryptoJS.SHA1('" + password+ "').toString();");

System.out.println(t);

  jsoup 模拟ajax请求

  //然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值

Document document1=Jsoup.connect("http://ds.suning.cn/ds/generalForTile/000000000133537397-9173-2-0000000000-1--ds000000000.jsonp")

.ignoreContentType(true)

.data("query", "Java")

.userAgent("Mozilla")

.cookie("auth", "token")

.timeout(3000)

.get();

//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了

System.out.println(document1.text());

  jsoup抓取页面js信息

   /*设置网页抓取响应时间*/

private static final int TIMEOUT = 10000;

public static Map getSerieExtDetail(int serieId) throws Exception{

/*车系参数配置页面*/

String serieInfo = "http://car.autohome.com.cn/config/series/"+serieId+".html";

/*用來封裝要保存的参数*/

Map map = new HashMap();

/*取得车系参数配置页面文档*/

Document document = Jsoup.connect(serieInfo).timeout(TIMEOUT).get();

/*取得script下面的JS变量*/

Elements e = document.getElementsByTag("script").eq(6);

/*循环遍历script下面的JS变量*/

for (Element element : e) {

/*取得JS变量数组*/

String[] data = element.data().toString().split("var");

/*取得单个JS变量*/

for(String variable : data){

/*过滤variable为空的数据*/

if(variable.contains("=")){

/*取到满足条件的JS变量*/

if(variable.contains("option") || variable.contains("config")

|| variable.contains("color") || variable.contains("innerColor")){

String[] kvp = variable.split("=");

/*取得JS变量存入map*/

if(!map.containsKey(kvp[0].trim()))

map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length()-1).toString());

}

}

}

}

return map;

}

  进一步阅读

  webmagic-另一个爬虫选项

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线