htmlunit抓取动态网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
优采云 发布时间: 2021-10-01 07:31htmlunit抓取动态网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认是开启的。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "<img class=\"lazy\" data-original=\"/img/newImg/news_img2.jpg\" src=\"/img/newImg/news2.jpg\" style=\"display: block;\"/>";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据
4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址