java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)

优采云 发布时间: 2021-09-19 09:12

  java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)

  最近,在做一个项目时,有一个需求:要从网页中获取数据,需要首先获取整个网页的HTML源代码(将在以后的更新中使用)。首先,我看了一下这个简单的,然后我敲了敲代码(nutch,一个以前使用Hadoop平台的分布式爬虫框架,使用起来非常方便,但最终由于速度原因放弃了,但生成的统计数据用于以后的爬虫)。很快,holder.html和finance.html页面被成功下载,然后,在解析holder.html页面之后,我解析了finance.html。然后我很沮丧地发现我在这个页面中需要的数据不在HTML源代码中。我去浏览器查看源代码。果然,源代码中没有我需要的数据。看来我的程序并没有写错,接下来就是让人筋疲力尽的事情——获取收录动态内容的HTML页面

  在中国所谓最强的搜索引擎百度上走了很长一段时间后,我发现大多数人会使用webdriver和httpUnit(事实上,前者已经包括后者)。我很高兴,终于找到了解决办法。非常激动地使用webdriver,我发誓

  

  下面对WebDriver的Tucao进行投诉

  Webdriver是一个测试框架。它最初不是为爬虫服务的,但我想说的是:它几乎是一种浏览。你不能再向前迈一步吗?为什么这么多人在互联网上推荐webdriver?我不认为这些人是从现实出发的。有些人甚至吹嘘webdriver可以解析完成的页面,并将其返回给想要浏览整个页面的人(包括动态生成的内容)。是的,webdriver可以完成这个任务,但是当我看到作者编写的代码时,我想说的是:伙计,你的代码太有限了。解析自己编写的JS代码,JS代码很简单,因此webdriver肯定会在没有压力的情况下完成任务。当webdriver解析动态内容时,它取决于JS代码的复杂性和多样性

  什么是复杂性

  先发布一段代码

  WebDriver driver = newInternetExplorerDriver ();

HtmlPage page = driver.get(url);

System.out.println(page.asXml());

  这段代码的意思是,我相信每个人都能理解上面使用的IE内核,当然是Firefox驱动程序、chrome驱动程序和htmlunitdriver。这些驱动程序的使用原则是相同的。首先打开浏览器(这需要时间),然后加载URL并完成动态解析,然后通过页面获得完整的HTML页面。作为xml(),htmlunitdriver模拟没有接口的浏览器。有一个rhino引擎在Java中执行JS。htmlunitdriver使用rhino解析JS。由于htmlunitdriver不会使用界面启动浏览器,因此它的速度比前三个版本快。不管是什么驱动程序,解析JS都是不可避免的,这需要时间,并且未使用的内核对JS的支持程序是不同的。例如,htmlunitdriver对带有滚动的JS代码的支持较差,并且会在执行过程中报告错误(亲身经历)。JS代码的复杂性意味着不同内核支持的JS并不完全相同。这要根据具体情况来确定。我已经很长时间没有学习JS了,所以我不会谈论内部检查JS的支持

  什么是多样性

  如前所述,浏览器解析JS需要时间。对于只有少量嵌入JS代码的页面,通过页面获取完整页面是没有问题的。Asxml()。但是,对于收录更多嵌入式JS代码的页面,解析JS需要很多时间(对于JVM)。此时,大部分页面都是通过页面获取的。Asxml()不收录动态生成的内容。问题是,为什么你说webdriver可以获得收录动态内容的HTML页面?网上有人说,开车后。Get(URL),当前线程需要等待以获取完成的页面,这类似于下面的表单

  WebDriver driver = new InternetExplorerDriver();

HtmlPage page = dirver.get(url);

Thread.sleep(2000);

System.output.println(page.asXml());

  根据这个想法,我尝试了以下方法。啊,真的有可能。但这不是问题所在吗?如何确定等待时间?与数据挖掘中确定阈值的经验方法类似,或尽可能长。我认为这些不是很好的方法。时间成本相对较高。我认为驱动程序应该能够在解析JS后捕获状态,所以我去寻找,寻找,但根本没有这样的方法,所以我说为什么webdriver的设计者不进一步,以便我们可以在程序中获取驱动程序解析JS后的状态,所以我们不需要使用thread.sleep( 2000)很遗憾,我找不到这样不确定的代码,这让我很伤心。Firefox驱动程序、chrome驱动程序和htmlunitdriver也有同样的问题。可以说,使用webdriver帮助爬升动态生成的网页所获得的结果非常不稳定。我对此有深刻的理解。使用iedriver时,两个pages在同一页上,每次爬网的结果都不一样,有时ie会直接挂断。你敢在爬网程序中使用这些东西吗?我不敢

  此外,有人建议使用httpUnit。事实上,httpUnit是由webdirver中的htmlunitdriver内部使用的,所以使用httpUnit时也会遇到同样的问题。我还进行了实验,这是正确的。通过thread.sleep( 2000)我认为等待JS解析是不明智的。有太多的不确定性,尤其是在*敏*感*词*爬网中

  综上所述,webdriver是一个专门为测试而设计的框架。虽然根据其原理,它在理论上可以用来帮助爬虫获取收录动态内容的HTML页面,但在实际应用中却没有被采用。不确定性太大,稳定性太差,速度太慢。让框架来完成它的best,不要损害他们的优势

  我还没有完成我的工作,所以我需要找到一种上网的方式。这次,我找到了一个稳定且具有高度确定性的辅助工具phantomjs。目前,我不完全了解这个工具。但是,它已经被用来实现我想要的功能。在Java中,我使用runtime.exec(ARG)在解析JS后调用phantomjs获取页面。我最好发布代码

  要在phantom JS端执行的代码

  system = require('system')

address = system.args[1];//获得命令行第二个参数 接下来会用到

//console.log('Loading a web page');

var page = require('webpage').create();

var url = address;

//console.log(url);

page.open(url, function (status) {

//Page is loaded!

if (status !== 'success') {

console.log('Unable to post!');

} else {

//此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容

console.log(page.content);

}

phantom.exit();

});

  在Java端执行的代码

  public void getParseredHtml(){

String url = "www.bai.com";

Runtime runtime = Runtime.getRuntime();

runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);

InputStream in = runtime.getInputStream();

//后面的代码省略,得到了InputStream就好说了

}

  通过这种方式,解析后的HTML页面可以在Java端获得,而不是使用thread.Sleep()在webdriver中,这种不确定的代码用于获取可能完成的代码。需要注意的一点是:phantomjs端的JS代码不能有语法错误,否则Java端会一直等待,如果JS代码的编译方式不同,Java端不会抛出异常。另一个原因是,在使用phantomjs.exe时side每次都要启动一个phantomjs进程,消耗的时间比较大,但至少结果是稳定的,当然最后我没有使用phantomjs,直接下载需要的数据,没有抓取整个页面,主要是速度问题(事实上,我不敢使用它,因为phantomjs是不熟悉的,所以我谨慎使用)

  经过几天的辗转反侧,我没有解决我的问题,但我学到了很多知识。在后期,我熟悉phantomjs,看看我是否可以提高速度。如果我能打破速度框架,我将来爬到网页时会很方便。另外,nutch框架。我很佩服我哥哥的方便使用时,有必要在后期研究如何在Hadoop上优化nutch的爬行速度?此外,nutch的原创功能不会爬行动态生成的页面内容,但可以使用nutch和webdirver的组合。也许爬行结果是稳定的。哈哈,这些只是想法,但是你怎么知道你不要尝试

  如果您对使用webdriver帮助爬虫获得的结果的稳定性有什么看法,欢迎您,因为我确实没有找到稳定结果的相关信息

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线