js 抓取网页内容(方法如下最后得到的源码:其它的代码和点击打开链接这篇文章相比几乎没变)
优采云 发布时间: 2021-10-05 09:10js 抓取网页内容(方法如下最后得到的源码:其它的代码和点击打开链接这篇文章相比几乎没变)
上次不是写了一个博客访问的自动爬取(点击打开链接),但是昨晚再跑的时候,发现不能用了。.
运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码
只有积分没有访问
并使用浏览器直接访问查看源码
有参观。
这也导致我的程序无法使用,需要更新。
想想看。原因可能是后台的主机把流量放在js里面进行动态展示,而我用来访问URLConnection的静态接口没有收到。
于是百度从过去开始百度来百度。.
发现一个帖子三年没发了
java爬虫项目中js执行后如何获取完整的网页源码?
多方回复,发现有htmlunit,于是自己测试了下
发现确实有效。js执行后获取源码。
别废话了。
方法如下
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
// TODO Auto-generated method stub
WebClient wc=new WebClient(BrowserVersion.FIREFOX_24);
wc.setJavaScriptTimeout(5000);
wc.getOptions().setUseInsecureSSL(true);//接受任何主机连接 无论是否有有效证书
wc.getOptions().setJavaScriptEnabled(true);//设置支持javascript脚本
wc.getOptions().setCssEnabled(false);//禁用css支持
wc.getOptions().setThrowExceptionOnScriptError(false);//js运行错误时不抛出异常
wc.getOptions().setTimeout(100000);//设置连接超时时间
wc.getOptions().setDoNotTrackEnabled(false);
HtmlPage page=wc.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");
String res=page.asText();
//处理源码
deal(res);
}
最终的源代码如下:
其他代码和这个文章相比几乎没有变化,点击打开链接。不明白的可以看这里,不再赘述。
执行后成功写入txt文件
使用htmlunit时会弹出很多异常警告
添加这些代码,它就会消失~
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
.setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
.setLevel(Level.OFF);
由于我们这里引入了htmlunit jar包,如果使用上次的脚本批处理是不行的~
而且要导入的jar包不是一个或多个,需要批量处理。
首先,我们需要使用 -cp 命令导入我们需要的所有 jar 包。
但是htmlunit的jar包太多了,于是想到了一个办法,用for循环遍历htmlunit文件夹中的jar文件,处理成字符串,然后使用-cp命令。整个代码如下
echo off
setlocal enabledelayedexpansion
::定义一个字符串
set str=
::遍历htmlunit文件夹
for /f "delims=" %%a in ('dir /b "E:\lib\htmlunit-2.14-bin\lib\*.jar"') do (
set "str=!str!E:\lib\htmlunit-2.14-bin\lib\%%a;"
)
echo on
e:
javac -cp .;%str% AutoMarkBlogView.java
java -cp .;%str% AutoMarkBlogView
pause
操作结果如下:
htmlunit jar包下载