
htmlunit抓取动态网页
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-01-01 07:03
)
在抓取网页数据时,传统的jsoup方案只能对静态页面有效,而且部分网页数据往往是js生成的,所以此时需要其他方案。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标网址的通用性比较麻烦。
第二种想法,也是一种更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
由于htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本。
运行程序前一定要指定驱动位置,比如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
} 查看全部
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉
)
在抓取网页数据时,传统的jsoup方案只能对静态页面有效,而且部分网页数据往往是js生成的,所以此时需要其他方案。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标网址的通用性比较麻烦。
第二种想法,也是一种更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
由于htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本。
运行程序前一定要指定驱动位置,比如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}
htmlunit抓取动态网页(静态网页和动态网页主要根据网页制作的语言来区分)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-27 14:05
静态网页和动态网页主要根据网页的制作语言来区分。
☑ 静态网页语言:HTML,如图1.1。
图1.1 静态网页显示的URL
☑ 动态网页使用的语言:HTML+ASP、HTML+PHP或HTML+JSP等,如图1.2。
图1.2 动态网页显示的网址
动态网页的程序都是在服务器端运行,最后将运行结果返回给客户端浏览器进行显示。静态网页是预先制作好的,通过服务器直接传递给客户端浏览器。
静态网页和动态网页各有特点。网站采用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,相反,采用动态网页技术来实现。
简而言之,静态网页具有以下特点:
☑ 静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常见形式,不收录
“?”。
☑ 网页内容一旦发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都会保存在网站服务器上。也就是说,静态网页是一个实际保存在服务器上的文件。网页是一个独立的文件。
☑ 静态网页内容相对稳定,容易被搜索引擎检索到。
☑ 静态网页没有数据库支持,网站制作和维护的工作量比较大。因此,在网站信息量较大的情况下,难以单纯依靠静态网页制作方式。
☑ 静态网页交互性较差,在功能上有较大局限。
动态网页具有以下特点:
☑ 动态网页基于数据库技术,可大大减少网站维护工作量。
☑ 使用动态网页技术的网站可以实现更多功能。例如用户注册、用户登录、在线调查、用户管理、订单管理等。
☑ 动态网页实际上并不是独立存在于服务器上的网页文件。服务器仅在用户请求时才返回完整的网页。
☑ “?” 在动态网页中给搜索引擎检索带来了一定的问题。搜索引擎一般无法访问一个网站的数据库中的所有网页,或者出于技术考虑,搜索蜘蛛不会抓取网址“?” “后者的内容,所以使用动态网页的网站在被搜索引擎推广时需要做一定的技术处理,以满足搜索引擎的要求。
静态网页是网站建设的基础。静态网页和动态网页并不矛盾。为了使网站适应搜索引擎的需要,即使采用动态网站技术,也可以将网页内容转换为静态网页进行发布。
动态网站也可以采用动静结合的原则。使用动态网页的地方适合使用动态网页。如果必须使用静态网页,可以考虑静态网页相关图片由静态网页实现。动态网页内容和静态网页内容在同一个网站上共存是很常见的。 查看全部
htmlunit抓取动态网页(静态网页和动态网页主要根据网页制作的语言来区分)
静态网页和动态网页主要根据网页的制作语言来区分。
☑ 静态网页语言:HTML,如图1.1。
图1.1 静态网页显示的URL
☑ 动态网页使用的语言:HTML+ASP、HTML+PHP或HTML+JSP等,如图1.2。
图1.2 动态网页显示的网址
动态网页的程序都是在服务器端运行,最后将运行结果返回给客户端浏览器进行显示。静态网页是预先制作好的,通过服务器直接传递给客户端浏览器。
静态网页和动态网页各有特点。网站采用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,相反,采用动态网页技术来实现。
简而言之,静态网页具有以下特点:
☑ 静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常见形式,不收录
“?”。
☑ 网页内容一旦发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都会保存在网站服务器上。也就是说,静态网页是一个实际保存在服务器上的文件。网页是一个独立的文件。
☑ 静态网页内容相对稳定,容易被搜索引擎检索到。
☑ 静态网页没有数据库支持,网站制作和维护的工作量比较大。因此,在网站信息量较大的情况下,难以单纯依靠静态网页制作方式。
☑ 静态网页交互性较差,在功能上有较大局限。
动态网页具有以下特点:
☑ 动态网页基于数据库技术,可大大减少网站维护工作量。
☑ 使用动态网页技术的网站可以实现更多功能。例如用户注册、用户登录、在线调查、用户管理、订单管理等。
☑ 动态网页实际上并不是独立存在于服务器上的网页文件。服务器仅在用户请求时才返回完整的网页。
☑ “?” 在动态网页中给搜索引擎检索带来了一定的问题。搜索引擎一般无法访问一个网站的数据库中的所有网页,或者出于技术考虑,搜索蜘蛛不会抓取网址“?” “后者的内容,所以使用动态网页的网站在被搜索引擎推广时需要做一定的技术处理,以满足搜索引擎的要求。
静态网页是网站建设的基础。静态网页和动态网页并不矛盾。为了使网站适应搜索引擎的需要,即使采用动态网站技术,也可以将网页内容转换为静态网页进行发布。
动态网站也可以采用动静结合的原则。使用动态网页的地方适合使用动态网页。如果必须使用静态网页,可以考虑静态网页相关图片由静态网页实现。动态网页内容和静态网页内容在同一个网站上共存是很常见的。
htmlunit抓取动态网页(程序是否在服务器端运行是一个重要的标志(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-26 21:19
程序是否在服务器端运行是一个重要的指标。服务器端运行的程序、网页、组件都是动态网页。他们会返回不同的网页,如asp、php、jsp、aspnet、cgi等,不同的客户,不同的时间。客户端运行的程序、网页、插件、组件都是静态网页,如html页面、flash、javascript、vbcript等。他们总是一样的。
静态网页和动态网页各有特点。一个网站是使用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站的功能比较简单,内容更新量不会很大。使用纯静态网页相对简单。相反,它一般是使用动态网络技术来实现的。
静态网页是网站建设的基础,静态网页和动态网页并不矛盾。为了满足搜索引擎的需求,即使采用动态网站技术,也可以将网页内容转换为静态网页。
动态网站也可以采用动静结合的原则。适用于使用动态网页的动态网页。如果需要静态网页,可以考虑使用静态网页,在同一个网站上实现动态网页内容和静态网页。内容同时存在也很常见。
动态网页的一般特征总结如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2) 使用动态网页技术的网站可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等。
(3)其实动态网页并不是独立存在于服务器上的网页文件,服务器只有在用户请求时才返回一个完整的网页。
(4)"?" 在动态网页中,搜索引擎搜索存在一些问题。搜索引擎通常无法访问网站数据库中的所有网页,或者由于技术原因,搜索蜘蛛不会抓取该网址。因此, “?”后面的内容,使用动态网页的网站需要进行一定的技术处理,以适应搜索引擎推广时对搜索引擎的要求。 查看全部
htmlunit抓取动态网页(程序是否在服务器端运行是一个重要的标志(图))
程序是否在服务器端运行是一个重要的指标。服务器端运行的程序、网页、组件都是动态网页。他们会返回不同的网页,如asp、php、jsp、aspnet、cgi等,不同的客户,不同的时间。客户端运行的程序、网页、插件、组件都是静态网页,如html页面、flash、javascript、vbcript等。他们总是一样的。
静态网页和动态网页各有特点。一个网站是使用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站的功能比较简单,内容更新量不会很大。使用纯静态网页相对简单。相反,它一般是使用动态网络技术来实现的。

静态网页是网站建设的基础,静态网页和动态网页并不矛盾。为了满足搜索引擎的需求,即使采用动态网站技术,也可以将网页内容转换为静态网页。
动态网站也可以采用动静结合的原则。适用于使用动态网页的动态网页。如果需要静态网页,可以考虑使用静态网页,在同一个网站上实现动态网页内容和静态网页。内容同时存在也很常见。
动态网页的一般特征总结如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2) 使用动态网页技术的网站可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等。
(3)其实动态网页并不是独立存在于服务器上的网页文件,服务器只有在用户请求时才返回一个完整的网页。
(4)"?" 在动态网页中,搜索引擎搜索存在一些问题。搜索引擎通常无法访问网站数据库中的所有网页,或者由于技术原因,搜索蜘蛛不会抓取该网址。因此, “?”后面的内容,使用动态网页的网站需要进行一定的技术处理,以适应搜索引擎推广时对搜索引擎的要求。
htmlunit抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-25 15:20
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录
了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();HtmlPage page = driver.get(url);System.out.println(page.as
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。作为
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.as
WebDriver driver = new InternetExplorerDriver();HtmlPage page = dirver.get(url);Thread.sleep(2000);System.output.println(page.as
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是很不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果你对使用WebDriver辅助爬虫获得的结果的稳定性有什么想说的,欢迎评论,因为我确实没有找到稳定爬虫结果的相关资料。 查看全部
htmlunit抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录
了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();HtmlPage page = driver.get(url);System.out.println(page.as
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。作为
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.as
WebDriver driver = new InternetExplorerDriver();HtmlPage page = dirver.get(url);Thread.sleep(2000);System.output.println(page.as
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是很不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果你对使用WebDriver辅助爬虫获得的结果的稳定性有什么想说的,欢迎评论,因为我确实没有找到稳定爬虫结果的相关资料。
htmlunit抓取动态网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-12-21 00:19
随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬取阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬取。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
对于第一种方法,webmagic-selenium 就是这样的一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium的配置比较复杂,跟平台和版本有关,没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
1 如何判断前端渲染
判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以确定为js渲染。
在这个例子中,如果源代码中找不到页面上的标题“友府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
2 分析请求
接下来我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的基本就是凭经验了。比如这里的“latest?p=1&s=20”一看就可疑……
对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装一个jsonviewer,查看AJAX结果非常方便)。看结果,似乎找到了我们想要的。
同样的,我们到了帖子详情页,找到了具体内容的请求:。
3 编写程序
回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只不过是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
数据表
在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的post的id,post details请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用JsonPath,一种选择数据的语言(webmagic-extension包提供了JsonPathSelector来支持)。
if (page.getUrl().regex(LIST_URL).match()) {
//这里我们使用JSONPATH这种选择语言来选择数据
List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
if (CollectionUtils.isNotEmpty(ids)) {
for (String id : ids) {
page.addTargetRequest("http://angularjs.cn/api/article/"+id);
}
}
}
目标数据
有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
本示例的完整代码请参见AngularJSProcessor.java
4 总结
在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
后台渲染页面
下载辅助页面 => 发现链接 => 下载并分析目标 HTML
前端渲染页面
发现辅助数据 => 构建链接 => 下载并分析目标 AJAX
对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
但是这些数据请求的分析还是比页面分析复杂的多,所以这其实就是动态页面爬取的难点。
本节的例子希望实现的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=>构建链接=>下载并分析目标AJAX模型。
PS:
WebMagic 0.5.0 将在链 API 中添加 Json 支持,您可以使用:
page.getJson().jsonPath("$.name").get();
这种方式来解析AJAX请求。
还支持
page.getJson().removePadding("callback").jsonPath("$.name").get();
这种方式来解析 JSONP 请求。 查看全部
htmlunit抓取动态网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬取阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬取。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
对于第一种方法,webmagic-selenium 就是这样的一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium的配置比较复杂,跟平台和版本有关,没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
1 如何判断前端渲染
判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以确定为js渲染。


在这个例子中,如果源代码中找不到页面上的标题“友府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
2 分析请求
接下来我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的基本就是凭经验了。比如这里的“latest?p=1&s=20”一看就可疑……

对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装一个jsonviewer,查看AJAX结果非常方便)。看结果,似乎找到了我们想要的。

同样的,我们到了帖子详情页,找到了具体内容的请求:。
3 编写程序
回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只不过是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
数据表
在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的post的id,post details请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用JsonPath,一种选择数据的语言(webmagic-extension包提供了JsonPathSelector来支持)。
if (page.getUrl().regex(LIST_URL).match()) {
//这里我们使用JSONPATH这种选择语言来选择数据
List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
if (CollectionUtils.isNotEmpty(ids)) {
for (String id : ids) {
page.addTargetRequest("http://angularjs.cn/api/article/"+id);
}
}
}
目标数据
有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
本示例的完整代码请参见AngularJSProcessor.java
4 总结
在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
后台渲染页面
下载辅助页面 => 发现链接 => 下载并分析目标 HTML
前端渲染页面
发现辅助数据 => 构建链接 => 下载并分析目标 AJAX
对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
但是这些数据请求的分析还是比页面分析复杂的多,所以这其实就是动态页面爬取的难点。
本节的例子希望实现的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=>构建链接=>下载并分析目标AJAX模型。
PS:
WebMagic 0.5.0 将在链 API 中添加 Json 支持,您可以使用:
page.getJson().jsonPath("$.name").get();
这种方式来解析AJAX请求。
还支持
page.getJson().removePadding("callback").jsonPath("$.name").get();
这种方式来解析 JSONP 请求。
htmlunit抓取动态网页(Web网络爬虫系统的原理及应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-12-19 17:14
1、 爬虫技术概述
网络爬虫是根据一定的规则自动抓取万维网信息的程序或脚本。它们广泛用于互联网搜索引擎或其他类似的网站,可以自动将采集它所能访问的页面的所有内容获取或更新这些网站@的内容和检索方法>. 从功能上来说,爬虫一般分为三部分:数据采集、处理、存储。传统爬虫从一个或多个初始网页的网址开始,获取初始网页上的网址。在爬取网页的过程中,他们不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。聚焦爬虫的工作流程比较复杂。需要按照一定的网页分析算法过滤与主题无关的链接,保留有用的链接,放入URL队列等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。
与一般的网络爬虫相比,聚焦爬虫还需要解决三个主要问题:
(1) 爬取目标的描述或定义;
(2) 对网页或数据的分析和过滤;
(3) URL 搜索策略。
2、爬取的原理
2.1 网络爬虫原理
网络爬虫系统的作用是下载网页数据,为搜索引擎系统提供数据源。许多大型互联网搜索引擎系统被称为基于Web数据的搜索引擎系统,如谷歌和百度。这说明了网络爬虫系统在搜索引擎中的重要性。除了供用户阅读的文本信息外,网页还收录一些超链接信息。网络爬虫系统通过网页中的超链接信息不断获取网络上的其他网页。正是因为这个采集进程就像一个爬虫或蜘蛛在网络上漫游,所以被称为网络爬虫系统或网络蜘蛛系统,英文称为Spider或Crawler。
2.2 网络爬虫系统的工作原理
在网络爬虫的系统框架中,主要流程由控制器、解析器和资源库三部分组成。控制器的主要工作是为多线程中的每个爬虫线程分配工作任务。解析器的主要工作是下载网页并处理页面,主要是处理一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容。爬虫的基本工作由解析器完成。资源库用于存储下载的网页资源。一般使用Oracle数据库等大型数据库存储,并建立索引。
控制器
控制器是网络爬虫的中央控制器。主要负责根据系统传递过来的URL链接分配一个线程,然后启动线程调用爬虫对网页进行爬取。
解析器
解析器是负责网络爬虫的主要部分。它的主要任务包括:下载网页,处理网页的文本,如过滤,提取特殊的HTML标签,分析数据。
资源库
主要用于存储网页中下载的数据记录,并提供生成索引的目标源。中大型数据库产品包括:Oracle、Sql Server等。
网络爬虫系统一般会选择一些输出度(网页中超链接的数量)较高的比较重要的URL作为种子URL集合。网络爬虫系统使用这些种子集作为初始 URL 开始数据爬取。由于网页收录链接信息,因此可以通过现有网页的网址获取一些新的网址。网页之间的指向结构可以看作是一个森林。每个种子 URL 对应的网页是森林中一棵树的根节点。. 这样,网络爬虫系统就可以按照广度优先算法或深度优先算法遍历所有网页。由于深度优先搜索算法可能会导致爬虫系统陷入网站内部,不利于搜索更接近< @网站主页,采集网页一般采用广度优先搜索算法。网络爬虫系统首先将种子 URL 放入下载队列,然后简单地从队列头部取一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。
网络爬虫的基本工作流程如下:
1.先选择一部分精心挑选的种子网址;
2.将这些URL放入URL队列中进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页并保存到下载的网页库中。另外,将这些网址放入已爬取的网址队列中。
4.对爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待爬取的URL队列中,从而进入下一个循环。
2.3 爬取策略
在爬虫系统中,要爬取的URL队列是一个非常重要的部分。URL队列中要爬取的URL按什么顺序排列也是一个很重要的问题,因为它涉及到先爬哪个页面,后爬哪个页面。确定这些 URL 顺序的方法称为抓取策略。下面重点介绍几种常见的爬取策略:
2.3.1 深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,逐个跟踪每一个链接,处理完这一行后转移到下一个起始页,继续跟踪链接。我们以下图为例:
遍历的路径:AFG EHI BCD
2.3.2 广度优先遍历策略
广度优先遍历策略的基本思想是将新下载的网页中找到的链接直接插入到待爬取的URL队列的末尾。即网络爬虫会先抓取起始网页中所有链接的网页,然后选择其中一个链接的网页,继续抓取该网页中链接的所有网页。以上图为例:
遍历路径:ABCDEF GHI
2.3.3 反向链接计数策略
反向链接数是指从其他网页链接到某个网页的数量。反向链接的数量表示网页内容被他人推荐的程度。因此,很多时候搜索引擎的爬取系统都会使用这个指标来评估网页的重要性,从而决定不同网页的爬取顺序。
在真实的网络环境中,由于广告链接和作弊链接的存在,反向链接的数量不能完全坐等别人的重视。因此,搜索引擎通常会考虑一些可靠的反向链接。
2.3.4Partial PageRank 策略
Partial PageRank算法借鉴了PageRank算法的思想:对于下载的网页,连同要爬取的URL队列中的URL,组成一个网页集,计算每个页面的PageRank值,经过计算完成后,将要爬取的URL队列中的URL按照PageRank值的大小进行排列,依次爬取页面。
如果每个页面都被抓取,则重新计算 PageRank 值。一个折衷的方案是:每爬取K个页面后,重新计算PageRank值。但是,这种情况下仍然存在一个问题:对于已经从下载页面中分析出来的链接,也就是我们前面提到的未知网页部分,暂时没有PageRank值。为了解决这个问题,这些页面会被赋予一个临时的PageRank值:将所有传入该页面链中的PageRank值聚合起来,从而形成未知页面的PageRank值,从而参与排名。以下示例说明:
2.3.5OPIC 策略
该算法实际上对页面的重要性进行评分。在算法开始之前,给所有页面相同的初始现金(cash)。下载某个页面P后,将P的现金分配给所有从P解析的链接,清空P的现金。待抓取的 URL 队列中的所有页面均按照现金的数量进行排序。
2.3.六大站优先策略
URL队列中所有要爬取的网页,按照所属的网站进行分类。网站需要下载的页面较多,优先下载。这种策略因此被称为大站优先策略。
3、 爬虫分类
我应该选择 Nutch、Crawler4j、WebMagic、scrapy、WebCollector 还是其他来开发网络爬虫?上面提到的爬虫基本上可以分为三类:
(1)分布式爬虫:Nutch
(2)JAVA 爬虫:Crawler4j、WebMagic、WebCollector
(3)非JAVA爬虫:scrapy(基于Python语言开发)
3.1 个分布式爬虫
爬虫采用分布式,主要解决两个问题:
1)海量网址管理
2)网速
最流行的分布式爬虫是 Apache 的 Nutch。但是对于大多数用户来说,Nutch 是这些类型的爬虫中最糟糕的选择,原因如下:
1)Nutch 是一款专为搜索引擎设计的爬虫。大多数用户需要一个爬虫来进行准确的数据爬取(精细提取)。Nutch 运行的一组进程中有三分之二是为搜索引擎设计的。精细提取没有多大意义。换句话说,使用 Nutch 进行数据提取会在不必要的计算上浪费大量时间。而如果你试图通过二次开发,让Nutch适合精炼业务,你基本上会破坏Nutch的框架,将Nutch改得面目全非,并有能力修改Nutch。自己写一个新的确实更好。分布式爬虫框架。
2)Nutch 依赖于hadoop 来运行,而hadoop 本身也消耗了大量的时间。如果集群机器数量少,爬取速度不如单机爬虫快。
3) 虽然Nutch有一套插件机制,但也被宣传为一个亮点。可以看到一些开源的Nutch插件,提供精细的提取功能。但是任何开发过 Nutch 插件的人都知道 Nutch 的插件系统有多烂。使用反射机制加载和调用插件使得编写和调试程序变得极其困难,更不用说在其上开发复杂的精细提取系统了。并且Nutch没有提供相应的插件挂载点进行精细提取。Nutch的插件只有五六个挂载点,而这五六个挂载点是为搜索引擎服务的,不提供精细提取的挂载点。Nutch的大部分精提取插件都挂载在挂载点“解析器”(parser)上,
4)使用Nutch进行爬虫的二次开发,爬虫的准备和调试所需的时间往往是单机爬虫的十倍以上。学习Nutch源代码的成本非常高,更何况一个团队中的每个人都必须了解Nutch源代码。在调试过程中,会出现程序本身以外的各种问题(hadoop问题、hbase问题)。
5) 很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等,其实很多人理解错了。这里所说的持久化数据是指在avro、hbase、mysql中存储URL信息(URL管理所需的数据)。这不是您要提取的结构化数据。事实上,对于大多数人来说,URL 信息存在于何处并不重要。
6)Nutch2的版本目前不适合开发。Nutch官方稳定版是nutch2.2.1,但是这个版本绑定了gora-0.3。如果你想和nutch一起使用hbase(大多数人使用nutch2只是为了使用hbase),你只能在0.90版本左右使用hbase,因此你必须将hadoop版本减少到hadoop 0.2或所以。而且,Nutch2的官方教程更具有误导性。Nutch2有两个教程,分别是Nutch1.x和Nutch2.x。Nutch2.x 官网可以支持转到hbase 0.94。但其实这个Nutch2.x指的是Nutch2.3之前和Nutch2.2.1之后的版本。此版本在官方SVN中不断更新。
所以,如果你不是搜索引擎,尽量不要选择Nutch作为爬虫。有些团队喜欢效仿。他们之所以坚持选择Nutch开发集约化提取的爬虫,其实是因为Nutch的名气(Nutch的作者是Doug Cutting)。当然,最终的结果往往是项目被推迟。
如果你是一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与 solr 或 es 合作组成了一个非常强大的搜索引擎。如果非要使用Nutch2,建议等到Nutch2.3发布。当前的 Nutch2 是一个非常不稳定的版本。
分布式爬虫平台架构图
3.2 JAVA爬虫
这里将JAVA爬虫单独划分为一个类别,因为JAVA在网络爬虫的生态系统中是非常完备的。相关资料也是最全的。这里可能有争议,我只是随便说说。
其实开源网络爬虫(框架)的开发非常简单,难点复杂的问题(比如DOM树解析定位、字符集检测、海量URL去重)都已经被前人解决了,可以说没有技术含量。包括Nutch,其实Nutch的技术难点就是开发hadoop,代码本身也很简单。从某种意义上说,网络爬虫类似于遍历机器上的文件以查找文件中的信息。没有任何困难。之所以选择开源爬虫框架,是为了省事。比如爬虫URL管理、线程池等模块任何人都可以做,但是需要一段时间的调试和修改才能稳定下来。
用于爬虫的功能。用户比较关心的问题往往是:
1) 爬虫是否支持多线程,爬虫能不能用agent,能不能抓取重复数据,能不能抓取JS生成的信息?
那些不支持多线程、代理、过滤重复URL的不叫开源爬虫,叫循环执行http请求。
js生成的信息能否被爬取与爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。爬取js产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit、selenium)来完成。这些模拟浏览器通常需要花费大量时间来处理页面。所以一种策略是利用这些爬虫来遍历网站,当遇到需要解析的页面时,将页面的相关信息提交给模拟浏览器,完成对JS生成信息的提取。
2)爬虫可以爬取ajax信息吗?
网页上有一些异步加载的数据。爬取这个数据有两种方式:使用模拟浏览器(问题1中描述),或者分析ajax http请求,自己生成ajax请求url,获取返回数据。如果您自己生成 Ajax 请求,那么使用开源爬虫有什么意义呢?其实还是需要用到开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来抓取这些请求?
爬虫通常被设计成广度遍历或深度遍历的模式来遍历静态或动态页面。爬取ajax信息属于深网(deep web)的范畴,虽然大部分爬虫不直接支持。但它也可以通过某些方式完成。例如,WebCollector 使用广度遍历来遍历网站。第一轮爬取是爬取种子集(seeds)中的所有URL。简单的说,就是将生成的ajax请求作为种子,放入爬虫中。使用爬虫遍历这些深度为1的种子(默认为广度遍历)。
3)爬虫如何爬取网站登录?
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是基于cookies。至于如何获取cookie,就不是爬虫的事情了。您可以手动获取cookies,也可以模拟http请求登录,也可以使用模拟浏览器自动登录获取cookies。
4)爬虫如何从网页中提取信息?
开源爬虫一般都集成了网页提取工具。主要支持两种规范:CSS SELECTOR 和 XPATH。至于哪个更好,这里就不评价了。
5)爬虫是如何保存网页信息的?
一些爬虫带有一个负责持久化的模块。例如,webmagic 有一个叫做管道的模块。通过简单的配置,爬虫提取的信息可以持久化到文件、数据库等中,也有一些爬虫不直接为用户提供数据持久化模块。如 crawler4j 和 webcollector。让用户在网页处理模块中添加提交数据库的操作。至于使用pipeline模块好不好,类似于是否使用ORM来操作数据库的问题,看你的业务了。
6)爬虫被网站屏蔽了,怎么办?
爬虫已经被网站拦截了,通常可以通过多个代理(随机代理)解决。但是,这些开源爬虫一般不直接支持随机代理的切换。因此,用户经常需要将获取到的代理放入一个全局数组中,自己编写代码来随机获取代理(从数组中)。
7)网页可以调用爬虫吗?
爬虫的调用是在Web的服务器端调用的,你可以照常使用。这些爬虫都可以使用。
8)爬行速度怎么样?
一个单机的开源爬虫的速度基本可以用到机器网速的极限。爬虫速度慢,往往是因为用户线程少,网速慢,或者持久化数据时与数据库交互速度慢。而这些东西往往是由用户的机器和二次开发代码决定的。这些开源爬虫的速度非常好。
9)显然代码写对了,爬不出来数据。是不是爬虫有问题?别的爬虫能解决吗?
如果代码写对了,数据爬不出来,其他爬虫也是一样。在这种情况下,要么 网站 阻止了您,要么您抓取的数据是由 javascript 生成的。无法通过更换爬虫来解决抓取数据失败的问题。
10)哪个爬虫可以判断网站是否爬完了,哪个爬虫可以根据主题爬取?
爬虫无法判断网站是否已经爬过,只能尽量覆盖。
至于基于主题的爬取,爬虫只有向下爬取内容才知道主题是什么。所以它通常是从整体上爬下来,然后去过滤内容。如果觉得抓取过于笼统,可以通过限制网址规律等方法缩小范围。
11) 哪个爬虫有更好的设计模式和结构?
设计模式纯属无稽之谈。当软件设计模式好的时候,开发软件,然后总结出几种设计模式。设计模式对软件开发没有指导作用。使用设计模式来设计爬虫只会让爬虫的设计更加臃肿。
在架构上,开源爬虫目前主要是详细数据结构的设计,比如爬取线程池、任务队列等,大家都可以控制。爬虫的业务太简单了,不谈结构。
所以对于JAVA开源爬虫,我想,找一个好用的就好了。如果业务复杂,使用哪种爬虫就必须经过复杂的二次开发才能满足需求。
3.3 个非 Java 爬虫
在非JAVA语言编写的爬虫中,有很多优秀的爬虫。这里单独提取为一个类别,不是针对爬虫本身的质量,而是针对larbin、scrapy等爬虫对开发成本的影响。
先说python爬虫,python可以用30行代码完成JAVA 50行代码的任务。Python 代码编写确实很快,但是在调试代码阶段,Python 代码的调试往往比编码阶段节省的时间消耗的时间要多得多。使用python开发,为了保证程序的正确性和稳定性,需要编写更多的测试模块。当然,如果爬取规模不大,爬取业务不复杂,使用scrapy也是相当不错的,可以轻松完成爬取任务。
上图是Scrapy的架构图。绿线是数据流。首先,从初始 URL 开始,Scheduler 将其交给 Downloader 进行下载。下载完成后,会交给Spider进行分析。需要保存的数据会被发送到Item Pipeline。,即对数据进行后处理。此外,可以在数据流通道中安装各种中间件来进行必要的处理。所以在开发爬虫的时候,最好先规划好各个模块。我的做法是分别规划下载模块、爬取模块、调度模块、数据存储模块。
对于C++爬虫来说,学习成本会比较大。而且你不能只计算一个人的学习成本。如果软件需要团队开发或交接,那将是很多人的学习成本。软件调试并不是那么容易。
还有一些ruby、php爬虫,这里不多评论。确实有一些非常小的数据采集任务,用ruby或者php非常方便。但是要选择这些语言的开源爬虫,一方面需要调查相关的生态系统,另一方面,这些开源爬虫可能会产生一些你找不到的bug(人少信息少)
4、反爬虫技术
由于搜索引擎的流行,网络爬虫已经成为一种非常流行的网络技术。除了专门从事搜索的谷歌、雅虎、微软和百度,几乎每个大型门户网站网站都有自己大大小小的搜索引擎。可以叫出的名字有几十个,不知道的名字也有上万个。对于一个内容驱动的网站来说,难免会被网络爬虫光顾。
网站上一些智能搜索引擎爬虫的爬取频率比较合理,消耗的资源比较少。但是,很多不良的网络爬虫对网页的爬取能力较差,经常会发送几十甚至上百个请求,重复爬取循环。拿,这种爬虫往往对中小网站是毁灭性的打击,尤其是缺乏爬虫编写经验的程序员写的爬虫,破坏力极强,网站的访问压力会非常大。, 会导致网站 访问缓慢甚至无法访问。
一般来说,网站从三个方面进行反爬虫:用户请求的Headers、用户行为、网站目录和数据加载方式。前两个比较容易遇到,从这些角度来看,大多数网站都是反爬虫。将采用第三类ajax应用网站,增加爬虫难度。
4.1 个通过 Headers 的反爬虫
从用户请求的Headers反爬取是最常见的反爬取策略。很多网站会检测Headers的User-Agent,有的网站会检测Referer(部分资源网站的防盗就是检测Referer)。如果遇到这种反爬虫机制,可以直接给爬虫添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者修改Referer值为目标网站域名【注:经常容易被Ignore,通过对请求的抓包分析确定referer,将其添加到模拟访问的请求头中该程序]。对于检测header的反爬虫,在爬虫中修改或添加header很容易绕过。
4.2 基于用户行为的反爬虫
网站的另一部分是检测用户行为,比如在短时间内从同一个IP多次访问同一个页面,或者在短时间内在同一个账号内多次执行相同的操作. 【这种反爬需要足够的ip来应对】
大部分网站都是前一种情况。在这种情况下,使用IP代理可以解决。可以专门写一个爬虫来爬取网上公开的代理ip,检测后全部保存。这类代理ip爬虫经常用到,最好自己准备一个。代理IP数量较多后,可以每隔几次请求换一个IP。这在requests或urllib2中很容易做到,这样你就可以轻松绕过第一个反爬虫。【点评:动态拨号也是一种解决方案】
在第二种情况下,您可以在每次请求后以几秒钟的随机间隔发出下一个请求。一些存在逻辑漏洞的网站可以通过多次请求、注销、重新登录、继续请求来绕过同一账号不能在短时间内多次发出相同请求的限制。【评论:账号的反爬限制一般很难处理,几秒的随机请求也可能被屏蔽。如果有多个账号,在它们之间切换会有更好的效果】
4.3 动态页面反爬虫
以上情况大部分出现在静态页面上,还有一些网站,我们需要爬取的数据是通过ajax请求获取的,或者通过Java生成的。首先使用Firebug或者HttpFox来分析网络请求【点评:感觉google和IE的网络请求分析也很好】。如果能找到ajax请求,分析出响应的具体参数和具体含义,就可以通过上面的方法直接使用requests或者urllib2来模拟ajax请求,分析响应json得到需要的数据。
能够直接模拟ajax请求获取数据是很棒的,但是有的网站加密了ajax请求的所有参数。我们没有办法为我们需要的数据构造一个请求。这几天爬的网站就是这样的。除了对ajax参数进行加密外,还封装了一些基础功能,都是调用自己的接口,对接口参数进行加密。遇到这样的网站,就不能用上面的方法了。我使用selenium+phantomJS框架,调用浏览器内核,使用phantomJS执行js模拟人的操作,触发页面中的js脚本。从填表到点击按钮再到滚动页面,一切都可以模拟,不管具体的请求和响应过程,只是一个完整的模拟人们浏览页面获取数据的过程。【评论:支持phantomJS】
使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面是在一定程度上通过添加Headers来冒充浏览器),它是浏览器本身,phantomJS是一个没有界面的浏览器,但控制浏览器的不是人。使用selenium+phantomJS可以做很多事情,比如识别point-and-touch(12306)或滑动验证码,页面表单的暴力破解等)。它还将在自动化渗透方面大显身手,未来也会如此。提这个。 查看全部
htmlunit抓取动态网页(Web网络爬虫系统的原理及应用)
1、 爬虫技术概述
网络爬虫是根据一定的规则自动抓取万维网信息的程序或脚本。它们广泛用于互联网搜索引擎或其他类似的网站,可以自动将采集它所能访问的页面的所有内容获取或更新这些网站@的内容和检索方法>. 从功能上来说,爬虫一般分为三部分:数据采集、处理、存储。传统爬虫从一个或多个初始网页的网址开始,获取初始网页上的网址。在爬取网页的过程中,他们不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。聚焦爬虫的工作流程比较复杂。需要按照一定的网页分析算法过滤与主题无关的链接,保留有用的链接,放入URL队列等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。
与一般的网络爬虫相比,聚焦爬虫还需要解决三个主要问题:
(1) 爬取目标的描述或定义;
(2) 对网页或数据的分析和过滤;
(3) URL 搜索策略。
2、爬取的原理
2.1 网络爬虫原理
网络爬虫系统的作用是下载网页数据,为搜索引擎系统提供数据源。许多大型互联网搜索引擎系统被称为基于Web数据的搜索引擎系统,如谷歌和百度。这说明了网络爬虫系统在搜索引擎中的重要性。除了供用户阅读的文本信息外,网页还收录一些超链接信息。网络爬虫系统通过网页中的超链接信息不断获取网络上的其他网页。正是因为这个采集进程就像一个爬虫或蜘蛛在网络上漫游,所以被称为网络爬虫系统或网络蜘蛛系统,英文称为Spider或Crawler。
2.2 网络爬虫系统的工作原理
在网络爬虫的系统框架中,主要流程由控制器、解析器和资源库三部分组成。控制器的主要工作是为多线程中的每个爬虫线程分配工作任务。解析器的主要工作是下载网页并处理页面,主要是处理一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容。爬虫的基本工作由解析器完成。资源库用于存储下载的网页资源。一般使用Oracle数据库等大型数据库存储,并建立索引。
控制器
控制器是网络爬虫的中央控制器。主要负责根据系统传递过来的URL链接分配一个线程,然后启动线程调用爬虫对网页进行爬取。
解析器
解析器是负责网络爬虫的主要部分。它的主要任务包括:下载网页,处理网页的文本,如过滤,提取特殊的HTML标签,分析数据。
资源库
主要用于存储网页中下载的数据记录,并提供生成索引的目标源。中大型数据库产品包括:Oracle、Sql Server等。
网络爬虫系统一般会选择一些输出度(网页中超链接的数量)较高的比较重要的URL作为种子URL集合。网络爬虫系统使用这些种子集作为初始 URL 开始数据爬取。由于网页收录链接信息,因此可以通过现有网页的网址获取一些新的网址。网页之间的指向结构可以看作是一个森林。每个种子 URL 对应的网页是森林中一棵树的根节点。. 这样,网络爬虫系统就可以按照广度优先算法或深度优先算法遍历所有网页。由于深度优先搜索算法可能会导致爬虫系统陷入网站内部,不利于搜索更接近< @网站主页,采集网页一般采用广度优先搜索算法。网络爬虫系统首先将种子 URL 放入下载队列,然后简单地从队列头部取一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。
网络爬虫的基本工作流程如下:
1.先选择一部分精心挑选的种子网址;
2.将这些URL放入URL队列中进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页并保存到下载的网页库中。另外,将这些网址放入已爬取的网址队列中。
4.对爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待爬取的URL队列中,从而进入下一个循环。
2.3 爬取策略
在爬虫系统中,要爬取的URL队列是一个非常重要的部分。URL队列中要爬取的URL按什么顺序排列也是一个很重要的问题,因为它涉及到先爬哪个页面,后爬哪个页面。确定这些 URL 顺序的方法称为抓取策略。下面重点介绍几种常见的爬取策略:
2.3.1 深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,逐个跟踪每一个链接,处理完这一行后转移到下一个起始页,继续跟踪链接。我们以下图为例:
遍历的路径:AFG EHI BCD
2.3.2 广度优先遍历策略
广度优先遍历策略的基本思想是将新下载的网页中找到的链接直接插入到待爬取的URL队列的末尾。即网络爬虫会先抓取起始网页中所有链接的网页,然后选择其中一个链接的网页,继续抓取该网页中链接的所有网页。以上图为例:
遍历路径:ABCDEF GHI
2.3.3 反向链接计数策略
反向链接数是指从其他网页链接到某个网页的数量。反向链接的数量表示网页内容被他人推荐的程度。因此,很多时候搜索引擎的爬取系统都会使用这个指标来评估网页的重要性,从而决定不同网页的爬取顺序。
在真实的网络环境中,由于广告链接和作弊链接的存在,反向链接的数量不能完全坐等别人的重视。因此,搜索引擎通常会考虑一些可靠的反向链接。
2.3.4Partial PageRank 策略
Partial PageRank算法借鉴了PageRank算法的思想:对于下载的网页,连同要爬取的URL队列中的URL,组成一个网页集,计算每个页面的PageRank值,经过计算完成后,将要爬取的URL队列中的URL按照PageRank值的大小进行排列,依次爬取页面。
如果每个页面都被抓取,则重新计算 PageRank 值。一个折衷的方案是:每爬取K个页面后,重新计算PageRank值。但是,这种情况下仍然存在一个问题:对于已经从下载页面中分析出来的链接,也就是我们前面提到的未知网页部分,暂时没有PageRank值。为了解决这个问题,这些页面会被赋予一个临时的PageRank值:将所有传入该页面链中的PageRank值聚合起来,从而形成未知页面的PageRank值,从而参与排名。以下示例说明:
2.3.5OPIC 策略
该算法实际上对页面的重要性进行评分。在算法开始之前,给所有页面相同的初始现金(cash)。下载某个页面P后,将P的现金分配给所有从P解析的链接,清空P的现金。待抓取的 URL 队列中的所有页面均按照现金的数量进行排序。
2.3.六大站优先策略
URL队列中所有要爬取的网页,按照所属的网站进行分类。网站需要下载的页面较多,优先下载。这种策略因此被称为大站优先策略。
3、 爬虫分类
我应该选择 Nutch、Crawler4j、WebMagic、scrapy、WebCollector 还是其他来开发网络爬虫?上面提到的爬虫基本上可以分为三类:
(1)分布式爬虫:Nutch
(2)JAVA 爬虫:Crawler4j、WebMagic、WebCollector
(3)非JAVA爬虫:scrapy(基于Python语言开发)
3.1 个分布式爬虫
爬虫采用分布式,主要解决两个问题:
1)海量网址管理
2)网速
最流行的分布式爬虫是 Apache 的 Nutch。但是对于大多数用户来说,Nutch 是这些类型的爬虫中最糟糕的选择,原因如下:
1)Nutch 是一款专为搜索引擎设计的爬虫。大多数用户需要一个爬虫来进行准确的数据爬取(精细提取)。Nutch 运行的一组进程中有三分之二是为搜索引擎设计的。精细提取没有多大意义。换句话说,使用 Nutch 进行数据提取会在不必要的计算上浪费大量时间。而如果你试图通过二次开发,让Nutch适合精炼业务,你基本上会破坏Nutch的框架,将Nutch改得面目全非,并有能力修改Nutch。自己写一个新的确实更好。分布式爬虫框架。
2)Nutch 依赖于hadoop 来运行,而hadoop 本身也消耗了大量的时间。如果集群机器数量少,爬取速度不如单机爬虫快。
3) 虽然Nutch有一套插件机制,但也被宣传为一个亮点。可以看到一些开源的Nutch插件,提供精细的提取功能。但是任何开发过 Nutch 插件的人都知道 Nutch 的插件系统有多烂。使用反射机制加载和调用插件使得编写和调试程序变得极其困难,更不用说在其上开发复杂的精细提取系统了。并且Nutch没有提供相应的插件挂载点进行精细提取。Nutch的插件只有五六个挂载点,而这五六个挂载点是为搜索引擎服务的,不提供精细提取的挂载点。Nutch的大部分精提取插件都挂载在挂载点“解析器”(parser)上,
4)使用Nutch进行爬虫的二次开发,爬虫的准备和调试所需的时间往往是单机爬虫的十倍以上。学习Nutch源代码的成本非常高,更何况一个团队中的每个人都必须了解Nutch源代码。在调试过程中,会出现程序本身以外的各种问题(hadoop问题、hbase问题)。
5) 很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等,其实很多人理解错了。这里所说的持久化数据是指在avro、hbase、mysql中存储URL信息(URL管理所需的数据)。这不是您要提取的结构化数据。事实上,对于大多数人来说,URL 信息存在于何处并不重要。
6)Nutch2的版本目前不适合开发。Nutch官方稳定版是nutch2.2.1,但是这个版本绑定了gora-0.3。如果你想和nutch一起使用hbase(大多数人使用nutch2只是为了使用hbase),你只能在0.90版本左右使用hbase,因此你必须将hadoop版本减少到hadoop 0.2或所以。而且,Nutch2的官方教程更具有误导性。Nutch2有两个教程,分别是Nutch1.x和Nutch2.x。Nutch2.x 官网可以支持转到hbase 0.94。但其实这个Nutch2.x指的是Nutch2.3之前和Nutch2.2.1之后的版本。此版本在官方SVN中不断更新。
所以,如果你不是搜索引擎,尽量不要选择Nutch作为爬虫。有些团队喜欢效仿。他们之所以坚持选择Nutch开发集约化提取的爬虫,其实是因为Nutch的名气(Nutch的作者是Doug Cutting)。当然,最终的结果往往是项目被推迟。
如果你是一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与 solr 或 es 合作组成了一个非常强大的搜索引擎。如果非要使用Nutch2,建议等到Nutch2.3发布。当前的 Nutch2 是一个非常不稳定的版本。
分布式爬虫平台架构图
3.2 JAVA爬虫
这里将JAVA爬虫单独划分为一个类别,因为JAVA在网络爬虫的生态系统中是非常完备的。相关资料也是最全的。这里可能有争议,我只是随便说说。
其实开源网络爬虫(框架)的开发非常简单,难点复杂的问题(比如DOM树解析定位、字符集检测、海量URL去重)都已经被前人解决了,可以说没有技术含量。包括Nutch,其实Nutch的技术难点就是开发hadoop,代码本身也很简单。从某种意义上说,网络爬虫类似于遍历机器上的文件以查找文件中的信息。没有任何困难。之所以选择开源爬虫框架,是为了省事。比如爬虫URL管理、线程池等模块任何人都可以做,但是需要一段时间的调试和修改才能稳定下来。
用于爬虫的功能。用户比较关心的问题往往是:
1) 爬虫是否支持多线程,爬虫能不能用agent,能不能抓取重复数据,能不能抓取JS生成的信息?
那些不支持多线程、代理、过滤重复URL的不叫开源爬虫,叫循环执行http请求。
js生成的信息能否被爬取与爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。爬取js产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit、selenium)来完成。这些模拟浏览器通常需要花费大量时间来处理页面。所以一种策略是利用这些爬虫来遍历网站,当遇到需要解析的页面时,将页面的相关信息提交给模拟浏览器,完成对JS生成信息的提取。
2)爬虫可以爬取ajax信息吗?
网页上有一些异步加载的数据。爬取这个数据有两种方式:使用模拟浏览器(问题1中描述),或者分析ajax http请求,自己生成ajax请求url,获取返回数据。如果您自己生成 Ajax 请求,那么使用开源爬虫有什么意义呢?其实还是需要用到开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来抓取这些请求?
爬虫通常被设计成广度遍历或深度遍历的模式来遍历静态或动态页面。爬取ajax信息属于深网(deep web)的范畴,虽然大部分爬虫不直接支持。但它也可以通过某些方式完成。例如,WebCollector 使用广度遍历来遍历网站。第一轮爬取是爬取种子集(seeds)中的所有URL。简单的说,就是将生成的ajax请求作为种子,放入爬虫中。使用爬虫遍历这些深度为1的种子(默认为广度遍历)。
3)爬虫如何爬取网站登录?
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是基于cookies。至于如何获取cookie,就不是爬虫的事情了。您可以手动获取cookies,也可以模拟http请求登录,也可以使用模拟浏览器自动登录获取cookies。
4)爬虫如何从网页中提取信息?
开源爬虫一般都集成了网页提取工具。主要支持两种规范:CSS SELECTOR 和 XPATH。至于哪个更好,这里就不评价了。
5)爬虫是如何保存网页信息的?
一些爬虫带有一个负责持久化的模块。例如,webmagic 有一个叫做管道的模块。通过简单的配置,爬虫提取的信息可以持久化到文件、数据库等中,也有一些爬虫不直接为用户提供数据持久化模块。如 crawler4j 和 webcollector。让用户在网页处理模块中添加提交数据库的操作。至于使用pipeline模块好不好,类似于是否使用ORM来操作数据库的问题,看你的业务了。
6)爬虫被网站屏蔽了,怎么办?
爬虫已经被网站拦截了,通常可以通过多个代理(随机代理)解决。但是,这些开源爬虫一般不直接支持随机代理的切换。因此,用户经常需要将获取到的代理放入一个全局数组中,自己编写代码来随机获取代理(从数组中)。
7)网页可以调用爬虫吗?
爬虫的调用是在Web的服务器端调用的,你可以照常使用。这些爬虫都可以使用。
8)爬行速度怎么样?
一个单机的开源爬虫的速度基本可以用到机器网速的极限。爬虫速度慢,往往是因为用户线程少,网速慢,或者持久化数据时与数据库交互速度慢。而这些东西往往是由用户的机器和二次开发代码决定的。这些开源爬虫的速度非常好。
9)显然代码写对了,爬不出来数据。是不是爬虫有问题?别的爬虫能解决吗?
如果代码写对了,数据爬不出来,其他爬虫也是一样。在这种情况下,要么 网站 阻止了您,要么您抓取的数据是由 javascript 生成的。无法通过更换爬虫来解决抓取数据失败的问题。
10)哪个爬虫可以判断网站是否爬完了,哪个爬虫可以根据主题爬取?
爬虫无法判断网站是否已经爬过,只能尽量覆盖。
至于基于主题的爬取,爬虫只有向下爬取内容才知道主题是什么。所以它通常是从整体上爬下来,然后去过滤内容。如果觉得抓取过于笼统,可以通过限制网址规律等方法缩小范围。
11) 哪个爬虫有更好的设计模式和结构?
设计模式纯属无稽之谈。当软件设计模式好的时候,开发软件,然后总结出几种设计模式。设计模式对软件开发没有指导作用。使用设计模式来设计爬虫只会让爬虫的设计更加臃肿。
在架构上,开源爬虫目前主要是详细数据结构的设计,比如爬取线程池、任务队列等,大家都可以控制。爬虫的业务太简单了,不谈结构。
所以对于JAVA开源爬虫,我想,找一个好用的就好了。如果业务复杂,使用哪种爬虫就必须经过复杂的二次开发才能满足需求。
3.3 个非 Java 爬虫
在非JAVA语言编写的爬虫中,有很多优秀的爬虫。这里单独提取为一个类别,不是针对爬虫本身的质量,而是针对larbin、scrapy等爬虫对开发成本的影响。
先说python爬虫,python可以用30行代码完成JAVA 50行代码的任务。Python 代码编写确实很快,但是在调试代码阶段,Python 代码的调试往往比编码阶段节省的时间消耗的时间要多得多。使用python开发,为了保证程序的正确性和稳定性,需要编写更多的测试模块。当然,如果爬取规模不大,爬取业务不复杂,使用scrapy也是相当不错的,可以轻松完成爬取任务。
上图是Scrapy的架构图。绿线是数据流。首先,从初始 URL 开始,Scheduler 将其交给 Downloader 进行下载。下载完成后,会交给Spider进行分析。需要保存的数据会被发送到Item Pipeline。,即对数据进行后处理。此外,可以在数据流通道中安装各种中间件来进行必要的处理。所以在开发爬虫的时候,最好先规划好各个模块。我的做法是分别规划下载模块、爬取模块、调度模块、数据存储模块。
对于C++爬虫来说,学习成本会比较大。而且你不能只计算一个人的学习成本。如果软件需要团队开发或交接,那将是很多人的学习成本。软件调试并不是那么容易。
还有一些ruby、php爬虫,这里不多评论。确实有一些非常小的数据采集任务,用ruby或者php非常方便。但是要选择这些语言的开源爬虫,一方面需要调查相关的生态系统,另一方面,这些开源爬虫可能会产生一些你找不到的bug(人少信息少)
4、反爬虫技术
由于搜索引擎的流行,网络爬虫已经成为一种非常流行的网络技术。除了专门从事搜索的谷歌、雅虎、微软和百度,几乎每个大型门户网站网站都有自己大大小小的搜索引擎。可以叫出的名字有几十个,不知道的名字也有上万个。对于一个内容驱动的网站来说,难免会被网络爬虫光顾。
网站上一些智能搜索引擎爬虫的爬取频率比较合理,消耗的资源比较少。但是,很多不良的网络爬虫对网页的爬取能力较差,经常会发送几十甚至上百个请求,重复爬取循环。拿,这种爬虫往往对中小网站是毁灭性的打击,尤其是缺乏爬虫编写经验的程序员写的爬虫,破坏力极强,网站的访问压力会非常大。, 会导致网站 访问缓慢甚至无法访问。
一般来说,网站从三个方面进行反爬虫:用户请求的Headers、用户行为、网站目录和数据加载方式。前两个比较容易遇到,从这些角度来看,大多数网站都是反爬虫。将采用第三类ajax应用网站,增加爬虫难度。
4.1 个通过 Headers 的反爬虫
从用户请求的Headers反爬取是最常见的反爬取策略。很多网站会检测Headers的User-Agent,有的网站会检测Referer(部分资源网站的防盗就是检测Referer)。如果遇到这种反爬虫机制,可以直接给爬虫添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者修改Referer值为目标网站域名【注:经常容易被Ignore,通过对请求的抓包分析确定referer,将其添加到模拟访问的请求头中该程序]。对于检测header的反爬虫,在爬虫中修改或添加header很容易绕过。
4.2 基于用户行为的反爬虫
网站的另一部分是检测用户行为,比如在短时间内从同一个IP多次访问同一个页面,或者在短时间内在同一个账号内多次执行相同的操作. 【这种反爬需要足够的ip来应对】
大部分网站都是前一种情况。在这种情况下,使用IP代理可以解决。可以专门写一个爬虫来爬取网上公开的代理ip,检测后全部保存。这类代理ip爬虫经常用到,最好自己准备一个。代理IP数量较多后,可以每隔几次请求换一个IP。这在requests或urllib2中很容易做到,这样你就可以轻松绕过第一个反爬虫。【点评:动态拨号也是一种解决方案】
在第二种情况下,您可以在每次请求后以几秒钟的随机间隔发出下一个请求。一些存在逻辑漏洞的网站可以通过多次请求、注销、重新登录、继续请求来绕过同一账号不能在短时间内多次发出相同请求的限制。【评论:账号的反爬限制一般很难处理,几秒的随机请求也可能被屏蔽。如果有多个账号,在它们之间切换会有更好的效果】
4.3 动态页面反爬虫
以上情况大部分出现在静态页面上,还有一些网站,我们需要爬取的数据是通过ajax请求获取的,或者通过Java生成的。首先使用Firebug或者HttpFox来分析网络请求【点评:感觉google和IE的网络请求分析也很好】。如果能找到ajax请求,分析出响应的具体参数和具体含义,就可以通过上面的方法直接使用requests或者urllib2来模拟ajax请求,分析响应json得到需要的数据。
能够直接模拟ajax请求获取数据是很棒的,但是有的网站加密了ajax请求的所有参数。我们没有办法为我们需要的数据构造一个请求。这几天爬的网站就是这样的。除了对ajax参数进行加密外,还封装了一些基础功能,都是调用自己的接口,对接口参数进行加密。遇到这样的网站,就不能用上面的方法了。我使用selenium+phantomJS框架,调用浏览器内核,使用phantomJS执行js模拟人的操作,触发页面中的js脚本。从填表到点击按钮再到滚动页面,一切都可以模拟,不管具体的请求和响应过程,只是一个完整的模拟人们浏览页面获取数据的过程。【评论:支持phantomJS】
使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面是在一定程度上通过添加Headers来冒充浏览器),它是浏览器本身,phantomJS是一个没有界面的浏览器,但控制浏览器的不是人。使用selenium+phantomJS可以做很多事情,比如识别point-and-touch(12306)或滑动验证码,页面表单的暴力破解等)。它还将在自动化渗透方面大显身手,未来也会如此。提这个。
htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-19 11:08
)
最近在做一个项目,扫描营业执照二维码得到一个网址链接。链接重定向后,将进入企业信息公示页面。您需要通过此链接获取所需信息(公司名称、法人、信用代码等)。
我在网上查了很多,找到了很多方法,但是都爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,我们只获取静态信息等等。所以并不是所有的方法都可行。
最后的解决方案是:WebClient模拟浏览器客户端,设置JS动态加载on(必须的,主要针对那些JS,Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用Jsoup清理数据,得到我们需要的内容。值得一提的是
Jsoup 的用法和 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以通过这两种方法获取。我们在谷歌浏览器中使用F12打开开发调试工具。使用定位功能定位我们需要的数据的位置,并查看标签的id。这个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;
} 查看全部
htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容
)
最近在做一个项目,扫描营业执照二维码得到一个网址链接。链接重定向后,将进入企业信息公示页面。您需要通过此链接获取所需信息(公司名称、法人、信用代码等)。
我在网上查了很多,找到了很多方法,但是都爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,我们只获取静态信息等等。所以并不是所有的方法都可行。
最后的解决方案是:WebClient模拟浏览器客户端,设置JS动态加载on(必须的,主要针对那些JS,Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用Jsoup清理数据,得到我们需要的内容。值得一提的是
Jsoup 的用法和 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以通过这两种方法获取。我们在谷歌浏览器中使用F12打开开发调试工具。使用定位功能定位我们需要的数据的位置,并查看标签的id。这个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;
}
htmlunit抓取动态网页(爬取苏宁酷开电视价格代码如下:(导入jsoup包) )
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-17 05:02
)
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析一下AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并且
模拟是一个比较困难的过程,需要比较多的分析经验
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,非常不利于后期项目部署到浏览器!所以推荐第一种方法,代码也是第一种方法。
爬取苏宁酷开电视的价格代码如下:
(导入jsoup包就不多说了,自己百度吧!)
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document
document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text()); 查看全部
htmlunit抓取动态网页(爬取苏宁酷开电视价格代码如下:(导入jsoup包)
)
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析一下AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并且
模拟是一个比较困难的过程,需要比较多的分析经验
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,非常不利于后期项目部署到浏览器!所以推荐第一种方法,代码也是第一种方法。
爬取苏宁酷开电视的价格代码如下:
(导入jsoup包就不多说了,自己百度吧!)
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document
document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
htmlunit抓取动态网页(HtmlUnit动态执行js函数繁体2017年03月11-功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2021-12-17 05:01
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
js 在执行另一个函数之前先执行一个函数
2017-05-17-一、 第一种情况:执行完运动函数后执行另一个函数。注意:点击按钮后,先显示div,然后宽高增加到300px。点击我
人类灵魂之地
HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题
2013 年 10 月 17 日 - 我目前正在研究爬虫。作为新手。研究了一些爬虫框架,发现有很多功能齐全的开源爬虫框架,但是很遗憾,我还没有发现爬虫对js有完美的解释和执行。看了关于网络爬虫爬js动态加载网页的内容(二),很感慨。首先很佩服博主季刊的钻研精神。虽然这篇文章的第二个和第三个方案都不是很靠谱,我能想到。这些程序说明
如何让htmlunit在执行javascript时不下载整个页面,而只返回url
2012.03.17-htmlunit介绍:htmlunit是一个开源的java页面分析工具。启动 htmlunit 后,底层会启动一个无界面的浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:WebCl
后台执行js先执行前端js函数,再执行后台函数的按钮。
2011.03.28-结合对__doPostBack()的分析,我做了一个实验,达到使用客户端的输入按钮按钮先触发前台JS功能,再执行后台操作的目的。1、第一种实现方法: 查看全部
htmlunit抓取动态网页(HtmlUnit动态执行js函数繁体2017年03月11-功能)
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
js 在执行另一个函数之前先执行一个函数
2017-05-17-一、 第一种情况:执行完运动函数后执行另一个函数。注意:点击按钮后,先显示div,然后宽高增加到300px。点击我
人类灵魂之地
HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题
2013 年 10 月 17 日 - 我目前正在研究爬虫。作为新手。研究了一些爬虫框架,发现有很多功能齐全的开源爬虫框架,但是很遗憾,我还没有发现爬虫对js有完美的解释和执行。看了关于网络爬虫爬js动态加载网页的内容(二),很感慨。首先很佩服博主季刊的钻研精神。虽然这篇文章的第二个和第三个方案都不是很靠谱,我能想到。这些程序说明
如何让htmlunit在执行javascript时不下载整个页面,而只返回url
2012.03.17-htmlunit介绍:htmlunit是一个开源的java页面分析工具。启动 htmlunit 后,底层会启动一个无界面的浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:WebCl
后台执行js先执行前端js函数,再执行后台函数的按钮。
2011.03.28-结合对__doPostBack()的分析,我做了一个实验,达到使用客户端的输入按钮按钮先触发前台JS功能,再执行后台操作的目的。1、第一种实现方法:
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-12-17 04:37
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取到的HTML文件不收录某段代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
} 查看全部
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取到的HTML文件不收录某段代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
}
htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-15 11:13
一般我们使用Java提供的HttpURLConnection或者Apache的HttpClient的网页源码是直观可见的,浏览器右键->点击查看源码,代码内容与网页内容一致网页的代码。html
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient在后端只返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于 Js 生成的内容 HttpClient 是不可用的。爪哇
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终获取对应的内容,获取的内容与浏览器的内容一致右键网页->点击check/视图元素。网络
我们这里讲的模拟方法大概有两种:windows
抓取目标
我们这次的目标是获取bilibili动态生成的动画列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。经过比较,我们可以看到目标列表是由Js生成的。
后端
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里主要是用来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。浏览器
Selenium 支持模拟很多浏览器,但这里我们只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。因为它没有接口,所以速度表现会更好。服务器
1.下载
使用PhantomJS需要到官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zipmaven
2.maven 依赖介绍:ide
org.seleniumhq.selenium
selenium-java
2.53.0
com.codeborne
phantomjsdriver
1.2.1
org.seleniumhq.selenium
selenium-remote-driver
org.seleniumhq.selenium
selenium-java
3.示例代码工具
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.ArrayList;
/**
* @author GinPonson
*/
public class TestSelenium {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args){
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
//设置代理或者其余参数
ArrayList cliArgsCap = new ArrayList();
//cliArgsCap.add("--proxy=http://"+HOST+":"+PORT);
//cliArgsCap.add("--proxy-auth=" + USER + ":" + PWD);
//cliArgsCap.add("--proxy-type=http");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
//capabilities.setCapability("phantomjs.page.settings.userAgent", "");
WebDriver driver = new PhantomJSDriver(capabilities);
driver.get("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(driver.getPageSource());
driver.quit();
}
}
4.其他功能
使用 HtmlUnit 获取页面
HtmlUnit 在功能上是 Selenium 的子集,Selenium 有相应的 HtmlUnit 实现。HtmlUnit 是一个用 Java 编写的无界面浏览器。因为没有接口,所以执行速度还是可以的。
1.maven 依赖介绍
2.Java 代码
/**
* @author GinPonson
*/
public class TestHtmlUnit {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args) throws Exception{
WebClient webClient = new WebClient();
//设置代理
//ProxyConfig proxyConfig = webClient.getOptions().getProxyConfig();
//proxyConfig.setProxyHost(HOST);
//proxyConfig.setProxyPort(Integer.valueOf(PORT));
//DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
//credentialsProvider.addCredentials(USER, PWD);
//设置参数
//webClient.getOptions().setCssEnabled(false);
//webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。页面渲染功能完善,具有浏览器截图功能,可以模拟登录操作。HtmlUnit使用Rhino引擎解析Js,有时候解析速度很慢,就像上面的例子,需要很长时间,但是HtmlUnit可以拿到页面,解析一组元素(虽然用Jsoup还是不错的解析元素),是一个不错的工具。
HtmlUnit遇到错误后,处理有7分钟的差异,大部分不知道怎么用QAQ
欢迎补充:) 查看全部
htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
一般我们使用Java提供的HttpURLConnection或者Apache的HttpClient的网页源码是直观可见的,浏览器右键->点击查看源码,代码内容与网页内容一致网页的代码。html
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient在后端只返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于 Js 生成的内容 HttpClient 是不可用的。爪哇
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终获取对应的内容,获取的内容与浏览器的内容一致右键网页->点击check/视图元素。网络
我们这里讲的模拟方法大概有两种:windows
抓取目标
我们这次的目标是获取bilibili动态生成的动画列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。经过比较,我们可以看到目标列表是由Js生成的。

后端
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里主要是用来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。浏览器
Selenium 支持模拟很多浏览器,但这里我们只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。因为它没有接口,所以速度表现会更好。服务器
1.下载
使用PhantomJS需要到官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zipmaven
2.maven 依赖介绍:ide
org.seleniumhq.selenium
selenium-java
2.53.0
com.codeborne
phantomjsdriver
1.2.1
org.seleniumhq.selenium
selenium-remote-driver
org.seleniumhq.selenium
selenium-java
3.示例代码工具
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.ArrayList;
/**
* @author GinPonson
*/
public class TestSelenium {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args){
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
//设置代理或者其余参数
ArrayList cliArgsCap = new ArrayList();
//cliArgsCap.add("--proxy=http://"+HOST+":"+PORT);
//cliArgsCap.add("--proxy-auth=" + USER + ":" + PWD);
//cliArgsCap.add("--proxy-type=http");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
//capabilities.setCapability("phantomjs.page.settings.userAgent", "");
WebDriver driver = new PhantomJSDriver(capabilities);
driver.get("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(driver.getPageSource());
driver.quit();
}
}
4.其他功能
使用 HtmlUnit 获取页面
HtmlUnit 在功能上是 Selenium 的子集,Selenium 有相应的 HtmlUnit 实现。HtmlUnit 是一个用 Java 编写的无界面浏览器。因为没有接口,所以执行速度还是可以的。
1.maven 依赖介绍
2.Java 代码
/**
* @author GinPonson
*/
public class TestHtmlUnit {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args) throws Exception{
WebClient webClient = new WebClient();
//设置代理
//ProxyConfig proxyConfig = webClient.getOptions().getProxyConfig();
//proxyConfig.setProxyHost(HOST);
//proxyConfig.setProxyPort(Integer.valueOf(PORT));
//DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
//credentialsProvider.addCredentials(USER, PWD);
//设置参数
//webClient.getOptions().setCssEnabled(false);
//webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。页面渲染功能完善,具有浏览器截图功能,可以模拟登录操作。HtmlUnit使用Rhino引擎解析Js,有时候解析速度很慢,就像上面的例子,需要很长时间,但是HtmlUnit可以拿到页面,解析一组元素(虽然用Jsoup还是不错的解析元素),是一个不错的工具。
HtmlUnit遇到错误后,处理有7分钟的差异,大部分不知道怎么用QAQ

欢迎补充:)
htmlunit抓取动态网页(极简工具X一站式开发,七大领域400页场景化应用构建最佳宝典(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-14 00:02
极简工具X一站式开发,7个领域400页场景化应用打造最佳合集,点击获取>>>
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。这真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取。不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。 查看全部
htmlunit抓取动态网页(极简工具X一站式开发,七大领域400页场景化应用构建最佳宝典(图))
极简工具X一站式开发,7个领域400页场景化应用打造最佳合集,点击获取>>>

最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。

以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。这真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取。不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码

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就好说了 }

这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。
htmlunit抓取动态网页(SC@SDUSC简述一下Gecco框架线程和队列模型#)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-13 15:06
2021SC@SDUSC
简述Gecco爬虫框架的线程和队列模型
##为什么使用这个模型
##如何动态获取初始请求队列如果想通过多线程提高爬虫的效率,就需要想办法把请求放入初始请求队列。我们可以先通过爬虫引擎保存要爬取的请求。另一个爬虫引擎将第一个爬虫引擎获取到的请求作为初始请求启动多线程操作。简单的说,初始请求也可以抓取,不需要硬编码。下面是jd使用多线程捕获的一段代码
//先获取分类列表,放入AllSortPipeline.sortRequests
HttpGetRequest start = new HttpGetRequest("http://www.jd.com/allSort.aspx");
start.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
.start(start)
.run();
//分类列表下的商品列表采用3线程抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
//从上面的GeccoEngine获取初始请求
.start(AllSortPipeline.sortRequests)
.thread(5)
.interval(2000)
.start();
这是爬虫框架的线程和队列的一些基本内容。 查看全部
htmlunit抓取动态网页(SC@SDUSC简述一下Gecco框架线程和队列模型#)
2021SC@SDUSC
简述Gecco爬虫框架的线程和队列模型
##为什么使用这个模型
##如何动态获取初始请求队列如果想通过多线程提高爬虫的效率,就需要想办法把请求放入初始请求队列。我们可以先通过爬虫引擎保存要爬取的请求。另一个爬虫引擎将第一个爬虫引擎获取到的请求作为初始请求启动多线程操作。简单的说,初始请求也可以抓取,不需要硬编码。下面是jd使用多线程捕获的一段代码
//先获取分类列表,放入AllSortPipeline.sortRequests
HttpGetRequest start = new HttpGetRequest("http://www.jd.com/allSort.aspx");
start.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
.start(start)
.run();
//分类列表下的商品列表采用3线程抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
//从上面的GeccoEngine获取初始请求
.start(AllSortPipeline.sortRequests)
.thread(5)
.interval(2000)
.start();
这是爬虫框架的线程和队列的一些基本内容。
htmlunit抓取动态网页(通过JAVA的API可以顺利的抓取网络上的大部分指定的网页内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-11 04:19
通过JAVA API,可以流畅的抓取互联网上大部分指定的网页内容。下面我就和大家分享一下这个方法的理解和体会。最简单的爬取方法是:
URL url = 新 URL(myurl);
BufferedReader br = newBufferedReader(newInputStreamReader(url.openStream()));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
我++;
sb.append(s+"\r\n");
}
这种方法抓取一般网页应该没有问题,但是当某些网页中存在嵌套重定向连接时,会报Serverredirected too manytimes之类的错误。这是因为这个网页里面有一些代码会重定向到其他 For 网页,循环过多导致程序错误。如果只想抓取这个URL中网页的内容,又不想被重定向到其他网页,可以使用下面的代码。
URL urlmy = 新 URL(myurl);
HttpURLConnection con = (HttpURLConnection)urlmy.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(false);
连接();
BufferedReader br = newBufferedReader(newInputStreamReader(con.getInputStream(),"UTF-8"));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s+"\r\n");
}
在这种情况下,程序在爬取时不会跳转到其他页面去抓取其他内容,达到了我们的目的。
如果我们在内部网上,我们需要向它添加一个代理。Java 为具有特殊系统属性的代理服务器提供支持。只需在上述程序中添加以下程序即可。
System.getProperties().setProperty("http.proxyHost", proxyName );
System.getProperties().setProperty("http.proxyPort",port);
这样,你就可以在内网中,从网上抓取你想要的东西。
上面程序检索到的所有内容都存储在字符串sb中,我们可以通过正则表达式进行分析,提取出我们想要的具体内容,供我使用,呵呵,这多好啊 一件事!! 查看全部
htmlunit抓取动态网页(通过JAVA的API可以顺利的抓取网络上的大部分指定的网页内容)
通过JAVA API,可以流畅的抓取互联网上大部分指定的网页内容。下面我就和大家分享一下这个方法的理解和体会。最简单的爬取方法是:
URL url = 新 URL(myurl);
BufferedReader br = newBufferedReader(newInputStreamReader(url.openStream()));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
我++;
sb.append(s+"\r\n");
}
这种方法抓取一般网页应该没有问题,但是当某些网页中存在嵌套重定向连接时,会报Serverredirected too manytimes之类的错误。这是因为这个网页里面有一些代码会重定向到其他 For 网页,循环过多导致程序错误。如果只想抓取这个URL中网页的内容,又不想被重定向到其他网页,可以使用下面的代码。
URL urlmy = 新 URL(myurl);
HttpURLConnection con = (HttpURLConnection)urlmy.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(false);
连接();
BufferedReader br = newBufferedReader(newInputStreamReader(con.getInputStream(),"UTF-8"));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s+"\r\n");
}
在这种情况下,程序在爬取时不会跳转到其他页面去抓取其他内容,达到了我们的目的。
如果我们在内部网上,我们需要向它添加一个代理。Java 为具有特殊系统属性的代理服务器提供支持。只需在上述程序中添加以下程序即可。
System.getProperties().setProperty("http.proxyHost", proxyName );
System.getProperties().setProperty("http.proxyPort",port);
这样,你就可以在内网中,从网上抓取你想要的东西。
上面程序检索到的所有内容都存储在字符串sb中,我们可以通过正则表达式进行分析,提取出我们想要的具体内容,供我使用,呵呵,这多好啊 一件事!!
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-12-08 21:10
)
在抓取网页数据的时候,传统的jsoup方案只能对静态页面有效,而且有些网页数据往往是js生成的,所以这个时候就需要其他的方案了。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标URL的通用性比较麻烦。
第二个想法,也是更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
因为htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:。
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本即可。
程序运行前必须确定驱动位置,如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
} 查看全部
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉
)
在抓取网页数据的时候,传统的jsoup方案只能对静态页面有效,而且有些网页数据往往是js生成的,所以这个时候就需要其他的方案了。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标URL的通用性比较麻烦。
第二个想法,也是更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
因为htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:。
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本即可。
程序运行前必须确定驱动位置,如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}
htmlunit抓取动态网页(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-12-08 21:09
前言
曾几何时,动态页面的信息提取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以算是解析动态页面的神器了,但是还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面就不行了。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要实现浏览器级别的效果,必须基于浏览器内核进行开发。好在我们有开源的webkit,更幸运的是我们有QtWebkit,对开发者更加友好。
SeimiAgent 简介
SeimiAgent 是基于 QtWebkit 开发的可以在服务器端后台运行的 webkit 服务。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
使用演示
SeimiCrawler 简介
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬取的业务逻辑,剩下的 Seimi 会帮你处理。在设计方面,SeimiCrawler 极大地受到了 Python 的爬虫框架 Scrapy 的启发,它结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以 SeimiCrawler 默认到HTML解析解析器是JsoupXpath(独立的扩展项目,不收录在jsoup中),
集成和部署 SeimiAgent
下载和解压就不显示了,上面的动态图片里也有演示,下载地址可以在SeimiAgent主页上找到。进入SeimiAgent的bin目录,执行:
./SeimiAgent -p 8000
这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
SeimiCrawler 配置
SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。我们直接在评论中解释最后一个完整的例子:
package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件seimi.properties
seimiAgentHost=127.0.0.1
seimiAgentPort=8000
启动
public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
完整演示地址
演示 查看全部
htmlunit抓取动态网页(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
前言
曾几何时,动态页面的信息提取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以算是解析动态页面的神器了,但是还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面就不行了。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要实现浏览器级别的效果,必须基于浏览器内核进行开发。好在我们有开源的webkit,更幸运的是我们有QtWebkit,对开发者更加友好。
SeimiAgent 简介
SeimiAgent 是基于 QtWebkit 开发的可以在服务器端后台运行的 webkit 服务。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
使用演示

SeimiCrawler 简介
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬取的业务逻辑,剩下的 Seimi 会帮你处理。在设计方面,SeimiCrawler 极大地受到了 Python 的爬虫框架 Scrapy 的启发,它结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以 SeimiCrawler 默认到HTML解析解析器是JsoupXpath(独立的扩展项目,不收录在jsoup中),
集成和部署 SeimiAgent
下载和解压就不显示了,上面的动态图片里也有演示,下载地址可以在SeimiAgent主页上找到。进入SeimiAgent的bin目录,执行:
./SeimiAgent -p 8000
这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
SeimiCrawler 配置
SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。我们直接在评论中解释最后一个完整的例子:
package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件seimi.properties
seimiAgentHost=127.0.0.1
seimiAgentPort=8000
启动
public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
完整演示地址
演示
htmlunit抓取动态网页(Java爬取博客阅读文章最多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-06 18:35
更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。
爬行思路:
所谓动态,就是可以通过请求后台动态改变对应的html页面,一开始页面并不是全部显示出来的。
大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
因此,爬取动态网页的思路转化为寻找对应的js代码,执行对应的js代码,从而通过java代码动态改变页面。
而当页面能够正确显示时,我们就可以像抓取静态网页一样抓取数据了!
首先可以使用htmlunit来模拟鼠标点击事件,这个很容易实现:
/**
* 通过htmlunit来获得一些搜狗的网址。
* 通过模拟鼠标点击事件来实现
* @param key
* @return
* @throws Exception
*/
public String getNextUrl(String key){
String page = new String();
try {
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
//去拿网页
HtmlPage htmlPage = webClient.getPage("http://pic.sogou.com/");
//得到表单
HtmlForm form = htmlPage.getFormByName("searchForm");
//得到提交按钮
HtmlSubmitInput button = form.getInputByValue("搜狗搜索");
//得到输入框
HtmlTextInput textField = form.getInputByName("query");
//输入内容
textField.setValueAttribute(key);
//点一下按钮
HtmlPage nextPage = button.click();
String str = nextPage.toString();
page = cutString(str);
webClient.close();
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
如上图,我通过java代码将关键字填入搜索我的,然后通过getInputByValue方法获取按钮控件,最后直接button.click(),
即可以模拟点击,点击后返回的http请求可以解析成htmlpage。
这个功能其实非常强大。例如,您可以使用此功能来模拟抢票,或使用点击事件和搜索相关知识将整个系统下线并保存在 html 中。
下一步就是使用强大的htmlunit来执行js代码了。
先写一个简单的jsp页面:
Insert title here
原数字
function change(value) {
document.getElementById("test").innerHTML = value;
return "hello htmlUnit";
}
从上面可以看出,jsp页面很简单,只是一个函数的变化,用来调用htmlUnit。
接下来是一个使用 htmlunit 的类。这个类支持 JavaScript 解释器,
然后将自己编写的JavaScript代码嵌入到页面中执行,执行后得到返回结果返回页面。
package com.blog.anla;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class TestMyOwnPage {
private void action() {
WebClient webClient = new WebClient();
try {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true); // 设置支持JavaScript。
// 去拿网页
HtmlPage htmlPage = webClient
.getPage("http://localhost:8989/testHtmlScrop/index.jsp");
String s = "更改后的数字";
ScriptResult t = htmlPage.executeJavaScript("change(\"" + s
+ "\");", "injected script", 500);
// 这里是在500行插入这一小行JavaScript代码段,因为如果在默认的1行,那不会有结果
// 因为js是顺序执行的,当你执行第一行js代码时,可能还没有渲染body里面的标签。
HtmlPage myPage = (HtmlPage) t.getNewPage();
String nextPage = myPage.asXml().toString();
String nextPage2 = myPage.asText().toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
webClient.close();
}
}
public static void main(String[] args) {
TestMyOwnPage tmop = new TestMyOwnPage();
tmop.action();
}
}
t.getNewPage() 中有两个属性,一个是
javaScriptResult:执行代码后返回的结果,如果有(如我上面写的,返回hello htmlunit),如果没有(返回Undefined)。
newPage_:执行这段代码后返回的整个页面。
结果如图:
这段代码执行的最终结果如下:
asXml():将整个页面的html代码返回给我们:
而asText()只返回页面上可以显示的值,即head标签和label标签:
这种执行思路也可以动态的执行对应的js代码,从而抓取到需要的数据。
-------------------------------------------------- -------------------------------------- 2017 年 7 月更新------- ------------------------------------------------- - ----------------------------------------------
这两天一直在研究一个关于网络爬虫的系统
但是第一次爬的时候就发现了这个问题,js的动态页面爬不下来。
网上找了很多方法,google也问了,主要是指htmlunit,下面是核心代码,
使用htmlunit的主要目的是模拟浏览器操作,因为有些链接点击无法通过src直接获取url,通常使用JavaScript
简单拼接后的URL,这样一来,相比之下,直接用htmlunit模拟浏览器点击就简单多了。
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
webClient.getOptions().setCssEnabled(false); //禁用css支持
webClient.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
webClient.getOptions().setTimeout(20000);
HtmlPage page = wc.getPage("http://www.hao123.com");
//我认为这个最重要
String pageXml = page.asXml(); //以xml的形式获取响应文本
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");
这个时候,就可以得到jsoup中的document对象了,接下来就好写了,就像爬普通静态网页一样了。
不过,webclient解析是还是会出现一些问题,js的问题,
主要是由于目标url的js写的有些问题,但在实际的浏览器中却会忽略,eclipse中会报异常。
今天看到的时候,很多人都踩了。也许他们当时没有认真写博客。如果想找java爬虫项目可以到我的专栏。
图片搜索包括使用jsoup抓取图片,lire来索引和搜索图片。
献上玫瑰手,留下余香。有什么问题可以多多讨论哦! 查看全部
htmlunit抓取动态网页(Java爬取博客阅读文章最多)
更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。
爬行思路:
所谓动态,就是可以通过请求后台动态改变对应的html页面,一开始页面并不是全部显示出来的。
大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
因此,爬取动态网页的思路转化为寻找对应的js代码,执行对应的js代码,从而通过java代码动态改变页面。
而当页面能够正确显示时,我们就可以像抓取静态网页一样抓取数据了!
首先可以使用htmlunit来模拟鼠标点击事件,这个很容易实现:
/**
* 通过htmlunit来获得一些搜狗的网址。
* 通过模拟鼠标点击事件来实现
* @param key
* @return
* @throws Exception
*/
public String getNextUrl(String key){
String page = new String();
try {
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
//去拿网页
HtmlPage htmlPage = webClient.getPage("http://pic.sogou.com/");
//得到表单
HtmlForm form = htmlPage.getFormByName("searchForm");
//得到提交按钮
HtmlSubmitInput button = form.getInputByValue("搜狗搜索");
//得到输入框
HtmlTextInput textField = form.getInputByName("query");
//输入内容
textField.setValueAttribute(key);
//点一下按钮
HtmlPage nextPage = button.click();
String str = nextPage.toString();
page = cutString(str);
webClient.close();
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
如上图,我通过java代码将关键字填入搜索我的,然后通过getInputByValue方法获取按钮控件,最后直接button.click(),
即可以模拟点击,点击后返回的http请求可以解析成htmlpage。
这个功能其实非常强大。例如,您可以使用此功能来模拟抢票,或使用点击事件和搜索相关知识将整个系统下线并保存在 html 中。
下一步就是使用强大的htmlunit来执行js代码了。
先写一个简单的jsp页面:
Insert title here
原数字
function change(value) {
document.getElementById("test").innerHTML = value;
return "hello htmlUnit";
}
从上面可以看出,jsp页面很简单,只是一个函数的变化,用来调用htmlUnit。
接下来是一个使用 htmlunit 的类。这个类支持 JavaScript 解释器,
然后将自己编写的JavaScript代码嵌入到页面中执行,执行后得到返回结果返回页面。
package com.blog.anla;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class TestMyOwnPage {
private void action() {
WebClient webClient = new WebClient();
try {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true); // 设置支持JavaScript。
// 去拿网页
HtmlPage htmlPage = webClient
.getPage("http://localhost:8989/testHtmlScrop/index.jsp");
String s = "更改后的数字";
ScriptResult t = htmlPage.executeJavaScript("change(\"" + s
+ "\");", "injected script", 500);
// 这里是在500行插入这一小行JavaScript代码段,因为如果在默认的1行,那不会有结果
// 因为js是顺序执行的,当你执行第一行js代码时,可能还没有渲染body里面的标签。
HtmlPage myPage = (HtmlPage) t.getNewPage();
String nextPage = myPage.asXml().toString();
String nextPage2 = myPage.asText().toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
webClient.close();
}
}
public static void main(String[] args) {
TestMyOwnPage tmop = new TestMyOwnPage();
tmop.action();
}
}
t.getNewPage() 中有两个属性,一个是
javaScriptResult:执行代码后返回的结果,如果有(如我上面写的,返回hello htmlunit),如果没有(返回Undefined)。
newPage_:执行这段代码后返回的整个页面。
结果如图:
这段代码执行的最终结果如下:
asXml():将整个页面的html代码返回给我们:
而asText()只返回页面上可以显示的值,即head标签和label标签:
这种执行思路也可以动态的执行对应的js代码,从而抓取到需要的数据。
-------------------------------------------------- -------------------------------------- 2017 年 7 月更新------- ------------------------------------------------- - ----------------------------------------------
这两天一直在研究一个关于网络爬虫的系统
但是第一次爬的时候就发现了这个问题,js的动态页面爬不下来。
网上找了很多方法,google也问了,主要是指htmlunit,下面是核心代码,
使用htmlunit的主要目的是模拟浏览器操作,因为有些链接点击无法通过src直接获取url,通常使用JavaScript
简单拼接后的URL,这样一来,相比之下,直接用htmlunit模拟浏览器点击就简单多了。
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
webClient.getOptions().setCssEnabled(false); //禁用css支持
webClient.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
webClient.getOptions().setTimeout(20000);
HtmlPage page = wc.getPage("http://www.hao123.com");
//我认为这个最重要
String pageXml = page.asXml(); //以xml的形式获取响应文本
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");
这个时候,就可以得到jsoup中的document对象了,接下来就好写了,就像爬普通静态网页一样了。
不过,webclient解析是还是会出现一些问题,js的问题,
主要是由于目标url的js写的有些问题,但在实际的浏览器中却会忽略,eclipse中会报异常。
今天看到的时候,很多人都踩了。也许他们当时没有认真写博客。如果想找java爬虫项目可以到我的专栏。
图片搜索包括使用jsoup抓取图片,lire来索引和搜索图片。
献上玫瑰手,留下余香。有什么问题可以多多讨论哦!
htmlunit抓取动态网页(菜鸟级网页制作软件走进那绚丽多彩的网页设计世界!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-03 20:26
一、 菜鸟级网页制作软件 如果您是网页制作的初学者,请让以下软件带您进入多彩的网页制作世界!①Microsoft FrontPage 如果您已经熟悉Word,那么相信您对FrontPage 进行网页设计会非常熟悉。使用FrontPage制作网页,您才能真正体会到“功能强大,使用方便”的含义。页面制作由FrontPage中的编辑器完成,其工作窗口由3个标签页组成,即“所见即所得”编辑页、HTML代码编辑页和预览页。FrontPage 自带图形和 GIF 动画编辑器,支持 CGI 和 CSS。向导和模板都让初学者更方便地编辑网页。FrontPage 最强大的方面是它的站点管理功能。在服务器上更新站点时,无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。
您还可以编辑文本、字体、颜色、更改主页的作者、标题、背景颜色或图像、定义绘图点、插入链接、定义文档代码、插入图像、创建表格等,就像使用 Word。它类似于 FrontPage 2000 吗?? 但是,Netscape 编辑器对于复杂网页设计的功能有限。它甚至不支持表单创建和多帧创建。Netscape 编辑器是网页制作初学者的一个很好的入门工具。如果您的网页主要由文本和图像组成,那么 Netscape 编辑器将是一个简单的选择。如果你对HTML语言有一定的了解,可以使用记事本或Ultra Edit等文本编辑器编写少量的HTML语句,也可以弥补Netscape编辑器的一些不足。③Adobe Pagemill Pagemill 功能虽然不是很强大,但是使用起来非常方便,适合初学者制作更漂亮、不是很复杂的主页。如果您的主页需要大量的框架、表单和 Image Map 图像,那么 Adobe Pagemill 确实是您的首选。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。
这是因为它有一个很好的工具来创建和编辑Frame(框架),你不必花太多精力去添加一个新的Frame(框架)。而 Claris Home Page 3.0 集成了 FileMaker 数据库,增强的站点管理功能还允许您检测到页面的合法连接。但是界面设计过于粗糙,Image Map图片的处理不完整。二、中级网页制作软件如果你已经有一定的网页设计基础,对HTML语言有一定的了解,那么你可以选择以下软件来设计你的网页,他们一定会为你做很多网站上的颜色。①DreamWeaver 自制动态HTML 动画网页 DreamWeaver 是一款很酷的网页设计软件,它包括可视化编辑、HTML代码编辑软件包,支持ActiveX、JavaScript、Java、Flash、ShockWave等功能,还可以拖拽创建从头到尾的动态HTML动画,支持动态HTML(Dynamic HTML)的设计,使该页面可以在Netscape和IE4.0浏览器中正确显示页面动画,无需插件。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。
该技术允许网页在 DreamWeaver 和 HTML 代码编辑器之间自由转换,并且 HTML 语法和结构保持不变。这样,专业设计师就可以在不改变原有的编辑习惯的情况下,充分享受可视化编辑的好处。DreamWeaver 最具挑战性和活力的地方在于其开放式设计,任何人都可以轻松扩展其功能。②Fireworks Fireworks,第一个完全为网页制作者设计的软件,渊源颇多。它的出现彻底改变了网络制图。Fireworks 是专门为网络图片设计而开发的,内置了丰富的网络发布功能支持,例如Fireworks 可以自动剪切图片并生成javascript 用于鼠标运动感应。而Fireworks拥有非常强大的动画功能和近乎完美的网络图片生成器(导出功能)。增强了与dreamweaver的连接,可以直接生成dreamweaver的Libaray,甚至可以导出为网页和CSS样式的图片!③Flash 让你的网页动起来。Flash 是一种在 Internet 上使用的动态和交互式冲击波。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。
通过这种方式,您可以生成多媒体图形和界面,同时保持非常小的文件大小。FLASH虽然不能像语言一样编程,但通过其内置的句子结合JavaScript,你也可以制作一个高度交互的主页。有人曾说过:下个世纪的网络设计师不会用FLASH,他们肯定会被淘汰!我相信这句话是对的!④HotDog Professional 制作的网页需要加入多种复杂的技术。HotDog 是较早的基于代码的网页设计工具。它最显着的特点是它提供了许多向导工具,可以帮助设计人员创建页面的复杂部分。HotDog 的高级 HTML 支持插入选取框,可以在预览模式下以正常速度查看。这是非常罕见的,因为即使是开创这种标签的微软,FrontPage中没有提供这样的功能。HotDog 对插件的支持远远超过其他产品。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。
HomeSite 工作界面复杂而简单。根据习惯,可以像记事本一样设置为简单的编辑窗口,也可以在复杂的界面下工作。HomeSite 更适合那些更复杂、更精彩的页面设计。如果您希望能够完全控制您制作页面的过程,HomeSite 是您的最佳选择。但是对于初学者来说太复杂了。⑥HotMetal Pro 使网页具有强大的数据嵌入能力。HotMetal 不仅提供“所见即所得”的图形制作方法,还提供代码编辑方法。这是一款不会让各级设计师失望的软件。但是初学者需要熟悉 HTML 才能轻松使用该软件。HotMetal 具有强大的数据嵌入功能。使用其数据插入向导,可以提取外部Access、Word、Excel等ODBC数据放入页面。而且 HotMetal 可以自动将它们转换为 HTML 格式,是不是很棒?此外,它还可以转换许多旧格式的文档(如WordStar 等),并且在转换过程中可以自动将这些文档中的图片转换为GIF 格式。HotMetal 为用户提供了“太多”的工具,它也可以使用网络图或树状图来显示整个站点文档的链接状态。三、高级网页制作软件①Microsoft Visual Studio 本系列版本为:2003、2005、2008及以后版本;适合开发动态aspx网页,同时无需刷新网站、webservice功能等即可制作,仅适用于高级用户。②Jbuilder适用于各种版本的JSP网页开发,只适合高级用户。③记事本不要以为记事本功能很少,软件很简单;但是,如何使用它来制作网页只适合高级用户;因为在它的内容上,没有直接制作网页的可视化操作,只需要编写各种HTML代码、CSS代码、JS代码和各种动态脚本就可以创建网页。 查看全部
htmlunit抓取动态网页(菜鸟级网页制作软件走进那绚丽多彩的网页设计世界!)
一、 菜鸟级网页制作软件 如果您是网页制作的初学者,请让以下软件带您进入多彩的网页制作世界!①Microsoft FrontPage 如果您已经熟悉Word,那么相信您对FrontPage 进行网页设计会非常熟悉。使用FrontPage制作网页,您才能真正体会到“功能强大,使用方便”的含义。页面制作由FrontPage中的编辑器完成,其工作窗口由3个标签页组成,即“所见即所得”编辑页、HTML代码编辑页和预览页。FrontPage 自带图形和 GIF 动画编辑器,支持 CGI 和 CSS。向导和模板都让初学者更方便地编辑网页。FrontPage 最强大的方面是它的站点管理功能。在服务器上更新站点时,无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。
您还可以编辑文本、字体、颜色、更改主页的作者、标题、背景颜色或图像、定义绘图点、插入链接、定义文档代码、插入图像、创建表格等,就像使用 Word。它类似于 FrontPage 2000 吗?? 但是,Netscape 编辑器对于复杂网页设计的功能有限。它甚至不支持表单创建和多帧创建。Netscape 编辑器是网页制作初学者的一个很好的入门工具。如果您的网页主要由文本和图像组成,那么 Netscape 编辑器将是一个简单的选择。如果你对HTML语言有一定的了解,可以使用记事本或Ultra Edit等文本编辑器编写少量的HTML语句,也可以弥补Netscape编辑器的一些不足。③Adobe Pagemill Pagemill 功能虽然不是很强大,但是使用起来非常方便,适合初学者制作更漂亮、不是很复杂的主页。如果您的主页需要大量的框架、表单和 Image Map 图像,那么 Adobe Pagemill 确实是您的首选。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。
这是因为它有一个很好的工具来创建和编辑Frame(框架),你不必花太多精力去添加一个新的Frame(框架)。而 Claris Home Page 3.0 集成了 FileMaker 数据库,增强的站点管理功能还允许您检测到页面的合法连接。但是界面设计过于粗糙,Image Map图片的处理不完整。二、中级网页制作软件如果你已经有一定的网页设计基础,对HTML语言有一定的了解,那么你可以选择以下软件来设计你的网页,他们一定会为你做很多网站上的颜色。①DreamWeaver 自制动态HTML 动画网页 DreamWeaver 是一款很酷的网页设计软件,它包括可视化编辑、HTML代码编辑软件包,支持ActiveX、JavaScript、Java、Flash、ShockWave等功能,还可以拖拽创建从头到尾的动态HTML动画,支持动态HTML(Dynamic HTML)的设计,使该页面可以在Netscape和IE4.0浏览器中正确显示页面动画,无需插件。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。
该技术允许网页在 DreamWeaver 和 HTML 代码编辑器之间自由转换,并且 HTML 语法和结构保持不变。这样,专业设计师就可以在不改变原有的编辑习惯的情况下,充分享受可视化编辑的好处。DreamWeaver 最具挑战性和活力的地方在于其开放式设计,任何人都可以轻松扩展其功能。②Fireworks Fireworks,第一个完全为网页制作者设计的软件,渊源颇多。它的出现彻底改变了网络制图。Fireworks 是专门为网络图片设计而开发的,内置了丰富的网络发布功能支持,例如Fireworks 可以自动剪切图片并生成javascript 用于鼠标运动感应。而Fireworks拥有非常强大的动画功能和近乎完美的网络图片生成器(导出功能)。增强了与dreamweaver的连接,可以直接生成dreamweaver的Libaray,甚至可以导出为网页和CSS样式的图片!③Flash 让你的网页动起来。Flash 是一种在 Internet 上使用的动态和交互式冲击波。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。
通过这种方式,您可以生成多媒体图形和界面,同时保持非常小的文件大小。FLASH虽然不能像语言一样编程,但通过其内置的句子结合JavaScript,你也可以制作一个高度交互的主页。有人曾说过:下个世纪的网络设计师不会用FLASH,他们肯定会被淘汰!我相信这句话是对的!④HotDog Professional 制作的网页需要加入多种复杂的技术。HotDog 是较早的基于代码的网页设计工具。它最显着的特点是它提供了许多向导工具,可以帮助设计人员创建页面的复杂部分。HotDog 的高级 HTML 支持插入选取框,可以在预览模式下以正常速度查看。这是非常罕见的,因为即使是开创这种标签的微软,FrontPage中没有提供这样的功能。HotDog 对插件的支持远远超过其他产品。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。
HomeSite 工作界面复杂而简单。根据习惯,可以像记事本一样设置为简单的编辑窗口,也可以在复杂的界面下工作。HomeSite 更适合那些更复杂、更精彩的页面设计。如果您希望能够完全控制您制作页面的过程,HomeSite 是您的最佳选择。但是对于初学者来说太复杂了。⑥HotMetal Pro 使网页具有强大的数据嵌入能力。HotMetal 不仅提供“所见即所得”的图形制作方法,还提供代码编辑方法。这是一款不会让各级设计师失望的软件。但是初学者需要熟悉 HTML 才能轻松使用该软件。HotMetal 具有强大的数据嵌入功能。使用其数据插入向导,可以提取外部Access、Word、Excel等ODBC数据放入页面。而且 HotMetal 可以自动将它们转换为 HTML 格式,是不是很棒?此外,它还可以转换许多旧格式的文档(如WordStar 等),并且在转换过程中可以自动将这些文档中的图片转换为GIF 格式。HotMetal 为用户提供了“太多”的工具,它也可以使用网络图或树状图来显示整个站点文档的链接状态。三、高级网页制作软件①Microsoft Visual Studio 本系列版本为:2003、2005、2008及以后版本;适合开发动态aspx网页,同时无需刷新网站、webservice功能等即可制作,仅适用于高级用户。②Jbuilder适用于各种版本的JSP网页开发,只适合高级用户。③记事本不要以为记事本功能很少,软件很简单;但是,如何使用它来制作网页只适合高级用户;因为在它的内容上,没有直接制作网页的可视化操作,只需要编写各种HTML代码、CSS代码、JS代码和各种动态脚本就可以创建网页。
htmlunit抓取动态网页(所说的问题试试)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-03 13:10
是的,最后还是用Selenium来实现上一篇我提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果还是可以接受的。
继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的第一选择是 htmlunit。先简单介绍一下htmlunit。以下段落摘自互联网。
htmlunit 是一个开源的java 页面分析工具。启动 htmlunit 后,将在底部启动一个无界面浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
通过一个简单的调用:
HtmlPage 页面 = webClient.getPage(url);
可以得到页面的HtmlPage表示,然后通过:
InputStream 是 = targetPage.getWebResponse().getContentAsStream()
可以获取页面的输入流,进而获取页面的源代码,这对于网络爬虫项目非常有用。
当然,你也可以从页面中获取更多的页面元素。
很重要的一点是 HtmlUnit 提供了对执行 javascript 的支持:
page.executeJavaScript(javascript)
js执行后返回一个ScriptResult对象,通过该对象可以获取js执行后的页面等信息。默认情况下,内部浏览器会在执行 js 后进行一次页面跳转,并跳转到执行 js 后生成的新页面。如果js执行失败,页面跳转将不会被执行。
最后可以通过获取 page.executeJavaScript(javascript).getNewPage() 来获取执行后的页面。换句话说,这里需要人工执行JavaScript。显然这不符合我的初衷。另外,我的水平可能太差了。我在爬新浪新闻页面的时候总是出错。我还没有找到错误在哪里。分析网上的查询结果,最可能的错误原因是htmlunit在执行某些带参数的请求时,参数的顺序或编码问题会导致请求失败并报错。关键是我运行后没有得到我需要的结果。
然后我寻找了另一种解决方案。这时候我找到了SeleniumWebDriver,这就是我需要的解决方案。
参考资料和例子后,就可以开始使用了。示例代码如下。
<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
3 FirefoxProfile firefoxProfile = new FirefoxProfile();
4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
5
6
7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
8
9 ArrayList list = new ArrayList();
10 list.add("http://www.sina.com.cn");
11 list.add("http://www.sohu.com");
12 list.add("http://www.163.com");
13 list.add("http://www.qq.com");
14
15 long start,end;
16
17 for(int i=0;i 查看全部
htmlunit抓取动态网页(所说的问题试试)
是的,最后还是用Selenium来实现上一篇我提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果还是可以接受的。
继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的第一选择是 htmlunit。先简单介绍一下htmlunit。以下段落摘自互联网。
htmlunit 是一个开源的java 页面分析工具。启动 htmlunit 后,将在底部启动一个无界面浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
通过一个简单的调用:
HtmlPage 页面 = webClient.getPage(url);
可以得到页面的HtmlPage表示,然后通过:
InputStream 是 = targetPage.getWebResponse().getContentAsStream()
可以获取页面的输入流,进而获取页面的源代码,这对于网络爬虫项目非常有用。
当然,你也可以从页面中获取更多的页面元素。
很重要的一点是 HtmlUnit 提供了对执行 javascript 的支持:
page.executeJavaScript(javascript)
js执行后返回一个ScriptResult对象,通过该对象可以获取js执行后的页面等信息。默认情况下,内部浏览器会在执行 js 后进行一次页面跳转,并跳转到执行 js 后生成的新页面。如果js执行失败,页面跳转将不会被执行。
最后可以通过获取 page.executeJavaScript(javascript).getNewPage() 来获取执行后的页面。换句话说,这里需要人工执行JavaScript。显然这不符合我的初衷。另外,我的水平可能太差了。我在爬新浪新闻页面的时候总是出错。我还没有找到错误在哪里。分析网上的查询结果,最可能的错误原因是htmlunit在执行某些带参数的请求时,参数的顺序或编码问题会导致请求失败并报错。关键是我运行后没有得到我需要的结果。
然后我寻找了另一种解决方案。这时候我找到了SeleniumWebDriver,这就是我需要的解决方案。
参考资料和例子后,就可以开始使用了。示例代码如下。
<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
3 FirefoxProfile firefoxProfile = new FirefoxProfile();
4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
5
6
7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
8
9 ArrayList list = new ArrayList();
10 list.add("http://www.sina.com.cn");
11 list.add("http://www.sohu.com");
12 list.add("http://www.163.com");
13 list.add("http://www.qq.com");
14
15 long start,end;
16
17 for(int i=0;i
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2021-12-03 13:09
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取的HTML文件中没有特定的代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,因为有的存在重复导入或者版本问题)代码如下:
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
} 查看全部
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取的HTML文件中没有特定的代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,因为有的存在重复导入或者版本问题)代码如下:
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
}
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-01-01 07:03
)
在抓取网页数据时,传统的jsoup方案只能对静态页面有效,而且部分网页数据往往是js生成的,所以此时需要其他方案。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标网址的通用性比较麻烦。
第二种想法,也是一种更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
由于htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本。
运行程序前一定要指定驱动位置,比如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
} 查看全部
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉
)
在抓取网页数据时,传统的jsoup方案只能对静态页面有效,而且部分网页数据往往是js生成的,所以此时需要其他方案。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标网址的通用性比较麻烦。
第二种想法,也是一种更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
由于htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本。
运行程序前一定要指定驱动位置,比如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}
htmlunit抓取动态网页(静态网页和动态网页主要根据网页制作的语言来区分)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-27 14:05
静态网页和动态网页主要根据网页的制作语言来区分。
☑ 静态网页语言:HTML,如图1.1。
图1.1 静态网页显示的URL
☑ 动态网页使用的语言:HTML+ASP、HTML+PHP或HTML+JSP等,如图1.2。
图1.2 动态网页显示的网址
动态网页的程序都是在服务器端运行,最后将运行结果返回给客户端浏览器进行显示。静态网页是预先制作好的,通过服务器直接传递给客户端浏览器。
静态网页和动态网页各有特点。网站采用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,相反,采用动态网页技术来实现。
简而言之,静态网页具有以下特点:
☑ 静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常见形式,不收录
“?”。
☑ 网页内容一旦发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都会保存在网站服务器上。也就是说,静态网页是一个实际保存在服务器上的文件。网页是一个独立的文件。
☑ 静态网页内容相对稳定,容易被搜索引擎检索到。
☑ 静态网页没有数据库支持,网站制作和维护的工作量比较大。因此,在网站信息量较大的情况下,难以单纯依靠静态网页制作方式。
☑ 静态网页交互性较差,在功能上有较大局限。
动态网页具有以下特点:
☑ 动态网页基于数据库技术,可大大减少网站维护工作量。
☑ 使用动态网页技术的网站可以实现更多功能。例如用户注册、用户登录、在线调查、用户管理、订单管理等。
☑ 动态网页实际上并不是独立存在于服务器上的网页文件。服务器仅在用户请求时才返回完整的网页。
☑ “?” 在动态网页中给搜索引擎检索带来了一定的问题。搜索引擎一般无法访问一个网站的数据库中的所有网页,或者出于技术考虑,搜索蜘蛛不会抓取网址“?” “后者的内容,所以使用动态网页的网站在被搜索引擎推广时需要做一定的技术处理,以满足搜索引擎的要求。
静态网页是网站建设的基础。静态网页和动态网页并不矛盾。为了使网站适应搜索引擎的需要,即使采用动态网站技术,也可以将网页内容转换为静态网页进行发布。
动态网站也可以采用动静结合的原则。使用动态网页的地方适合使用动态网页。如果必须使用静态网页,可以考虑静态网页相关图片由静态网页实现。动态网页内容和静态网页内容在同一个网站上共存是很常见的。 查看全部
htmlunit抓取动态网页(静态网页和动态网页主要根据网页制作的语言来区分)
静态网页和动态网页主要根据网页的制作语言来区分。
☑ 静态网页语言:HTML,如图1.1。
图1.1 静态网页显示的URL
☑ 动态网页使用的语言:HTML+ASP、HTML+PHP或HTML+JSP等,如图1.2。
图1.2 动态网页显示的网址
动态网页的程序都是在服务器端运行,最后将运行结果返回给客户端浏览器进行显示。静态网页是预先制作好的,通过服务器直接传递给客户端浏览器。
静态网页和动态网页各有特点。网站采用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,相反,采用动态网页技术来实现。
简而言之,静态网页具有以下特点:
☑ 静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常见形式,不收录
“?”。
☑ 网页内容一旦发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都会保存在网站服务器上。也就是说,静态网页是一个实际保存在服务器上的文件。网页是一个独立的文件。
☑ 静态网页内容相对稳定,容易被搜索引擎检索到。
☑ 静态网页没有数据库支持,网站制作和维护的工作量比较大。因此,在网站信息量较大的情况下,难以单纯依靠静态网页制作方式。
☑ 静态网页交互性较差,在功能上有较大局限。
动态网页具有以下特点:
☑ 动态网页基于数据库技术,可大大减少网站维护工作量。
☑ 使用动态网页技术的网站可以实现更多功能。例如用户注册、用户登录、在线调查、用户管理、订单管理等。
☑ 动态网页实际上并不是独立存在于服务器上的网页文件。服务器仅在用户请求时才返回完整的网页。
☑ “?” 在动态网页中给搜索引擎检索带来了一定的问题。搜索引擎一般无法访问一个网站的数据库中的所有网页,或者出于技术考虑,搜索蜘蛛不会抓取网址“?” “后者的内容,所以使用动态网页的网站在被搜索引擎推广时需要做一定的技术处理,以满足搜索引擎的要求。
静态网页是网站建设的基础。静态网页和动态网页并不矛盾。为了使网站适应搜索引擎的需要,即使采用动态网站技术,也可以将网页内容转换为静态网页进行发布。
动态网站也可以采用动静结合的原则。使用动态网页的地方适合使用动态网页。如果必须使用静态网页,可以考虑静态网页相关图片由静态网页实现。动态网页内容和静态网页内容在同一个网站上共存是很常见的。
htmlunit抓取动态网页(程序是否在服务器端运行是一个重要的标志(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-26 21:19
程序是否在服务器端运行是一个重要的指标。服务器端运行的程序、网页、组件都是动态网页。他们会返回不同的网页,如asp、php、jsp、aspnet、cgi等,不同的客户,不同的时间。客户端运行的程序、网页、插件、组件都是静态网页,如html页面、flash、javascript、vbcript等。他们总是一样的。
静态网页和动态网页各有特点。一个网站是使用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站的功能比较简单,内容更新量不会很大。使用纯静态网页相对简单。相反,它一般是使用动态网络技术来实现的。
静态网页是网站建设的基础,静态网页和动态网页并不矛盾。为了满足搜索引擎的需求,即使采用动态网站技术,也可以将网页内容转换为静态网页。
动态网站也可以采用动静结合的原则。适用于使用动态网页的动态网页。如果需要静态网页,可以考虑使用静态网页,在同一个网站上实现动态网页内容和静态网页。内容同时存在也很常见。
动态网页的一般特征总结如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2) 使用动态网页技术的网站可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等。
(3)其实动态网页并不是独立存在于服务器上的网页文件,服务器只有在用户请求时才返回一个完整的网页。
(4)"?" 在动态网页中,搜索引擎搜索存在一些问题。搜索引擎通常无法访问网站数据库中的所有网页,或者由于技术原因,搜索蜘蛛不会抓取该网址。因此, “?”后面的内容,使用动态网页的网站需要进行一定的技术处理,以适应搜索引擎推广时对搜索引擎的要求。 查看全部
htmlunit抓取动态网页(程序是否在服务器端运行是一个重要的标志(图))
程序是否在服务器端运行是一个重要的指标。服务器端运行的程序、网页、组件都是动态网页。他们会返回不同的网页,如asp、php、jsp、aspnet、cgi等,不同的客户,不同的时间。客户端运行的程序、网页、插件、组件都是静态网页,如html页面、flash、javascript、vbcript等。他们总是一样的。
静态网页和动态网页各有特点。一个网站是使用动态网页还是静态网页,主要取决于网站的功能需求和网站内容的数量。如果网站的功能比较简单,内容更新量不会很大。使用纯静态网页相对简单。相反,它一般是使用动态网络技术来实现的。

静态网页是网站建设的基础,静态网页和动态网页并不矛盾。为了满足搜索引擎的需求,即使采用动态网站技术,也可以将网页内容转换为静态网页。
动态网站也可以采用动静结合的原则。适用于使用动态网页的动态网页。如果需要静态网页,可以考虑使用静态网页,在同一个网站上实现动态网页内容和静态网页。内容同时存在也很常见。
动态网页的一般特征总结如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2) 使用动态网页技术的网站可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等。
(3)其实动态网页并不是独立存在于服务器上的网页文件,服务器只有在用户请求时才返回一个完整的网页。
(4)"?" 在动态网页中,搜索引擎搜索存在一些问题。搜索引擎通常无法访问网站数据库中的所有网页,或者由于技术原因,搜索蜘蛛不会抓取该网址。因此, “?”后面的内容,使用动态网页的网站需要进行一定的技术处理,以适应搜索引擎推广时对搜索引擎的要求。
htmlunit抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-25 15:20
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录
了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();HtmlPage page = driver.get(url);System.out.println(page.as
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。作为
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.as
WebDriver driver = new InternetExplorerDriver();HtmlPage page = dirver.get(url);Thread.sleep(2000);System.output.println(page.as
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是很不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果你对使用WebDriver辅助爬虫获得的结果的稳定性有什么想说的,欢迎评论,因为我确实没有找到稳定爬虫结果的相关资料。 查看全部
htmlunit抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录
了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();HtmlPage page = driver.get(url);System.out.println(page.as
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。作为
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.as
WebDriver driver = new InternetExplorerDriver();HtmlPage page = dirver.get(url);Thread.sleep(2000);System.output.println(page.as
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是很不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果你对使用WebDriver辅助爬虫获得的结果的稳定性有什么想说的,欢迎评论,因为我确实没有找到稳定爬虫结果的相关资料。
htmlunit抓取动态网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-12-21 00:19
随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬取阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬取。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
对于第一种方法,webmagic-selenium 就是这样的一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium的配置比较复杂,跟平台和版本有关,没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
1 如何判断前端渲染
判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以确定为js渲染。
在这个例子中,如果源代码中找不到页面上的标题“友府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
2 分析请求
接下来我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的基本就是凭经验了。比如这里的“latest?p=1&s=20”一看就可疑……
对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装一个jsonviewer,查看AJAX结果非常方便)。看结果,似乎找到了我们想要的。
同样的,我们到了帖子详情页,找到了具体内容的请求:。
3 编写程序
回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只不过是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
数据表
在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的post的id,post details请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用JsonPath,一种选择数据的语言(webmagic-extension包提供了JsonPathSelector来支持)。
if (page.getUrl().regex(LIST_URL).match()) {
//这里我们使用JSONPATH这种选择语言来选择数据
List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
if (CollectionUtils.isNotEmpty(ids)) {
for (String id : ids) {
page.addTargetRequest("http://angularjs.cn/api/article/"+id);
}
}
}
目标数据
有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
本示例的完整代码请参见AngularJSProcessor.java
4 总结
在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
后台渲染页面
下载辅助页面 => 发现链接 => 下载并分析目标 HTML
前端渲染页面
发现辅助数据 => 构建链接 => 下载并分析目标 AJAX
对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
但是这些数据请求的分析还是比页面分析复杂的多,所以这其实就是动态页面爬取的难点。
本节的例子希望实现的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=>构建链接=>下载并分析目标AJAX模型。
PS:
WebMagic 0.5.0 将在链 API 中添加 Json 支持,您可以使用:
page.getJson().jsonPath("$.name").get();
这种方式来解析AJAX请求。
还支持
page.getJson().removePadding("callback").jsonPath("$.name").get();
这种方式来解析 JSONP 请求。 查看全部
htmlunit抓取动态网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬取阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬取。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
对于第一种方法,webmagic-selenium 就是这样的一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium的配置比较复杂,跟平台和版本有关,没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
1 如何判断前端渲染
判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以确定为js渲染。


在这个例子中,如果源代码中找不到页面上的标题“友府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
2 分析请求
接下来我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的基本就是凭经验了。比如这里的“latest?p=1&s=20”一看就可疑……

对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装一个jsonviewer,查看AJAX结果非常方便)。看结果,似乎找到了我们想要的。

同样的,我们到了帖子详情页,找到了具体内容的请求:。
3 编写程序
回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只不过是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
数据表
在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的post的id,post details请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用JsonPath,一种选择数据的语言(webmagic-extension包提供了JsonPathSelector来支持)。
if (page.getUrl().regex(LIST_URL).match()) {
//这里我们使用JSONPATH这种选择语言来选择数据
List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
if (CollectionUtils.isNotEmpty(ids)) {
for (String id : ids) {
page.addTargetRequest("http://angularjs.cn/api/article/"+id);
}
}
}
目标数据
有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
本示例的完整代码请参见AngularJSProcessor.java
4 总结
在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
后台渲染页面
下载辅助页面 => 发现链接 => 下载并分析目标 HTML
前端渲染页面
发现辅助数据 => 构建链接 => 下载并分析目标 AJAX
对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
但是这些数据请求的分析还是比页面分析复杂的多,所以这其实就是动态页面爬取的难点。
本节的例子希望实现的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=>构建链接=>下载并分析目标AJAX模型。
PS:
WebMagic 0.5.0 将在链 API 中添加 Json 支持,您可以使用:
page.getJson().jsonPath("$.name").get();
这种方式来解析AJAX请求。
还支持
page.getJson().removePadding("callback").jsonPath("$.name").get();
这种方式来解析 JSONP 请求。
htmlunit抓取动态网页(Web网络爬虫系统的原理及应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-12-19 17:14
1、 爬虫技术概述
网络爬虫是根据一定的规则自动抓取万维网信息的程序或脚本。它们广泛用于互联网搜索引擎或其他类似的网站,可以自动将采集它所能访问的页面的所有内容获取或更新这些网站@的内容和检索方法>. 从功能上来说,爬虫一般分为三部分:数据采集、处理、存储。传统爬虫从一个或多个初始网页的网址开始,获取初始网页上的网址。在爬取网页的过程中,他们不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。聚焦爬虫的工作流程比较复杂。需要按照一定的网页分析算法过滤与主题无关的链接,保留有用的链接,放入URL队列等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。
与一般的网络爬虫相比,聚焦爬虫还需要解决三个主要问题:
(1) 爬取目标的描述或定义;
(2) 对网页或数据的分析和过滤;
(3) URL 搜索策略。
2、爬取的原理
2.1 网络爬虫原理
网络爬虫系统的作用是下载网页数据,为搜索引擎系统提供数据源。许多大型互联网搜索引擎系统被称为基于Web数据的搜索引擎系统,如谷歌和百度。这说明了网络爬虫系统在搜索引擎中的重要性。除了供用户阅读的文本信息外,网页还收录一些超链接信息。网络爬虫系统通过网页中的超链接信息不断获取网络上的其他网页。正是因为这个采集进程就像一个爬虫或蜘蛛在网络上漫游,所以被称为网络爬虫系统或网络蜘蛛系统,英文称为Spider或Crawler。
2.2 网络爬虫系统的工作原理
在网络爬虫的系统框架中,主要流程由控制器、解析器和资源库三部分组成。控制器的主要工作是为多线程中的每个爬虫线程分配工作任务。解析器的主要工作是下载网页并处理页面,主要是处理一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容。爬虫的基本工作由解析器完成。资源库用于存储下载的网页资源。一般使用Oracle数据库等大型数据库存储,并建立索引。
控制器
控制器是网络爬虫的中央控制器。主要负责根据系统传递过来的URL链接分配一个线程,然后启动线程调用爬虫对网页进行爬取。
解析器
解析器是负责网络爬虫的主要部分。它的主要任务包括:下载网页,处理网页的文本,如过滤,提取特殊的HTML标签,分析数据。
资源库
主要用于存储网页中下载的数据记录,并提供生成索引的目标源。中大型数据库产品包括:Oracle、Sql Server等。
网络爬虫系统一般会选择一些输出度(网页中超链接的数量)较高的比较重要的URL作为种子URL集合。网络爬虫系统使用这些种子集作为初始 URL 开始数据爬取。由于网页收录链接信息,因此可以通过现有网页的网址获取一些新的网址。网页之间的指向结构可以看作是一个森林。每个种子 URL 对应的网页是森林中一棵树的根节点。. 这样,网络爬虫系统就可以按照广度优先算法或深度优先算法遍历所有网页。由于深度优先搜索算法可能会导致爬虫系统陷入网站内部,不利于搜索更接近< @网站主页,采集网页一般采用广度优先搜索算法。网络爬虫系统首先将种子 URL 放入下载队列,然后简单地从队列头部取一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。
网络爬虫的基本工作流程如下:
1.先选择一部分精心挑选的种子网址;
2.将这些URL放入URL队列中进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页并保存到下载的网页库中。另外,将这些网址放入已爬取的网址队列中。
4.对爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待爬取的URL队列中,从而进入下一个循环。
2.3 爬取策略
在爬虫系统中,要爬取的URL队列是一个非常重要的部分。URL队列中要爬取的URL按什么顺序排列也是一个很重要的问题,因为它涉及到先爬哪个页面,后爬哪个页面。确定这些 URL 顺序的方法称为抓取策略。下面重点介绍几种常见的爬取策略:
2.3.1 深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,逐个跟踪每一个链接,处理完这一行后转移到下一个起始页,继续跟踪链接。我们以下图为例:
遍历的路径:AFG EHI BCD
2.3.2 广度优先遍历策略
广度优先遍历策略的基本思想是将新下载的网页中找到的链接直接插入到待爬取的URL队列的末尾。即网络爬虫会先抓取起始网页中所有链接的网页,然后选择其中一个链接的网页,继续抓取该网页中链接的所有网页。以上图为例:
遍历路径:ABCDEF GHI
2.3.3 反向链接计数策略
反向链接数是指从其他网页链接到某个网页的数量。反向链接的数量表示网页内容被他人推荐的程度。因此,很多时候搜索引擎的爬取系统都会使用这个指标来评估网页的重要性,从而决定不同网页的爬取顺序。
在真实的网络环境中,由于广告链接和作弊链接的存在,反向链接的数量不能完全坐等别人的重视。因此,搜索引擎通常会考虑一些可靠的反向链接。
2.3.4Partial PageRank 策略
Partial PageRank算法借鉴了PageRank算法的思想:对于下载的网页,连同要爬取的URL队列中的URL,组成一个网页集,计算每个页面的PageRank值,经过计算完成后,将要爬取的URL队列中的URL按照PageRank值的大小进行排列,依次爬取页面。
如果每个页面都被抓取,则重新计算 PageRank 值。一个折衷的方案是:每爬取K个页面后,重新计算PageRank值。但是,这种情况下仍然存在一个问题:对于已经从下载页面中分析出来的链接,也就是我们前面提到的未知网页部分,暂时没有PageRank值。为了解决这个问题,这些页面会被赋予一个临时的PageRank值:将所有传入该页面链中的PageRank值聚合起来,从而形成未知页面的PageRank值,从而参与排名。以下示例说明:
2.3.5OPIC 策略
该算法实际上对页面的重要性进行评分。在算法开始之前,给所有页面相同的初始现金(cash)。下载某个页面P后,将P的现金分配给所有从P解析的链接,清空P的现金。待抓取的 URL 队列中的所有页面均按照现金的数量进行排序。
2.3.六大站优先策略
URL队列中所有要爬取的网页,按照所属的网站进行分类。网站需要下载的页面较多,优先下载。这种策略因此被称为大站优先策略。
3、 爬虫分类
我应该选择 Nutch、Crawler4j、WebMagic、scrapy、WebCollector 还是其他来开发网络爬虫?上面提到的爬虫基本上可以分为三类:
(1)分布式爬虫:Nutch
(2)JAVA 爬虫:Crawler4j、WebMagic、WebCollector
(3)非JAVA爬虫:scrapy(基于Python语言开发)
3.1 个分布式爬虫
爬虫采用分布式,主要解决两个问题:
1)海量网址管理
2)网速
最流行的分布式爬虫是 Apache 的 Nutch。但是对于大多数用户来说,Nutch 是这些类型的爬虫中最糟糕的选择,原因如下:
1)Nutch 是一款专为搜索引擎设计的爬虫。大多数用户需要一个爬虫来进行准确的数据爬取(精细提取)。Nutch 运行的一组进程中有三分之二是为搜索引擎设计的。精细提取没有多大意义。换句话说,使用 Nutch 进行数据提取会在不必要的计算上浪费大量时间。而如果你试图通过二次开发,让Nutch适合精炼业务,你基本上会破坏Nutch的框架,将Nutch改得面目全非,并有能力修改Nutch。自己写一个新的确实更好。分布式爬虫框架。
2)Nutch 依赖于hadoop 来运行,而hadoop 本身也消耗了大量的时间。如果集群机器数量少,爬取速度不如单机爬虫快。
3) 虽然Nutch有一套插件机制,但也被宣传为一个亮点。可以看到一些开源的Nutch插件,提供精细的提取功能。但是任何开发过 Nutch 插件的人都知道 Nutch 的插件系统有多烂。使用反射机制加载和调用插件使得编写和调试程序变得极其困难,更不用说在其上开发复杂的精细提取系统了。并且Nutch没有提供相应的插件挂载点进行精细提取。Nutch的插件只有五六个挂载点,而这五六个挂载点是为搜索引擎服务的,不提供精细提取的挂载点。Nutch的大部分精提取插件都挂载在挂载点“解析器”(parser)上,
4)使用Nutch进行爬虫的二次开发,爬虫的准备和调试所需的时间往往是单机爬虫的十倍以上。学习Nutch源代码的成本非常高,更何况一个团队中的每个人都必须了解Nutch源代码。在调试过程中,会出现程序本身以外的各种问题(hadoop问题、hbase问题)。
5) 很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等,其实很多人理解错了。这里所说的持久化数据是指在avro、hbase、mysql中存储URL信息(URL管理所需的数据)。这不是您要提取的结构化数据。事实上,对于大多数人来说,URL 信息存在于何处并不重要。
6)Nutch2的版本目前不适合开发。Nutch官方稳定版是nutch2.2.1,但是这个版本绑定了gora-0.3。如果你想和nutch一起使用hbase(大多数人使用nutch2只是为了使用hbase),你只能在0.90版本左右使用hbase,因此你必须将hadoop版本减少到hadoop 0.2或所以。而且,Nutch2的官方教程更具有误导性。Nutch2有两个教程,分别是Nutch1.x和Nutch2.x。Nutch2.x 官网可以支持转到hbase 0.94。但其实这个Nutch2.x指的是Nutch2.3之前和Nutch2.2.1之后的版本。此版本在官方SVN中不断更新。
所以,如果你不是搜索引擎,尽量不要选择Nutch作为爬虫。有些团队喜欢效仿。他们之所以坚持选择Nutch开发集约化提取的爬虫,其实是因为Nutch的名气(Nutch的作者是Doug Cutting)。当然,最终的结果往往是项目被推迟。
如果你是一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与 solr 或 es 合作组成了一个非常强大的搜索引擎。如果非要使用Nutch2,建议等到Nutch2.3发布。当前的 Nutch2 是一个非常不稳定的版本。
分布式爬虫平台架构图
3.2 JAVA爬虫
这里将JAVA爬虫单独划分为一个类别,因为JAVA在网络爬虫的生态系统中是非常完备的。相关资料也是最全的。这里可能有争议,我只是随便说说。
其实开源网络爬虫(框架)的开发非常简单,难点复杂的问题(比如DOM树解析定位、字符集检测、海量URL去重)都已经被前人解决了,可以说没有技术含量。包括Nutch,其实Nutch的技术难点就是开发hadoop,代码本身也很简单。从某种意义上说,网络爬虫类似于遍历机器上的文件以查找文件中的信息。没有任何困难。之所以选择开源爬虫框架,是为了省事。比如爬虫URL管理、线程池等模块任何人都可以做,但是需要一段时间的调试和修改才能稳定下来。
用于爬虫的功能。用户比较关心的问题往往是:
1) 爬虫是否支持多线程,爬虫能不能用agent,能不能抓取重复数据,能不能抓取JS生成的信息?
那些不支持多线程、代理、过滤重复URL的不叫开源爬虫,叫循环执行http请求。
js生成的信息能否被爬取与爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。爬取js产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit、selenium)来完成。这些模拟浏览器通常需要花费大量时间来处理页面。所以一种策略是利用这些爬虫来遍历网站,当遇到需要解析的页面时,将页面的相关信息提交给模拟浏览器,完成对JS生成信息的提取。
2)爬虫可以爬取ajax信息吗?
网页上有一些异步加载的数据。爬取这个数据有两种方式:使用模拟浏览器(问题1中描述),或者分析ajax http请求,自己生成ajax请求url,获取返回数据。如果您自己生成 Ajax 请求,那么使用开源爬虫有什么意义呢?其实还是需要用到开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来抓取这些请求?
爬虫通常被设计成广度遍历或深度遍历的模式来遍历静态或动态页面。爬取ajax信息属于深网(deep web)的范畴,虽然大部分爬虫不直接支持。但它也可以通过某些方式完成。例如,WebCollector 使用广度遍历来遍历网站。第一轮爬取是爬取种子集(seeds)中的所有URL。简单的说,就是将生成的ajax请求作为种子,放入爬虫中。使用爬虫遍历这些深度为1的种子(默认为广度遍历)。
3)爬虫如何爬取网站登录?
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是基于cookies。至于如何获取cookie,就不是爬虫的事情了。您可以手动获取cookies,也可以模拟http请求登录,也可以使用模拟浏览器自动登录获取cookies。
4)爬虫如何从网页中提取信息?
开源爬虫一般都集成了网页提取工具。主要支持两种规范:CSS SELECTOR 和 XPATH。至于哪个更好,这里就不评价了。
5)爬虫是如何保存网页信息的?
一些爬虫带有一个负责持久化的模块。例如,webmagic 有一个叫做管道的模块。通过简单的配置,爬虫提取的信息可以持久化到文件、数据库等中,也有一些爬虫不直接为用户提供数据持久化模块。如 crawler4j 和 webcollector。让用户在网页处理模块中添加提交数据库的操作。至于使用pipeline模块好不好,类似于是否使用ORM来操作数据库的问题,看你的业务了。
6)爬虫被网站屏蔽了,怎么办?
爬虫已经被网站拦截了,通常可以通过多个代理(随机代理)解决。但是,这些开源爬虫一般不直接支持随机代理的切换。因此,用户经常需要将获取到的代理放入一个全局数组中,自己编写代码来随机获取代理(从数组中)。
7)网页可以调用爬虫吗?
爬虫的调用是在Web的服务器端调用的,你可以照常使用。这些爬虫都可以使用。
8)爬行速度怎么样?
一个单机的开源爬虫的速度基本可以用到机器网速的极限。爬虫速度慢,往往是因为用户线程少,网速慢,或者持久化数据时与数据库交互速度慢。而这些东西往往是由用户的机器和二次开发代码决定的。这些开源爬虫的速度非常好。
9)显然代码写对了,爬不出来数据。是不是爬虫有问题?别的爬虫能解决吗?
如果代码写对了,数据爬不出来,其他爬虫也是一样。在这种情况下,要么 网站 阻止了您,要么您抓取的数据是由 javascript 生成的。无法通过更换爬虫来解决抓取数据失败的问题。
10)哪个爬虫可以判断网站是否爬完了,哪个爬虫可以根据主题爬取?
爬虫无法判断网站是否已经爬过,只能尽量覆盖。
至于基于主题的爬取,爬虫只有向下爬取内容才知道主题是什么。所以它通常是从整体上爬下来,然后去过滤内容。如果觉得抓取过于笼统,可以通过限制网址规律等方法缩小范围。
11) 哪个爬虫有更好的设计模式和结构?
设计模式纯属无稽之谈。当软件设计模式好的时候,开发软件,然后总结出几种设计模式。设计模式对软件开发没有指导作用。使用设计模式来设计爬虫只会让爬虫的设计更加臃肿。
在架构上,开源爬虫目前主要是详细数据结构的设计,比如爬取线程池、任务队列等,大家都可以控制。爬虫的业务太简单了,不谈结构。
所以对于JAVA开源爬虫,我想,找一个好用的就好了。如果业务复杂,使用哪种爬虫就必须经过复杂的二次开发才能满足需求。
3.3 个非 Java 爬虫
在非JAVA语言编写的爬虫中,有很多优秀的爬虫。这里单独提取为一个类别,不是针对爬虫本身的质量,而是针对larbin、scrapy等爬虫对开发成本的影响。
先说python爬虫,python可以用30行代码完成JAVA 50行代码的任务。Python 代码编写确实很快,但是在调试代码阶段,Python 代码的调试往往比编码阶段节省的时间消耗的时间要多得多。使用python开发,为了保证程序的正确性和稳定性,需要编写更多的测试模块。当然,如果爬取规模不大,爬取业务不复杂,使用scrapy也是相当不错的,可以轻松完成爬取任务。
上图是Scrapy的架构图。绿线是数据流。首先,从初始 URL 开始,Scheduler 将其交给 Downloader 进行下载。下载完成后,会交给Spider进行分析。需要保存的数据会被发送到Item Pipeline。,即对数据进行后处理。此外,可以在数据流通道中安装各种中间件来进行必要的处理。所以在开发爬虫的时候,最好先规划好各个模块。我的做法是分别规划下载模块、爬取模块、调度模块、数据存储模块。
对于C++爬虫来说,学习成本会比较大。而且你不能只计算一个人的学习成本。如果软件需要团队开发或交接,那将是很多人的学习成本。软件调试并不是那么容易。
还有一些ruby、php爬虫,这里不多评论。确实有一些非常小的数据采集任务,用ruby或者php非常方便。但是要选择这些语言的开源爬虫,一方面需要调查相关的生态系统,另一方面,这些开源爬虫可能会产生一些你找不到的bug(人少信息少)
4、反爬虫技术
由于搜索引擎的流行,网络爬虫已经成为一种非常流行的网络技术。除了专门从事搜索的谷歌、雅虎、微软和百度,几乎每个大型门户网站网站都有自己大大小小的搜索引擎。可以叫出的名字有几十个,不知道的名字也有上万个。对于一个内容驱动的网站来说,难免会被网络爬虫光顾。
网站上一些智能搜索引擎爬虫的爬取频率比较合理,消耗的资源比较少。但是,很多不良的网络爬虫对网页的爬取能力较差,经常会发送几十甚至上百个请求,重复爬取循环。拿,这种爬虫往往对中小网站是毁灭性的打击,尤其是缺乏爬虫编写经验的程序员写的爬虫,破坏力极强,网站的访问压力会非常大。, 会导致网站 访问缓慢甚至无法访问。
一般来说,网站从三个方面进行反爬虫:用户请求的Headers、用户行为、网站目录和数据加载方式。前两个比较容易遇到,从这些角度来看,大多数网站都是反爬虫。将采用第三类ajax应用网站,增加爬虫难度。
4.1 个通过 Headers 的反爬虫
从用户请求的Headers反爬取是最常见的反爬取策略。很多网站会检测Headers的User-Agent,有的网站会检测Referer(部分资源网站的防盗就是检测Referer)。如果遇到这种反爬虫机制,可以直接给爬虫添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者修改Referer值为目标网站域名【注:经常容易被Ignore,通过对请求的抓包分析确定referer,将其添加到模拟访问的请求头中该程序]。对于检测header的反爬虫,在爬虫中修改或添加header很容易绕过。
4.2 基于用户行为的反爬虫
网站的另一部分是检测用户行为,比如在短时间内从同一个IP多次访问同一个页面,或者在短时间内在同一个账号内多次执行相同的操作. 【这种反爬需要足够的ip来应对】
大部分网站都是前一种情况。在这种情况下,使用IP代理可以解决。可以专门写一个爬虫来爬取网上公开的代理ip,检测后全部保存。这类代理ip爬虫经常用到,最好自己准备一个。代理IP数量较多后,可以每隔几次请求换一个IP。这在requests或urllib2中很容易做到,这样你就可以轻松绕过第一个反爬虫。【点评:动态拨号也是一种解决方案】
在第二种情况下,您可以在每次请求后以几秒钟的随机间隔发出下一个请求。一些存在逻辑漏洞的网站可以通过多次请求、注销、重新登录、继续请求来绕过同一账号不能在短时间内多次发出相同请求的限制。【评论:账号的反爬限制一般很难处理,几秒的随机请求也可能被屏蔽。如果有多个账号,在它们之间切换会有更好的效果】
4.3 动态页面反爬虫
以上情况大部分出现在静态页面上,还有一些网站,我们需要爬取的数据是通过ajax请求获取的,或者通过Java生成的。首先使用Firebug或者HttpFox来分析网络请求【点评:感觉google和IE的网络请求分析也很好】。如果能找到ajax请求,分析出响应的具体参数和具体含义,就可以通过上面的方法直接使用requests或者urllib2来模拟ajax请求,分析响应json得到需要的数据。
能够直接模拟ajax请求获取数据是很棒的,但是有的网站加密了ajax请求的所有参数。我们没有办法为我们需要的数据构造一个请求。这几天爬的网站就是这样的。除了对ajax参数进行加密外,还封装了一些基础功能,都是调用自己的接口,对接口参数进行加密。遇到这样的网站,就不能用上面的方法了。我使用selenium+phantomJS框架,调用浏览器内核,使用phantomJS执行js模拟人的操作,触发页面中的js脚本。从填表到点击按钮再到滚动页面,一切都可以模拟,不管具体的请求和响应过程,只是一个完整的模拟人们浏览页面获取数据的过程。【评论:支持phantomJS】
使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面是在一定程度上通过添加Headers来冒充浏览器),它是浏览器本身,phantomJS是一个没有界面的浏览器,但控制浏览器的不是人。使用selenium+phantomJS可以做很多事情,比如识别point-and-touch(12306)或滑动验证码,页面表单的暴力破解等)。它还将在自动化渗透方面大显身手,未来也会如此。提这个。 查看全部
htmlunit抓取动态网页(Web网络爬虫系统的原理及应用)
1、 爬虫技术概述
网络爬虫是根据一定的规则自动抓取万维网信息的程序或脚本。它们广泛用于互联网搜索引擎或其他类似的网站,可以自动将采集它所能访问的页面的所有内容获取或更新这些网站@的内容和检索方法>. 从功能上来说,爬虫一般分为三部分:数据采集、处理、存储。传统爬虫从一个或多个初始网页的网址开始,获取初始网页上的网址。在爬取网页的过程中,他们不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。聚焦爬虫的工作流程比较复杂。需要按照一定的网页分析算法过滤与主题无关的链接,保留有用的链接,放入URL队列等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。保留有用的链接并将它们放入 URL 队列中等待被抓取。然后,它会根据一定的搜索策略从队列中选择下一个要抓取的网页的网址,重复上述过程,直到达到系统的某个条件时停止。另外,爬虫爬过的所有网页都会被系统存储起来,进行一定的分析、过滤、索引,以备以后查询检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。爬虫爬过的所有网页都会被系统存储起来进行一定的分析、过滤和索引,以供以后查询和检索;对于专注的爬虫,这个过程中得到的分析结果还是可以对后续的爬虫过程给出反馈和指导的。
与一般的网络爬虫相比,聚焦爬虫还需要解决三个主要问题:
(1) 爬取目标的描述或定义;
(2) 对网页或数据的分析和过滤;
(3) URL 搜索策略。
2、爬取的原理
2.1 网络爬虫原理
网络爬虫系统的作用是下载网页数据,为搜索引擎系统提供数据源。许多大型互联网搜索引擎系统被称为基于Web数据的搜索引擎系统,如谷歌和百度。这说明了网络爬虫系统在搜索引擎中的重要性。除了供用户阅读的文本信息外,网页还收录一些超链接信息。网络爬虫系统通过网页中的超链接信息不断获取网络上的其他网页。正是因为这个采集进程就像一个爬虫或蜘蛛在网络上漫游,所以被称为网络爬虫系统或网络蜘蛛系统,英文称为Spider或Crawler。
2.2 网络爬虫系统的工作原理
在网络爬虫的系统框架中,主要流程由控制器、解析器和资源库三部分组成。控制器的主要工作是为多线程中的每个爬虫线程分配工作任务。解析器的主要工作是下载网页并处理页面,主要是处理一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容。爬虫的基本工作由解析器完成。资源库用于存储下载的网页资源。一般使用Oracle数据库等大型数据库存储,并建立索引。
控制器
控制器是网络爬虫的中央控制器。主要负责根据系统传递过来的URL链接分配一个线程,然后启动线程调用爬虫对网页进行爬取。
解析器
解析器是负责网络爬虫的主要部分。它的主要任务包括:下载网页,处理网页的文本,如过滤,提取特殊的HTML标签,分析数据。
资源库
主要用于存储网页中下载的数据记录,并提供生成索引的目标源。中大型数据库产品包括:Oracle、Sql Server等。
网络爬虫系统一般会选择一些输出度(网页中超链接的数量)较高的比较重要的URL作为种子URL集合。网络爬虫系统使用这些种子集作为初始 URL 开始数据爬取。由于网页收录链接信息,因此可以通过现有网页的网址获取一些新的网址。网页之间的指向结构可以看作是一个森林。每个种子 URL 对应的网页是森林中一棵树的根节点。. 这样,网络爬虫系统就可以按照广度优先算法或深度优先算法遍历所有网页。由于深度优先搜索算法可能会导致爬虫系统陷入网站内部,不利于搜索更接近< @网站主页,采集网页一般采用广度优先搜索算法。网络爬虫系统首先将种子 URL 放入下载队列,然后简单地从队列头部取一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。然后简单地从队列的头部检索一个 URL 来下载相应的网页。获取并存储网页内容后,通过解析网页中的链接信息,可以得到一些新的URL,并将这些URL加入到下载队列中。然后取出一个URL,下载其对应的网页,然后解析,如此周而复始,直到遍历全网或满足某个条件,才会停止。
网络爬虫的基本工作流程如下:
1.先选择一部分精心挑选的种子网址;
2.将这些URL放入URL队列中进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页并保存到下载的网页库中。另外,将这些网址放入已爬取的网址队列中。
4.对爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待爬取的URL队列中,从而进入下一个循环。
2.3 爬取策略
在爬虫系统中,要爬取的URL队列是一个非常重要的部分。URL队列中要爬取的URL按什么顺序排列也是一个很重要的问题,因为它涉及到先爬哪个页面,后爬哪个页面。确定这些 URL 顺序的方法称为抓取策略。下面重点介绍几种常见的爬取策略:
2.3.1 深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,逐个跟踪每一个链接,处理完这一行后转移到下一个起始页,继续跟踪链接。我们以下图为例:
遍历的路径:AFG EHI BCD
2.3.2 广度优先遍历策略
广度优先遍历策略的基本思想是将新下载的网页中找到的链接直接插入到待爬取的URL队列的末尾。即网络爬虫会先抓取起始网页中所有链接的网页,然后选择其中一个链接的网页,继续抓取该网页中链接的所有网页。以上图为例:
遍历路径:ABCDEF GHI
2.3.3 反向链接计数策略
反向链接数是指从其他网页链接到某个网页的数量。反向链接的数量表示网页内容被他人推荐的程度。因此,很多时候搜索引擎的爬取系统都会使用这个指标来评估网页的重要性,从而决定不同网页的爬取顺序。
在真实的网络环境中,由于广告链接和作弊链接的存在,反向链接的数量不能完全坐等别人的重视。因此,搜索引擎通常会考虑一些可靠的反向链接。
2.3.4Partial PageRank 策略
Partial PageRank算法借鉴了PageRank算法的思想:对于下载的网页,连同要爬取的URL队列中的URL,组成一个网页集,计算每个页面的PageRank值,经过计算完成后,将要爬取的URL队列中的URL按照PageRank值的大小进行排列,依次爬取页面。
如果每个页面都被抓取,则重新计算 PageRank 值。一个折衷的方案是:每爬取K个页面后,重新计算PageRank值。但是,这种情况下仍然存在一个问题:对于已经从下载页面中分析出来的链接,也就是我们前面提到的未知网页部分,暂时没有PageRank值。为了解决这个问题,这些页面会被赋予一个临时的PageRank值:将所有传入该页面链中的PageRank值聚合起来,从而形成未知页面的PageRank值,从而参与排名。以下示例说明:
2.3.5OPIC 策略
该算法实际上对页面的重要性进行评分。在算法开始之前,给所有页面相同的初始现金(cash)。下载某个页面P后,将P的现金分配给所有从P解析的链接,清空P的现金。待抓取的 URL 队列中的所有页面均按照现金的数量进行排序。
2.3.六大站优先策略
URL队列中所有要爬取的网页,按照所属的网站进行分类。网站需要下载的页面较多,优先下载。这种策略因此被称为大站优先策略。
3、 爬虫分类
我应该选择 Nutch、Crawler4j、WebMagic、scrapy、WebCollector 还是其他来开发网络爬虫?上面提到的爬虫基本上可以分为三类:
(1)分布式爬虫:Nutch
(2)JAVA 爬虫:Crawler4j、WebMagic、WebCollector
(3)非JAVA爬虫:scrapy(基于Python语言开发)
3.1 个分布式爬虫
爬虫采用分布式,主要解决两个问题:
1)海量网址管理
2)网速
最流行的分布式爬虫是 Apache 的 Nutch。但是对于大多数用户来说,Nutch 是这些类型的爬虫中最糟糕的选择,原因如下:
1)Nutch 是一款专为搜索引擎设计的爬虫。大多数用户需要一个爬虫来进行准确的数据爬取(精细提取)。Nutch 运行的一组进程中有三分之二是为搜索引擎设计的。精细提取没有多大意义。换句话说,使用 Nutch 进行数据提取会在不必要的计算上浪费大量时间。而如果你试图通过二次开发,让Nutch适合精炼业务,你基本上会破坏Nutch的框架,将Nutch改得面目全非,并有能力修改Nutch。自己写一个新的确实更好。分布式爬虫框架。
2)Nutch 依赖于hadoop 来运行,而hadoop 本身也消耗了大量的时间。如果集群机器数量少,爬取速度不如单机爬虫快。
3) 虽然Nutch有一套插件机制,但也被宣传为一个亮点。可以看到一些开源的Nutch插件,提供精细的提取功能。但是任何开发过 Nutch 插件的人都知道 Nutch 的插件系统有多烂。使用反射机制加载和调用插件使得编写和调试程序变得极其困难,更不用说在其上开发复杂的精细提取系统了。并且Nutch没有提供相应的插件挂载点进行精细提取。Nutch的插件只有五六个挂载点,而这五六个挂载点是为搜索引擎服务的,不提供精细提取的挂载点。Nutch的大部分精提取插件都挂载在挂载点“解析器”(parser)上,
4)使用Nutch进行爬虫的二次开发,爬虫的准备和调试所需的时间往往是单机爬虫的十倍以上。学习Nutch源代码的成本非常高,更何况一个团队中的每个人都必须了解Nutch源代码。在调试过程中,会出现程序本身以外的各种问题(hadoop问题、hbase问题)。
5) 很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等,其实很多人理解错了。这里所说的持久化数据是指在avro、hbase、mysql中存储URL信息(URL管理所需的数据)。这不是您要提取的结构化数据。事实上,对于大多数人来说,URL 信息存在于何处并不重要。
6)Nutch2的版本目前不适合开发。Nutch官方稳定版是nutch2.2.1,但是这个版本绑定了gora-0.3。如果你想和nutch一起使用hbase(大多数人使用nutch2只是为了使用hbase),你只能在0.90版本左右使用hbase,因此你必须将hadoop版本减少到hadoop 0.2或所以。而且,Nutch2的官方教程更具有误导性。Nutch2有两个教程,分别是Nutch1.x和Nutch2.x。Nutch2.x 官网可以支持转到hbase 0.94。但其实这个Nutch2.x指的是Nutch2.3之前和Nutch2.2.1之后的版本。此版本在官方SVN中不断更新。
所以,如果你不是搜索引擎,尽量不要选择Nutch作为爬虫。有些团队喜欢效仿。他们之所以坚持选择Nutch开发集约化提取的爬虫,其实是因为Nutch的名气(Nutch的作者是Doug Cutting)。当然,最终的结果往往是项目被推迟。
如果你是一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与 solr 或 es 合作组成了一个非常强大的搜索引擎。如果非要使用Nutch2,建议等到Nutch2.3发布。当前的 Nutch2 是一个非常不稳定的版本。
分布式爬虫平台架构图
3.2 JAVA爬虫
这里将JAVA爬虫单独划分为一个类别,因为JAVA在网络爬虫的生态系统中是非常完备的。相关资料也是最全的。这里可能有争议,我只是随便说说。
其实开源网络爬虫(框架)的开发非常简单,难点复杂的问题(比如DOM树解析定位、字符集检测、海量URL去重)都已经被前人解决了,可以说没有技术含量。包括Nutch,其实Nutch的技术难点就是开发hadoop,代码本身也很简单。从某种意义上说,网络爬虫类似于遍历机器上的文件以查找文件中的信息。没有任何困难。之所以选择开源爬虫框架,是为了省事。比如爬虫URL管理、线程池等模块任何人都可以做,但是需要一段时间的调试和修改才能稳定下来。
用于爬虫的功能。用户比较关心的问题往往是:
1) 爬虫是否支持多线程,爬虫能不能用agent,能不能抓取重复数据,能不能抓取JS生成的信息?
那些不支持多线程、代理、过滤重复URL的不叫开源爬虫,叫循环执行http请求。
js生成的信息能否被爬取与爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。爬取js产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit、selenium)来完成。这些模拟浏览器通常需要花费大量时间来处理页面。所以一种策略是利用这些爬虫来遍历网站,当遇到需要解析的页面时,将页面的相关信息提交给模拟浏览器,完成对JS生成信息的提取。
2)爬虫可以爬取ajax信息吗?
网页上有一些异步加载的数据。爬取这个数据有两种方式:使用模拟浏览器(问题1中描述),或者分析ajax http请求,自己生成ajax请求url,获取返回数据。如果您自己生成 Ajax 请求,那么使用开源爬虫有什么意义呢?其实还是需要用到开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来抓取这些请求?
爬虫通常被设计成广度遍历或深度遍历的模式来遍历静态或动态页面。爬取ajax信息属于深网(deep web)的范畴,虽然大部分爬虫不直接支持。但它也可以通过某些方式完成。例如,WebCollector 使用广度遍历来遍历网站。第一轮爬取是爬取种子集(seeds)中的所有URL。简单的说,就是将生成的ajax请求作为种子,放入爬虫中。使用爬虫遍历这些深度为1的种子(默认为广度遍历)。
3)爬虫如何爬取网站登录?
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是基于cookies。至于如何获取cookie,就不是爬虫的事情了。您可以手动获取cookies,也可以模拟http请求登录,也可以使用模拟浏览器自动登录获取cookies。
4)爬虫如何从网页中提取信息?
开源爬虫一般都集成了网页提取工具。主要支持两种规范:CSS SELECTOR 和 XPATH。至于哪个更好,这里就不评价了。
5)爬虫是如何保存网页信息的?
一些爬虫带有一个负责持久化的模块。例如,webmagic 有一个叫做管道的模块。通过简单的配置,爬虫提取的信息可以持久化到文件、数据库等中,也有一些爬虫不直接为用户提供数据持久化模块。如 crawler4j 和 webcollector。让用户在网页处理模块中添加提交数据库的操作。至于使用pipeline模块好不好,类似于是否使用ORM来操作数据库的问题,看你的业务了。
6)爬虫被网站屏蔽了,怎么办?
爬虫已经被网站拦截了,通常可以通过多个代理(随机代理)解决。但是,这些开源爬虫一般不直接支持随机代理的切换。因此,用户经常需要将获取到的代理放入一个全局数组中,自己编写代码来随机获取代理(从数组中)。
7)网页可以调用爬虫吗?
爬虫的调用是在Web的服务器端调用的,你可以照常使用。这些爬虫都可以使用。
8)爬行速度怎么样?
一个单机的开源爬虫的速度基本可以用到机器网速的极限。爬虫速度慢,往往是因为用户线程少,网速慢,或者持久化数据时与数据库交互速度慢。而这些东西往往是由用户的机器和二次开发代码决定的。这些开源爬虫的速度非常好。
9)显然代码写对了,爬不出来数据。是不是爬虫有问题?别的爬虫能解决吗?
如果代码写对了,数据爬不出来,其他爬虫也是一样。在这种情况下,要么 网站 阻止了您,要么您抓取的数据是由 javascript 生成的。无法通过更换爬虫来解决抓取数据失败的问题。
10)哪个爬虫可以判断网站是否爬完了,哪个爬虫可以根据主题爬取?
爬虫无法判断网站是否已经爬过,只能尽量覆盖。
至于基于主题的爬取,爬虫只有向下爬取内容才知道主题是什么。所以它通常是从整体上爬下来,然后去过滤内容。如果觉得抓取过于笼统,可以通过限制网址规律等方法缩小范围。
11) 哪个爬虫有更好的设计模式和结构?
设计模式纯属无稽之谈。当软件设计模式好的时候,开发软件,然后总结出几种设计模式。设计模式对软件开发没有指导作用。使用设计模式来设计爬虫只会让爬虫的设计更加臃肿。
在架构上,开源爬虫目前主要是详细数据结构的设计,比如爬取线程池、任务队列等,大家都可以控制。爬虫的业务太简单了,不谈结构。
所以对于JAVA开源爬虫,我想,找一个好用的就好了。如果业务复杂,使用哪种爬虫就必须经过复杂的二次开发才能满足需求。
3.3 个非 Java 爬虫
在非JAVA语言编写的爬虫中,有很多优秀的爬虫。这里单独提取为一个类别,不是针对爬虫本身的质量,而是针对larbin、scrapy等爬虫对开发成本的影响。
先说python爬虫,python可以用30行代码完成JAVA 50行代码的任务。Python 代码编写确实很快,但是在调试代码阶段,Python 代码的调试往往比编码阶段节省的时间消耗的时间要多得多。使用python开发,为了保证程序的正确性和稳定性,需要编写更多的测试模块。当然,如果爬取规模不大,爬取业务不复杂,使用scrapy也是相当不错的,可以轻松完成爬取任务。
上图是Scrapy的架构图。绿线是数据流。首先,从初始 URL 开始,Scheduler 将其交给 Downloader 进行下载。下载完成后,会交给Spider进行分析。需要保存的数据会被发送到Item Pipeline。,即对数据进行后处理。此外,可以在数据流通道中安装各种中间件来进行必要的处理。所以在开发爬虫的时候,最好先规划好各个模块。我的做法是分别规划下载模块、爬取模块、调度模块、数据存储模块。
对于C++爬虫来说,学习成本会比较大。而且你不能只计算一个人的学习成本。如果软件需要团队开发或交接,那将是很多人的学习成本。软件调试并不是那么容易。
还有一些ruby、php爬虫,这里不多评论。确实有一些非常小的数据采集任务,用ruby或者php非常方便。但是要选择这些语言的开源爬虫,一方面需要调查相关的生态系统,另一方面,这些开源爬虫可能会产生一些你找不到的bug(人少信息少)
4、反爬虫技术
由于搜索引擎的流行,网络爬虫已经成为一种非常流行的网络技术。除了专门从事搜索的谷歌、雅虎、微软和百度,几乎每个大型门户网站网站都有自己大大小小的搜索引擎。可以叫出的名字有几十个,不知道的名字也有上万个。对于一个内容驱动的网站来说,难免会被网络爬虫光顾。
网站上一些智能搜索引擎爬虫的爬取频率比较合理,消耗的资源比较少。但是,很多不良的网络爬虫对网页的爬取能力较差,经常会发送几十甚至上百个请求,重复爬取循环。拿,这种爬虫往往对中小网站是毁灭性的打击,尤其是缺乏爬虫编写经验的程序员写的爬虫,破坏力极强,网站的访问压力会非常大。, 会导致网站 访问缓慢甚至无法访问。
一般来说,网站从三个方面进行反爬虫:用户请求的Headers、用户行为、网站目录和数据加载方式。前两个比较容易遇到,从这些角度来看,大多数网站都是反爬虫。将采用第三类ajax应用网站,增加爬虫难度。
4.1 个通过 Headers 的反爬虫
从用户请求的Headers反爬取是最常见的反爬取策略。很多网站会检测Headers的User-Agent,有的网站会检测Referer(部分资源网站的防盗就是检测Referer)。如果遇到这种反爬虫机制,可以直接给爬虫添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者修改Referer值为目标网站域名【注:经常容易被Ignore,通过对请求的抓包分析确定referer,将其添加到模拟访问的请求头中该程序]。对于检测header的反爬虫,在爬虫中修改或添加header很容易绕过。
4.2 基于用户行为的反爬虫
网站的另一部分是检测用户行为,比如在短时间内从同一个IP多次访问同一个页面,或者在短时间内在同一个账号内多次执行相同的操作. 【这种反爬需要足够的ip来应对】
大部分网站都是前一种情况。在这种情况下,使用IP代理可以解决。可以专门写一个爬虫来爬取网上公开的代理ip,检测后全部保存。这类代理ip爬虫经常用到,最好自己准备一个。代理IP数量较多后,可以每隔几次请求换一个IP。这在requests或urllib2中很容易做到,这样你就可以轻松绕过第一个反爬虫。【点评:动态拨号也是一种解决方案】
在第二种情况下,您可以在每次请求后以几秒钟的随机间隔发出下一个请求。一些存在逻辑漏洞的网站可以通过多次请求、注销、重新登录、继续请求来绕过同一账号不能在短时间内多次发出相同请求的限制。【评论:账号的反爬限制一般很难处理,几秒的随机请求也可能被屏蔽。如果有多个账号,在它们之间切换会有更好的效果】
4.3 动态页面反爬虫
以上情况大部分出现在静态页面上,还有一些网站,我们需要爬取的数据是通过ajax请求获取的,或者通过Java生成的。首先使用Firebug或者HttpFox来分析网络请求【点评:感觉google和IE的网络请求分析也很好】。如果能找到ajax请求,分析出响应的具体参数和具体含义,就可以通过上面的方法直接使用requests或者urllib2来模拟ajax请求,分析响应json得到需要的数据。
能够直接模拟ajax请求获取数据是很棒的,但是有的网站加密了ajax请求的所有参数。我们没有办法为我们需要的数据构造一个请求。这几天爬的网站就是这样的。除了对ajax参数进行加密外,还封装了一些基础功能,都是调用自己的接口,对接口参数进行加密。遇到这样的网站,就不能用上面的方法了。我使用selenium+phantomJS框架,调用浏览器内核,使用phantomJS执行js模拟人的操作,触发页面中的js脚本。从填表到点击按钮再到滚动页面,一切都可以模拟,不管具体的请求和响应过程,只是一个完整的模拟人们浏览页面获取数据的过程。【评论:支持phantomJS】
使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面是在一定程度上通过添加Headers来冒充浏览器),它是浏览器本身,phantomJS是一个没有界面的浏览器,但控制浏览器的不是人。使用selenium+phantomJS可以做很多事情,比如识别point-and-touch(12306)或滑动验证码,页面表单的暴力破解等)。它还将在自动化渗透方面大显身手,未来也会如此。提这个。
htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-19 11:08
)
最近在做一个项目,扫描营业执照二维码得到一个网址链接。链接重定向后,将进入企业信息公示页面。您需要通过此链接获取所需信息(公司名称、法人、信用代码等)。
我在网上查了很多,找到了很多方法,但是都爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,我们只获取静态信息等等。所以并不是所有的方法都可行。
最后的解决方案是:WebClient模拟浏览器客户端,设置JS动态加载on(必须的,主要针对那些JS,Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用Jsoup清理数据,得到我们需要的内容。值得一提的是
Jsoup 的用法和 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以通过这两种方法获取。我们在谷歌浏览器中使用F12打开开发调试工具。使用定位功能定位我们需要的数据的位置,并查看标签的id。这个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;
} 查看全部
htmlunit抓取动态网页(链接跳转后会进入企业信息公示页面,需要的内容
)
最近在做一个项目,扫描营业执照二维码得到一个网址链接。链接重定向后,将进入企业信息公示页面。您需要通过此链接获取所需信息(公司名称、法人、信用代码等)。
我在网上查了很多,找到了很多方法,但是都爬不出来。一般报521错误,没有跨域,网页使用JS动态加载,我们只获取静态信息等等。所以并不是所有的方法都可行。
最后的解决方案是:WebClient模拟浏览器客户端,设置JS动态加载on(必须的,主要针对那些JS,Ajax动态加载的数据),然后使用HtmlPage类来接受网页。使用Jsoup清理数据,得到我们需要的内容。值得一提的是
Jsoup 的用法和 JS 非常相似。doc.getElementById("id") 和 doc.getElementsByTag(tagName) 一般可以通过这两种方法获取。我们在谷歌浏览器中使用F12打开开发调试工具。使用定位功能定位我们需要的数据的位置,并查看标签的id。这个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;
}
htmlunit抓取动态网页(爬取苏宁酷开电视价格代码如下:(导入jsoup包) )
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-17 05:02
)
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析一下AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并且
模拟是一个比较困难的过程,需要比较多的分析经验
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,非常不利于后期项目部署到浏览器!所以推荐第一种方法,代码也是第一种方法。
爬取苏宁酷开电视的价格代码如下:
(导入jsoup包就不多说了,自己百度吧!)
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document
document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text()); 查看全部
htmlunit抓取动态网页(爬取苏宁酷开电视价格代码如下:(导入jsoup包)
)
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析一下AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并且
模拟是一个比较困难的过程,需要比较多的分析经验
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,非常不利于后期项目部署到浏览器!所以推荐第一种方法,代码也是第一种方法。
爬取苏宁酷开电视的价格代码如下:
(导入jsoup包就不多说了,自己百度吧!)
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document
document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
htmlunit抓取动态网页(HtmlUnit动态执行js函数繁体2017年03月11-功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2021-12-17 05:01
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
js 在执行另一个函数之前先执行一个函数
2017-05-17-一、 第一种情况:执行完运动函数后执行另一个函数。注意:点击按钮后,先显示div,然后宽高增加到300px。点击我
人类灵魂之地
HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题
2013 年 10 月 17 日 - 我目前正在研究爬虫。作为新手。研究了一些爬虫框架,发现有很多功能齐全的开源爬虫框架,但是很遗憾,我还没有发现爬虫对js有完美的解释和执行。看了关于网络爬虫爬js动态加载网页的内容(二),很感慨。首先很佩服博主季刊的钻研精神。虽然这篇文章的第二个和第三个方案都不是很靠谱,我能想到。这些程序说明
如何让htmlunit在执行javascript时不下载整个页面,而只返回url
2012.03.17-htmlunit介绍:htmlunit是一个开源的java页面分析工具。启动 htmlunit 后,底层会启动一个无界面的浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:WebCl
后台执行js先执行前端js函数,再执行后台函数的按钮。
2011.03.28-结合对__doPostBack()的分析,我做了一个实验,达到使用客户端的输入按钮按钮先触发前台JS功能,再执行后台操作的目的。1、第一种实现方法: 查看全部
htmlunit抓取动态网页(HtmlUnit动态执行js函数繁体2017年03月11-功能)
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
HtmlUnit动态执行js函数
2017年3月11日-功能:动态指定js函数,其实这个效果不是很好用,这里只是记录一下,参考代码如下: package com;import com.gargoylesoftware.htmlunit.BrowserVersion;import com .gargoylesoftware.ht
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路: 所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
使用htmlunit和jsoup实现抓取js动态网页的实践(执行js)
2015 年 12 月 6 日-更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。爬取思路:所谓动态,就是可以通过请求后台动态改变对应的html页面,页面一开始不全显示。大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。于是转换了爬取动态网页的思路
htmlunit js执行后抓取网页源码
2016年11月01日-我上次不是写了自动博客访问(点击打开链接),但昨晚再次运行时,发现无法使用。. 运行了几次,发现使用URLConnection得到的网页源码和浏览器直接看到的不一样。URLConnection 使用 IO 流读取的源代码只有点,没有流量。使用浏览器直接查看源码并有权限
HtmlUnit爬取动态数据(js相关)
2017年5月15日-今天写爬虫的时候遇到一个问题,就是用Jsoup获取html的时候,只能解析静态页面,只要不能爬取页面中js相关的动态数据,搜索后网上查了一些资料,发现可以用htmlunit来解决这个问题。参考资料:
[Jsoup]使用HtmlUnit + Jsoup解析js动态生成的繁体中文网页
2018.01.12-版权所有:bluetata 本文地址:使用Jsoup时请注明出处/作者,将无法解析javascript动态生成的h
jsoup+htmlUnit 可以抓取执行过js的html页面
2018年10月26-1日:后台本来想用jsoup抓取一个页面但是抓取的数据总是不完整,然后发现页面执行了js后在页面上渲染了一些数据,这意味着它只是被执行完js后数据会显示在数据页上,但是jsoup无法实现执行页的js。2:解决后搜索,发现htmlunit网络工具可以执行js,他是一个
js以函数名作为参数动态执行函数
2017 年 9 月 1 日-function myFunc(){console.log(11111);}test("myFunc");function test(funcName){if(typeof(eval(funcN)
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是对应的html标签已经显示在ajax页面中了,只是添加了js
ajax回调函数动态加载的标签中的js事件不执行。
2017年7月26日-原因:我使用ajax动态添加HTML标签,并为添加的标签添加js点击事件。目前我使用的jquery是1.8.3版本,我使用的方法是$(".aa").click(function(){}); 方法,但是ajax页面中已经显示了对应的html标签,只是添加了js点击
js 在执行另一个函数之前先执行一个函数
2017-05-17-一、 第一种情况:执行完运动函数后执行另一个函数。注意:点击按钮后,先显示div,然后宽高增加到300px。点击我
人类灵魂之地
HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题
2013 年 10 月 17 日 - 我目前正在研究爬虫。作为新手。研究了一些爬虫框架,发现有很多功能齐全的开源爬虫框架,但是很遗憾,我还没有发现爬虫对js有完美的解释和执行。看了关于网络爬虫爬js动态加载网页的内容(二),很感慨。首先很佩服博主季刊的钻研精神。虽然这篇文章的第二个和第三个方案都不是很靠谱,我能想到。这些程序说明
如何让htmlunit在执行javascript时不下载整个页面,而只返回url
2012.03.17-htmlunit介绍:htmlunit是一个开源的java页面分析工具。启动 htmlunit 后,底层会启动一个无界面的浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:WebCl
后台执行js先执行前端js函数,再执行后台函数的按钮。
2011.03.28-结合对__doPostBack()的分析,我做了一个实验,达到使用客户端的输入按钮按钮先触发前台JS功能,再执行后台操作的目的。1、第一种实现方法:
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-12-17 04:37
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取到的HTML文件不收录某段代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
} 查看全部
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取到的HTML文件不收录某段代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
}
htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-15 11:13
一般我们使用Java提供的HttpURLConnection或者Apache的HttpClient的网页源码是直观可见的,浏览器右键->点击查看源码,代码内容与网页内容一致网页的代码。html
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient在后端只返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于 Js 生成的内容 HttpClient 是不可用的。爪哇
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终获取对应的内容,获取的内容与浏览器的内容一致右键网页->点击check/视图元素。网络
我们这里讲的模拟方法大概有两种:windows
抓取目标
我们这次的目标是获取bilibili动态生成的动画列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。经过比较,我们可以看到目标列表是由Js生成的。
后端
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里主要是用来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。浏览器
Selenium 支持模拟很多浏览器,但这里我们只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。因为它没有接口,所以速度表现会更好。服务器
1.下载
使用PhantomJS需要到官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zipmaven
2.maven 依赖介绍:ide
org.seleniumhq.selenium
selenium-java
2.53.0
com.codeborne
phantomjsdriver
1.2.1
org.seleniumhq.selenium
selenium-remote-driver
org.seleniumhq.selenium
selenium-java
3.示例代码工具
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.ArrayList;
/**
* @author GinPonson
*/
public class TestSelenium {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args){
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
//设置代理或者其余参数
ArrayList cliArgsCap = new ArrayList();
//cliArgsCap.add("--proxy=http://"+HOST+":"+PORT);
//cliArgsCap.add("--proxy-auth=" + USER + ":" + PWD);
//cliArgsCap.add("--proxy-type=http");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
//capabilities.setCapability("phantomjs.page.settings.userAgent", "");
WebDriver driver = new PhantomJSDriver(capabilities);
driver.get("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(driver.getPageSource());
driver.quit();
}
}
4.其他功能
使用 HtmlUnit 获取页面
HtmlUnit 在功能上是 Selenium 的子集,Selenium 有相应的 HtmlUnit 实现。HtmlUnit 是一个用 Java 编写的无界面浏览器。因为没有接口,所以执行速度还是可以的。
1.maven 依赖介绍
2.Java 代码
/**
* @author GinPonson
*/
public class TestHtmlUnit {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args) throws Exception{
WebClient webClient = new WebClient();
//设置代理
//ProxyConfig proxyConfig = webClient.getOptions().getProxyConfig();
//proxyConfig.setProxyHost(HOST);
//proxyConfig.setProxyPort(Integer.valueOf(PORT));
//DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
//credentialsProvider.addCredentials(USER, PWD);
//设置参数
//webClient.getOptions().setCssEnabled(false);
//webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。页面渲染功能完善,具有浏览器截图功能,可以模拟登录操作。HtmlUnit使用Rhino引擎解析Js,有时候解析速度很慢,就像上面的例子,需要很长时间,但是HtmlUnit可以拿到页面,解析一组元素(虽然用Jsoup还是不错的解析元素),是一个不错的工具。
HtmlUnit遇到错误后,处理有7分钟的差异,大部分不知道怎么用QAQ
欢迎补充:) 查看全部
htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
一般我们使用Java提供的HttpURLConnection或者Apache的HttpClient的网页源码是直观可见的,浏览器右键->点击查看源码,代码内容与网页内容一致网页的代码。html
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient在后端只返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于 Js 生成的内容 HttpClient 是不可用的。爪哇
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终获取对应的内容,获取的内容与浏览器的内容一致右键网页->点击check/视图元素。网络
我们这里讲的模拟方法大概有两种:windows
抓取目标
我们这次的目标是获取bilibili动态生成的动画列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。经过比较,我们可以看到目标列表是由Js生成的。

后端
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里主要是用来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。浏览器
Selenium 支持模拟很多浏览器,但这里我们只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。因为它没有接口,所以速度表现会更好。服务器
1.下载
使用PhantomJS需要到官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zipmaven
2.maven 依赖介绍:ide
org.seleniumhq.selenium
selenium-java
2.53.0
com.codeborne
phantomjsdriver
1.2.1
org.seleniumhq.selenium
selenium-remote-driver
org.seleniumhq.selenium
selenium-java
3.示例代码工具
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.ArrayList;
/**
* @author GinPonson
*/
public class TestSelenium {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args){
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
//设置代理或者其余参数
ArrayList cliArgsCap = new ArrayList();
//cliArgsCap.add("--proxy=http://"+HOST+":"+PORT);
//cliArgsCap.add("--proxy-auth=" + USER + ":" + PWD);
//cliArgsCap.add("--proxy-type=http");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
//capabilities.setCapability("phantomjs.page.settings.userAgent", "");
WebDriver driver = new PhantomJSDriver(capabilities);
driver.get("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(driver.getPageSource());
driver.quit();
}
}
4.其他功能
使用 HtmlUnit 获取页面
HtmlUnit 在功能上是 Selenium 的子集,Selenium 有相应的 HtmlUnit 实现。HtmlUnit 是一个用 Java 编写的无界面浏览器。因为没有接口,所以执行速度还是可以的。
1.maven 依赖介绍
2.Java 代码
/**
* @author GinPonson
*/
public class TestHtmlUnit {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args) throws Exception{
WebClient webClient = new WebClient();
//设置代理
//ProxyConfig proxyConfig = webClient.getOptions().getProxyConfig();
//proxyConfig.setProxyHost(HOST);
//proxyConfig.setProxyPort(Integer.valueOf(PORT));
//DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
//credentialsProvider.addCredentials(USER, PWD);
//设置参数
//webClient.getOptions().setCssEnabled(false);
//webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.bilibili.com/video/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。页面渲染功能完善,具有浏览器截图功能,可以模拟登录操作。HtmlUnit使用Rhino引擎解析Js,有时候解析速度很慢,就像上面的例子,需要很长时间,但是HtmlUnit可以拿到页面,解析一组元素(虽然用Jsoup还是不错的解析元素),是一个不错的工具。
HtmlUnit遇到错误后,处理有7分钟的差异,大部分不知道怎么用QAQ

欢迎补充:)
htmlunit抓取动态网页(极简工具X一站式开发,七大领域400页场景化应用构建最佳宝典(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-14 00:02
极简工具X一站式开发,7个领域400页场景化应用打造最佳合集,点击获取>>>
最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。这真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取。不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
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就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。 查看全部
htmlunit抓取动态网页(极简工具X一站式开发,七大领域400页场景化应用构建最佳宝典(图))
极简工具X一站式开发,7个领域400页场景化应用打造最佳合集,点击获取>>>

最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。

以下是对WebDriver的投诉
WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。这真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取。不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码

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就好说了 }

这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。
htmlunit抓取动态网页(SC@SDUSC简述一下Gecco框架线程和队列模型#)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-13 15:06
2021SC@SDUSC
简述Gecco爬虫框架的线程和队列模型
##为什么使用这个模型
##如何动态获取初始请求队列如果想通过多线程提高爬虫的效率,就需要想办法把请求放入初始请求队列。我们可以先通过爬虫引擎保存要爬取的请求。另一个爬虫引擎将第一个爬虫引擎获取到的请求作为初始请求启动多线程操作。简单的说,初始请求也可以抓取,不需要硬编码。下面是jd使用多线程捕获的一段代码
//先获取分类列表,放入AllSortPipeline.sortRequests
HttpGetRequest start = new HttpGetRequest("http://www.jd.com/allSort.aspx");
start.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
.start(start)
.run();
//分类列表下的商品列表采用3线程抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
//从上面的GeccoEngine获取初始请求
.start(AllSortPipeline.sortRequests)
.thread(5)
.interval(2000)
.start();
这是爬虫框架的线程和队列的一些基本内容。 查看全部
htmlunit抓取动态网页(SC@SDUSC简述一下Gecco框架线程和队列模型#)
2021SC@SDUSC
简述Gecco爬虫框架的线程和队列模型
##为什么使用这个模型
##如何动态获取初始请求队列如果想通过多线程提高爬虫的效率,就需要想办法把请求放入初始请求队列。我们可以先通过爬虫引擎保存要爬取的请求。另一个爬虫引擎将第一个爬虫引擎获取到的请求作为初始请求启动多线程操作。简单的说,初始请求也可以抓取,不需要硬编码。下面是jd使用多线程捕获的一段代码
//先获取分类列表,放入AllSortPipeline.sortRequests
HttpGetRequest start = new HttpGetRequest("http://www.jd.com/allSort.aspx");
start.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
.start(start)
.run();
//分类列表下的商品列表采用3线程抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo.jd")
//从上面的GeccoEngine获取初始请求
.start(AllSortPipeline.sortRequests)
.thread(5)
.interval(2000)
.start();
这是爬虫框架的线程和队列的一些基本内容。
htmlunit抓取动态网页(通过JAVA的API可以顺利的抓取网络上的大部分指定的网页内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-11 04:19
通过JAVA API,可以流畅的抓取互联网上大部分指定的网页内容。下面我就和大家分享一下这个方法的理解和体会。最简单的爬取方法是:
URL url = 新 URL(myurl);
BufferedReader br = newBufferedReader(newInputStreamReader(url.openStream()));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
我++;
sb.append(s+"\r\n");
}
这种方法抓取一般网页应该没有问题,但是当某些网页中存在嵌套重定向连接时,会报Serverredirected too manytimes之类的错误。这是因为这个网页里面有一些代码会重定向到其他 For 网页,循环过多导致程序错误。如果只想抓取这个URL中网页的内容,又不想被重定向到其他网页,可以使用下面的代码。
URL urlmy = 新 URL(myurl);
HttpURLConnection con = (HttpURLConnection)urlmy.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(false);
连接();
BufferedReader br = newBufferedReader(newInputStreamReader(con.getInputStream(),"UTF-8"));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s+"\r\n");
}
在这种情况下,程序在爬取时不会跳转到其他页面去抓取其他内容,达到了我们的目的。
如果我们在内部网上,我们需要向它添加一个代理。Java 为具有特殊系统属性的代理服务器提供支持。只需在上述程序中添加以下程序即可。
System.getProperties().setProperty("http.proxyHost", proxyName );
System.getProperties().setProperty("http.proxyPort",port);
这样,你就可以在内网中,从网上抓取你想要的东西。
上面程序检索到的所有内容都存储在字符串sb中,我们可以通过正则表达式进行分析,提取出我们想要的具体内容,供我使用,呵呵,这多好啊 一件事!! 查看全部
htmlunit抓取动态网页(通过JAVA的API可以顺利的抓取网络上的大部分指定的网页内容)
通过JAVA API,可以流畅的抓取互联网上大部分指定的网页内容。下面我就和大家分享一下这个方法的理解和体会。最简单的爬取方法是:
URL url = 新 URL(myurl);
BufferedReader br = newBufferedReader(newInputStreamReader(url.openStream()));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
我++;
sb.append(s+"\r\n");
}
这种方法抓取一般网页应该没有问题,但是当某些网页中存在嵌套重定向连接时,会报Serverredirected too manytimes之类的错误。这是因为这个网页里面有一些代码会重定向到其他 For 网页,循环过多导致程序错误。如果只想抓取这个URL中网页的内容,又不想被重定向到其他网页,可以使用下面的代码。
URL urlmy = 新 URL(myurl);
HttpURLConnection con = (HttpURLConnection)urlmy.openConnection();
con.setFollowRedirects(true);
con.setInstanceFollowRedirects(false);
连接();
BufferedReader br = newBufferedReader(newInputStreamReader(con.getInputStream(),"UTF-8"));
字符串 s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s+"\r\n");
}
在这种情况下,程序在爬取时不会跳转到其他页面去抓取其他内容,达到了我们的目的。
如果我们在内部网上,我们需要向它添加一个代理。Java 为具有特殊系统属性的代理服务器提供支持。只需在上述程序中添加以下程序即可。
System.getProperties().setProperty("http.proxyHost", proxyName );
System.getProperties().setProperty("http.proxyPort",port);
这样,你就可以在内网中,从网上抓取你想要的东西。
上面程序检索到的所有内容都存储在字符串sb中,我们可以通过正则表达式进行分析,提取出我们想要的具体内容,供我使用,呵呵,这多好啊 一件事!!
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-12-08 21:10
)
在抓取网页数据的时候,传统的jsoup方案只能对静态页面有效,而且有些网页数据往往是js生成的,所以这个时候就需要其他的方案了。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标URL的通用性比较麻烦。
第二个想法,也是更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
因为htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:。
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本即可。
程序运行前必须确定驱动位置,如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
} 查看全部
htmlunit抓取动态网页(Java环境下的一下配置实现思路介绍-苏州安嘉
)
在抓取网页数据的时候,传统的jsoup方案只能对静态页面有效,而且有些网页数据往往是js生成的,所以这个时候就需要其他的方案了。
第一个思路是分析js程序,重新获取js请求。这适用于特定的页面获取。实现不同目标URL的通用性比较麻烦。
第二个想法,也是更成熟的方法,是使用第三方驱动程序来呈现页面,然后下载它。下面是第二种实现思路。
Selenium 是一种模拟浏览器的自动化测试工具。它提供了一组 API 来与真正的浏览器内核进行交互。
Java环境中的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver、FirefoxDriver、ChromeDriver、HtmlUnitDriver。
htmlUnit 也是自动化测试的工具。您可以使用 HtmlUnit 来模拟浏览器操作并获取执行的 html 页面。其中HtmlUnitDriver是对htmlUnit的封装。
因为htmlunit对js解析的支持有限,所以在实际项目中并不常用。
以chrome为例下载对应的驱动:。
下载驱动时需要注意与selenium版本的兼容性。可能会出现异常情况。一般下载最新版本即可。
程序运行前必须确定驱动位置,如Windows下
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/2 ... 6quot;);
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}
htmlunit抓取动态网页(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-12-08 21:09
前言
曾几何时,动态页面的信息提取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以算是解析动态页面的神器了,但是还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面就不行了。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要实现浏览器级别的效果,必须基于浏览器内核进行开发。好在我们有开源的webkit,更幸运的是我们有QtWebkit,对开发者更加友好。
SeimiAgent 简介
SeimiAgent 是基于 QtWebkit 开发的可以在服务器端后台运行的 webkit 服务。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
使用演示
SeimiCrawler 简介
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬取的业务逻辑,剩下的 Seimi 会帮你处理。在设计方面,SeimiCrawler 极大地受到了 Python 的爬虫框架 Scrapy 的启发,它结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以 SeimiCrawler 默认到HTML解析解析器是JsoupXpath(独立的扩展项目,不收录在jsoup中),
集成和部署 SeimiAgent
下载和解压就不显示了,上面的动态图片里也有演示,下载地址可以在SeimiAgent主页上找到。进入SeimiAgent的bin目录,执行:
./SeimiAgent -p 8000
这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
SeimiCrawler 配置
SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。我们直接在评论中解释最后一个完整的例子:
package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件seimi.properties
seimiAgentHost=127.0.0.1
seimiAgentPort=8000
启动
public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
完整演示地址
演示 查看全部
htmlunit抓取动态网页(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
前言
曾几何时,动态页面的信息提取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以算是解析动态页面的神器了,但是还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面就不行了。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要实现浏览器级别的效果,必须基于浏览器内核进行开发。好在我们有开源的webkit,更幸运的是我们有QtWebkit,对开发者更加友好。
SeimiAgent 简介
SeimiAgent 是基于 QtWebkit 开发的可以在服务器端后台运行的 webkit 服务。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
使用演示

SeimiCrawler 简介
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬取的业务逻辑,剩下的 Seimi 会帮你处理。在设计方面,SeimiCrawler 极大地受到了 Python 的爬虫框架 Scrapy 的启发,它结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以 SeimiCrawler 默认到HTML解析解析器是JsoupXpath(独立的扩展项目,不收录在jsoup中),
集成和部署 SeimiAgent
下载和解压就不显示了,上面的动态图片里也有演示,下载地址可以在SeimiAgent主页上找到。进入SeimiAgent的bin目录,执行:
./SeimiAgent -p 8000
这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
SeimiCrawler 配置
SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。我们直接在评论中解释最后一个完整的例子:
package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件seimi.properties
seimiAgentHost=127.0.0.1
seimiAgentPort=8000
启动
public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
完整演示地址
演示
htmlunit抓取动态网页(Java爬取博客阅读文章最多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-06 18:35
更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。
爬行思路:
所谓动态,就是可以通过请求后台动态改变对应的html页面,一开始页面并不是全部显示出来的。
大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
因此,爬取动态网页的思路转化为寻找对应的js代码,执行对应的js代码,从而通过java代码动态改变页面。
而当页面能够正确显示时,我们就可以像抓取静态网页一样抓取数据了!
首先可以使用htmlunit来模拟鼠标点击事件,这个很容易实现:
/**
* 通过htmlunit来获得一些搜狗的网址。
* 通过模拟鼠标点击事件来实现
* @param key
* @return
* @throws Exception
*/
public String getNextUrl(String key){
String page = new String();
try {
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
//去拿网页
HtmlPage htmlPage = webClient.getPage("http://pic.sogou.com/");
//得到表单
HtmlForm form = htmlPage.getFormByName("searchForm");
//得到提交按钮
HtmlSubmitInput button = form.getInputByValue("搜狗搜索");
//得到输入框
HtmlTextInput textField = form.getInputByName("query");
//输入内容
textField.setValueAttribute(key);
//点一下按钮
HtmlPage nextPage = button.click();
String str = nextPage.toString();
page = cutString(str);
webClient.close();
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
如上图,我通过java代码将关键字填入搜索我的,然后通过getInputByValue方法获取按钮控件,最后直接button.click(),
即可以模拟点击,点击后返回的http请求可以解析成htmlpage。
这个功能其实非常强大。例如,您可以使用此功能来模拟抢票,或使用点击事件和搜索相关知识将整个系统下线并保存在 html 中。
下一步就是使用强大的htmlunit来执行js代码了。
先写一个简单的jsp页面:
Insert title here
原数字
function change(value) {
document.getElementById("test").innerHTML = value;
return "hello htmlUnit";
}
从上面可以看出,jsp页面很简单,只是一个函数的变化,用来调用htmlUnit。
接下来是一个使用 htmlunit 的类。这个类支持 JavaScript 解释器,
然后将自己编写的JavaScript代码嵌入到页面中执行,执行后得到返回结果返回页面。
package com.blog.anla;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class TestMyOwnPage {
private void action() {
WebClient webClient = new WebClient();
try {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true); // 设置支持JavaScript。
// 去拿网页
HtmlPage htmlPage = webClient
.getPage("http://localhost:8989/testHtmlScrop/index.jsp");
String s = "更改后的数字";
ScriptResult t = htmlPage.executeJavaScript("change(\"" + s
+ "\");", "injected script", 500);
// 这里是在500行插入这一小行JavaScript代码段,因为如果在默认的1行,那不会有结果
// 因为js是顺序执行的,当你执行第一行js代码时,可能还没有渲染body里面的标签。
HtmlPage myPage = (HtmlPage) t.getNewPage();
String nextPage = myPage.asXml().toString();
String nextPage2 = myPage.asText().toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
webClient.close();
}
}
public static void main(String[] args) {
TestMyOwnPage tmop = new TestMyOwnPage();
tmop.action();
}
}
t.getNewPage() 中有两个属性,一个是
javaScriptResult:执行代码后返回的结果,如果有(如我上面写的,返回hello htmlunit),如果没有(返回Undefined)。
newPage_:执行这段代码后返回的整个页面。
结果如图:
这段代码执行的最终结果如下:
asXml():将整个页面的html代码返回给我们:
而asText()只返回页面上可以显示的值,即head标签和label标签:
这种执行思路也可以动态的执行对应的js代码,从而抓取到需要的数据。
-------------------------------------------------- -------------------------------------- 2017 年 7 月更新------- ------------------------------------------------- - ----------------------------------------------
这两天一直在研究一个关于网络爬虫的系统
但是第一次爬的时候就发现了这个问题,js的动态页面爬不下来。
网上找了很多方法,google也问了,主要是指htmlunit,下面是核心代码,
使用htmlunit的主要目的是模拟浏览器操作,因为有些链接点击无法通过src直接获取url,通常使用JavaScript
简单拼接后的URL,这样一来,相比之下,直接用htmlunit模拟浏览器点击就简单多了。
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
webClient.getOptions().setCssEnabled(false); //禁用css支持
webClient.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
webClient.getOptions().setTimeout(20000);
HtmlPage page = wc.getPage("http://www.hao123.com");
//我认为这个最重要
String pageXml = page.asXml(); //以xml的形式获取响应文本
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");
这个时候,就可以得到jsoup中的document对象了,接下来就好写了,就像爬普通静态网页一样了。
不过,webclient解析是还是会出现一些问题,js的问题,
主要是由于目标url的js写的有些问题,但在实际的浏览器中却会忽略,eclipse中会报异常。
今天看到的时候,很多人都踩了。也许他们当时没有认真写博客。如果想找java爬虫项目可以到我的专栏。
图片搜索包括使用jsoup抓取图片,lire来索引和搜索图片。
献上玫瑰手,留下余香。有什么问题可以多多讨论哦! 查看全部
htmlunit抓取动态网页(Java爬取博客阅读文章最多)
更新,这很尴尬。这个文章博客阅读量最多文章,但也被最讨厌。
爬行思路:
所谓动态,就是可以通过请求后台动态改变对应的html页面,一开始页面并不是全部显示出来的。
大多数操作都是通过请求来完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在js代码中。
因此,爬取动态网页的思路转化为寻找对应的js代码,执行对应的js代码,从而通过java代码动态改变页面。
而当页面能够正确显示时,我们就可以像抓取静态网页一样抓取数据了!
首先可以使用htmlunit来模拟鼠标点击事件,这个很容易实现:
/**
* 通过htmlunit来获得一些搜狗的网址。
* 通过模拟鼠标点击事件来实现
* @param key
* @return
* @throws Exception
*/
public String getNextUrl(String key){
String page = new String();
try {
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
//去拿网页
HtmlPage htmlPage = webClient.getPage("http://pic.sogou.com/");
//得到表单
HtmlForm form = htmlPage.getFormByName("searchForm");
//得到提交按钮
HtmlSubmitInput button = form.getInputByValue("搜狗搜索");
//得到输入框
HtmlTextInput textField = form.getInputByName("query");
//输入内容
textField.setValueAttribute(key);
//点一下按钮
HtmlPage nextPage = button.click();
String str = nextPage.toString();
page = cutString(str);
webClient.close();
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
如上图,我通过java代码将关键字填入搜索我的,然后通过getInputByValue方法获取按钮控件,最后直接button.click(),
即可以模拟点击,点击后返回的http请求可以解析成htmlpage。
这个功能其实非常强大。例如,您可以使用此功能来模拟抢票,或使用点击事件和搜索相关知识将整个系统下线并保存在 html 中。
下一步就是使用强大的htmlunit来执行js代码了。
先写一个简单的jsp页面:
Insert title here
原数字
function change(value) {
document.getElementById("test").innerHTML = value;
return "hello htmlUnit";
}
从上面可以看出,jsp页面很简单,只是一个函数的变化,用来调用htmlUnit。
接下来是一个使用 htmlunit 的类。这个类支持 JavaScript 解释器,
然后将自己编写的JavaScript代码嵌入到页面中执行,执行后得到返回结果返回页面。
package com.blog.anla;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class TestMyOwnPage {
private void action() {
WebClient webClient = new WebClient();
try {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true); // 设置支持JavaScript。
// 去拿网页
HtmlPage htmlPage = webClient
.getPage("http://localhost:8989/testHtmlScrop/index.jsp");
String s = "更改后的数字";
ScriptResult t = htmlPage.executeJavaScript("change(\"" + s
+ "\");", "injected script", 500);
// 这里是在500行插入这一小行JavaScript代码段,因为如果在默认的1行,那不会有结果
// 因为js是顺序执行的,当你执行第一行js代码时,可能还没有渲染body里面的标签。
HtmlPage myPage = (HtmlPage) t.getNewPage();
String nextPage = myPage.asXml().toString();
String nextPage2 = myPage.asText().toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
webClient.close();
}
}
public static void main(String[] args) {
TestMyOwnPage tmop = new TestMyOwnPage();
tmop.action();
}
}
t.getNewPage() 中有两个属性,一个是
javaScriptResult:执行代码后返回的结果,如果有(如我上面写的,返回hello htmlunit),如果没有(返回Undefined)。
newPage_:执行这段代码后返回的整个页面。
结果如图:
这段代码执行的最终结果如下:
asXml():将整个页面的html代码返回给我们:
而asText()只返回页面上可以显示的值,即head标签和label标签:
这种执行思路也可以动态的执行对应的js代码,从而抓取到需要的数据。
-------------------------------------------------- -------------------------------------- 2017 年 7 月更新------- ------------------------------------------------- - ----------------------------------------------
这两天一直在研究一个关于网络爬虫的系统
但是第一次爬的时候就发现了这个问题,js的动态页面爬不下来。
网上找了很多方法,google也问了,主要是指htmlunit,下面是核心代码,
使用htmlunit的主要目的是模拟浏览器操作,因为有些链接点击无法通过src直接获取url,通常使用JavaScript
简单拼接后的URL,这样一来,相比之下,直接用htmlunit模拟浏览器点击就简单多了。
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
webClient.getOptions().setCssEnabled(false); //禁用css支持
webClient.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
webClient.getOptions().setTimeout(20000);
HtmlPage page = wc.getPage("http://www.hao123.com");
//我认为这个最重要
String pageXml = page.asXml(); //以xml的形式获取响应文本
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");
这个时候,就可以得到jsoup中的document对象了,接下来就好写了,就像爬普通静态网页一样了。
不过,webclient解析是还是会出现一些问题,js的问题,
主要是由于目标url的js写的有些问题,但在实际的浏览器中却会忽略,eclipse中会报异常。
今天看到的时候,很多人都踩了。也许他们当时没有认真写博客。如果想找java爬虫项目可以到我的专栏。
图片搜索包括使用jsoup抓取图片,lire来索引和搜索图片。
献上玫瑰手,留下余香。有什么问题可以多多讨论哦!
htmlunit抓取动态网页(菜鸟级网页制作软件走进那绚丽多彩的网页设计世界!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-03 20:26
一、 菜鸟级网页制作软件 如果您是网页制作的初学者,请让以下软件带您进入多彩的网页制作世界!①Microsoft FrontPage 如果您已经熟悉Word,那么相信您对FrontPage 进行网页设计会非常熟悉。使用FrontPage制作网页,您才能真正体会到“功能强大,使用方便”的含义。页面制作由FrontPage中的编辑器完成,其工作窗口由3个标签页组成,即“所见即所得”编辑页、HTML代码编辑页和预览页。FrontPage 自带图形和 GIF 动画编辑器,支持 CGI 和 CSS。向导和模板都让初学者更方便地编辑网页。FrontPage 最强大的方面是它的站点管理功能。在服务器上更新站点时,无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。
您还可以编辑文本、字体、颜色、更改主页的作者、标题、背景颜色或图像、定义绘图点、插入链接、定义文档代码、插入图像、创建表格等,就像使用 Word。它类似于 FrontPage 2000 吗?? 但是,Netscape 编辑器对于复杂网页设计的功能有限。它甚至不支持表单创建和多帧创建。Netscape 编辑器是网页制作初学者的一个很好的入门工具。如果您的网页主要由文本和图像组成,那么 Netscape 编辑器将是一个简单的选择。如果你对HTML语言有一定的了解,可以使用记事本或Ultra Edit等文本编辑器编写少量的HTML语句,也可以弥补Netscape编辑器的一些不足。③Adobe Pagemill Pagemill 功能虽然不是很强大,但是使用起来非常方便,适合初学者制作更漂亮、不是很复杂的主页。如果您的主页需要大量的框架、表单和 Image Map 图像,那么 Adobe Pagemill 确实是您的首选。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。
这是因为它有一个很好的工具来创建和编辑Frame(框架),你不必花太多精力去添加一个新的Frame(框架)。而 Claris Home Page 3.0 集成了 FileMaker 数据库,增强的站点管理功能还允许您检测到页面的合法连接。但是界面设计过于粗糙,Image Map图片的处理不完整。二、中级网页制作软件如果你已经有一定的网页设计基础,对HTML语言有一定的了解,那么你可以选择以下软件来设计你的网页,他们一定会为你做很多网站上的颜色。①DreamWeaver 自制动态HTML 动画网页 DreamWeaver 是一款很酷的网页设计软件,它包括可视化编辑、HTML代码编辑软件包,支持ActiveX、JavaScript、Java、Flash、ShockWave等功能,还可以拖拽创建从头到尾的动态HTML动画,支持动态HTML(Dynamic HTML)的设计,使该页面可以在Netscape和IE4.0浏览器中正确显示页面动画,无需插件。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。
该技术允许网页在 DreamWeaver 和 HTML 代码编辑器之间自由转换,并且 HTML 语法和结构保持不变。这样,专业设计师就可以在不改变原有的编辑习惯的情况下,充分享受可视化编辑的好处。DreamWeaver 最具挑战性和活力的地方在于其开放式设计,任何人都可以轻松扩展其功能。②Fireworks Fireworks,第一个完全为网页制作者设计的软件,渊源颇多。它的出现彻底改变了网络制图。Fireworks 是专门为网络图片设计而开发的,内置了丰富的网络发布功能支持,例如Fireworks 可以自动剪切图片并生成javascript 用于鼠标运动感应。而Fireworks拥有非常强大的动画功能和近乎完美的网络图片生成器(导出功能)。增强了与dreamweaver的连接,可以直接生成dreamweaver的Libaray,甚至可以导出为网页和CSS样式的图片!③Flash 让你的网页动起来。Flash 是一种在 Internet 上使用的动态和交互式冲击波。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。
通过这种方式,您可以生成多媒体图形和界面,同时保持非常小的文件大小。FLASH虽然不能像语言一样编程,但通过其内置的句子结合JavaScript,你也可以制作一个高度交互的主页。有人曾说过:下个世纪的网络设计师不会用FLASH,他们肯定会被淘汰!我相信这句话是对的!④HotDog Professional 制作的网页需要加入多种复杂的技术。HotDog 是较早的基于代码的网页设计工具。它最显着的特点是它提供了许多向导工具,可以帮助设计人员创建页面的复杂部分。HotDog 的高级 HTML 支持插入选取框,可以在预览模式下以正常速度查看。这是非常罕见的,因为即使是开创这种标签的微软,FrontPage中没有提供这样的功能。HotDog 对插件的支持远远超过其他产品。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。
HomeSite 工作界面复杂而简单。根据习惯,可以像记事本一样设置为简单的编辑窗口,也可以在复杂的界面下工作。HomeSite 更适合那些更复杂、更精彩的页面设计。如果您希望能够完全控制您制作页面的过程,HomeSite 是您的最佳选择。但是对于初学者来说太复杂了。⑥HotMetal Pro 使网页具有强大的数据嵌入能力。HotMetal 不仅提供“所见即所得”的图形制作方法,还提供代码编辑方法。这是一款不会让各级设计师失望的软件。但是初学者需要熟悉 HTML 才能轻松使用该软件。HotMetal 具有强大的数据嵌入功能。使用其数据插入向导,可以提取外部Access、Word、Excel等ODBC数据放入页面。而且 HotMetal 可以自动将它们转换为 HTML 格式,是不是很棒?此外,它还可以转换许多旧格式的文档(如WordStar 等),并且在转换过程中可以自动将这些文档中的图片转换为GIF 格式。HotMetal 为用户提供了“太多”的工具,它也可以使用网络图或树状图来显示整个站点文档的链接状态。三、高级网页制作软件①Microsoft Visual Studio 本系列版本为:2003、2005、2008及以后版本;适合开发动态aspx网页,同时无需刷新网站、webservice功能等即可制作,仅适用于高级用户。②Jbuilder适用于各种版本的JSP网页开发,只适合高级用户。③记事本不要以为记事本功能很少,软件很简单;但是,如何使用它来制作网页只适合高级用户;因为在它的内容上,没有直接制作网页的可视化操作,只需要编写各种HTML代码、CSS代码、JS代码和各种动态脚本就可以创建网页。 查看全部
htmlunit抓取动态网页(菜鸟级网页制作软件走进那绚丽多彩的网页设计世界!)
一、 菜鸟级网页制作软件 如果您是网页制作的初学者,请让以下软件带您进入多彩的网页制作世界!①Microsoft FrontPage 如果您已经熟悉Word,那么相信您对FrontPage 进行网页设计会非常熟悉。使用FrontPage制作网页,您才能真正体会到“功能强大,使用方便”的含义。页面制作由FrontPage中的编辑器完成,其工作窗口由3个标签页组成,即“所见即所得”编辑页、HTML代码编辑页和预览页。FrontPage 自带图形和 GIF 动画编辑器,支持 CGI 和 CSS。向导和模板都让初学者更方便地编辑网页。FrontPage 最强大的方面是它的站点管理功能。在服务器上更新站点时,无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。无需创建用于更改文件的目录。FrontPage 将为您跟踪文件并复制这些文件的新版本。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。FrontPage 是唯一可以在本地计算机上工作并通过 Internet 直接处理远程服务器上的文件的软件。②Netscape Communicator Netscape Communicator 和 Netscape Navigator Gold3.0 版本都有网页编辑器。如果您喜欢使用Netscape 浏览器上网,使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。使用Netscape 编辑器真的很简单方便!当您使用 Netscape 浏览器显示网页时,单击编辑按钮,Netscape 会将网页存储在硬盘中,然后您就可以开始编辑了。
您还可以编辑文本、字体、颜色、更改主页的作者、标题、背景颜色或图像、定义绘图点、插入链接、定义文档代码、插入图像、创建表格等,就像使用 Word。它类似于 FrontPage 2000 吗?? 但是,Netscape 编辑器对于复杂网页设计的功能有限。它甚至不支持表单创建和多帧创建。Netscape 编辑器是网页制作初学者的一个很好的入门工具。如果您的网页主要由文本和图像组成,那么 Netscape 编辑器将是一个简单的选择。如果你对HTML语言有一定的了解,可以使用记事本或Ultra Edit等文本编辑器编写少量的HTML语句,也可以弥补Netscape编辑器的一些不足。③Adobe Pagemill Pagemill 功能虽然不是很强大,但是使用起来非常方便,适合初学者制作更漂亮、不是很复杂的主页。如果您的主页需要大量的框架、表单和 Image Map 图像,那么 Adobe Pagemill 确实是您的首选。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。Pagemill的另一大特点是它有一个剪贴板,可以将任意数量的文字、图形、表格拖放到里面,需要的时候再打开,非常方便。④ Claris Home Page 如果您使用 Claris Home Page 软件,您可以在几分钟内创建一个动态网页。
这是因为它有一个很好的工具来创建和编辑Frame(框架),你不必花太多精力去添加一个新的Frame(框架)。而 Claris Home Page 3.0 集成了 FileMaker 数据库,增强的站点管理功能还允许您检测到页面的合法连接。但是界面设计过于粗糙,Image Map图片的处理不完整。二、中级网页制作软件如果你已经有一定的网页设计基础,对HTML语言有一定的了解,那么你可以选择以下软件来设计你的网页,他们一定会为你做很多网站上的颜色。①DreamWeaver 自制动态HTML 动画网页 DreamWeaver 是一款很酷的网页设计软件,它包括可视化编辑、HTML代码编辑软件包,支持ActiveX、JavaScript、Java、Flash、ShockWave等功能,还可以拖拽创建从头到尾的动态HTML动画,支持动态HTML(Dynamic HTML)的设计,使该页面可以在Netscape和IE4.0浏览器中正确显示页面动画,无需插件。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。0个没有插件的浏览器。同时还提供了自动更新页面信息的功能。DreamWeaver 还使用 Roundtrip HTML 技术。
该技术允许网页在 DreamWeaver 和 HTML 代码编辑器之间自由转换,并且 HTML 语法和结构保持不变。这样,专业设计师就可以在不改变原有的编辑习惯的情况下,充分享受可视化编辑的好处。DreamWeaver 最具挑战性和活力的地方在于其开放式设计,任何人都可以轻松扩展其功能。②Fireworks Fireworks,第一个完全为网页制作者设计的软件,渊源颇多。它的出现彻底改变了网络制图。Fireworks 是专门为网络图片设计而开发的,内置了丰富的网络发布功能支持,例如Fireworks 可以自动剪切图片并生成javascript 用于鼠标运动感应。而Fireworks拥有非常强大的动画功能和近乎完美的网络图片生成器(导出功能)。增强了与dreamweaver的连接,可以直接生成dreamweaver的Libaray,甚至可以导出为网页和CSS样式的图片!③Flash 让你的网页动起来。Flash 是一种在 Internet 上使用的动态和交互式冲击波。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。它的优点是体积小,可以边下载边播放,避免用户长时间等待。##它可用于生成动画并向网页添加声音。
通过这种方式,您可以生成多媒体图形和界面,同时保持非常小的文件大小。FLASH虽然不能像语言一样编程,但通过其内置的句子结合JavaScript,你也可以制作一个高度交互的主页。有人曾说过:下个世纪的网络设计师不会用FLASH,他们肯定会被淘汰!我相信这句话是对的!④HotDog Professional 制作的网页需要加入多种复杂的技术。HotDog 是较早的基于代码的网页设计工具。它最显着的特点是它提供了许多向导工具,可以帮助设计人员创建页面的复杂部分。HotDog 的高级 HTML 支持插入选取框,可以在预览模式下以正常速度查看。这是非常罕见的,因为即使是开创这种标签的微软,FrontPage中没有提供这样的功能。HotDog 对插件的支持远远超过其他产品。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。它提供的对话框允许您为不同格式的文件手动选择不同的选项。但是中文的处理不是很方便。HotDog 是一款功能强大的软件,对于想要在网页中添加 CSS、Java 和 RealVideo 等复杂技术的高级设计人员来说,它是一个不错的选择。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。⑤HomeSite 制作一个可以完全控制页面进程的网页。Allaire 的 HomeSite 是一款小巧多功能的 HTML 代码编辑器,具有丰富的帮助功能,支持 CGI 和 CSS 等,可以直接编辑 perl 程序。
HomeSite 工作界面复杂而简单。根据习惯,可以像记事本一样设置为简单的编辑窗口,也可以在复杂的界面下工作。HomeSite 更适合那些更复杂、更精彩的页面设计。如果您希望能够完全控制您制作页面的过程,HomeSite 是您的最佳选择。但是对于初学者来说太复杂了。⑥HotMetal Pro 使网页具有强大的数据嵌入能力。HotMetal 不仅提供“所见即所得”的图形制作方法,还提供代码编辑方法。这是一款不会让各级设计师失望的软件。但是初学者需要熟悉 HTML 才能轻松使用该软件。HotMetal 具有强大的数据嵌入功能。使用其数据插入向导,可以提取外部Access、Word、Excel等ODBC数据放入页面。而且 HotMetal 可以自动将它们转换为 HTML 格式,是不是很棒?此外,它还可以转换许多旧格式的文档(如WordStar 等),并且在转换过程中可以自动将这些文档中的图片转换为GIF 格式。HotMetal 为用户提供了“太多”的工具,它也可以使用网络图或树状图来显示整个站点文档的链接状态。三、高级网页制作软件①Microsoft Visual Studio 本系列版本为:2003、2005、2008及以后版本;适合开发动态aspx网页,同时无需刷新网站、webservice功能等即可制作,仅适用于高级用户。②Jbuilder适用于各种版本的JSP网页开发,只适合高级用户。③记事本不要以为记事本功能很少,软件很简单;但是,如何使用它来制作网页只适合高级用户;因为在它的内容上,没有直接制作网页的可视化操作,只需要编写各种HTML代码、CSS代码、JS代码和各种动态脚本就可以创建网页。
htmlunit抓取动态网页(所说的问题试试)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-03 13:10
是的,最后还是用Selenium来实现上一篇我提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果还是可以接受的。
继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的第一选择是 htmlunit。先简单介绍一下htmlunit。以下段落摘自互联网。
htmlunit 是一个开源的java 页面分析工具。启动 htmlunit 后,将在底部启动一个无界面浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
通过一个简单的调用:
HtmlPage 页面 = webClient.getPage(url);
可以得到页面的HtmlPage表示,然后通过:
InputStream 是 = targetPage.getWebResponse().getContentAsStream()
可以获取页面的输入流,进而获取页面的源代码,这对于网络爬虫项目非常有用。
当然,你也可以从页面中获取更多的页面元素。
很重要的一点是 HtmlUnit 提供了对执行 javascript 的支持:
page.executeJavaScript(javascript)
js执行后返回一个ScriptResult对象,通过该对象可以获取js执行后的页面等信息。默认情况下,内部浏览器会在执行 js 后进行一次页面跳转,并跳转到执行 js 后生成的新页面。如果js执行失败,页面跳转将不会被执行。
最后可以通过获取 page.executeJavaScript(javascript).getNewPage() 来获取执行后的页面。换句话说,这里需要人工执行JavaScript。显然这不符合我的初衷。另外,我的水平可能太差了。我在爬新浪新闻页面的时候总是出错。我还没有找到错误在哪里。分析网上的查询结果,最可能的错误原因是htmlunit在执行某些带参数的请求时,参数的顺序或编码问题会导致请求失败并报错。关键是我运行后没有得到我需要的结果。
然后我寻找了另一种解决方案。这时候我找到了SeleniumWebDriver,这就是我需要的解决方案。
参考资料和例子后,就可以开始使用了。示例代码如下。
<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
3 FirefoxProfile firefoxProfile = new FirefoxProfile();
4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
5
6
7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
8
9 ArrayList list = new ArrayList();
10 list.add("http://www.sina.com.cn");
11 list.add("http://www.sohu.com");
12 list.add("http://www.163.com");
13 list.add("http://www.qq.com");
14
15 long start,end;
16
17 for(int i=0;i 查看全部
htmlunit抓取动态网页(所说的问题试试)
是的,最后还是用Selenium来实现上一篇我提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果还是可以接受的。
继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的第一选择是 htmlunit。先简单介绍一下htmlunit。以下段落摘自互联网。
htmlunit 是一个开源的java 页面分析工具。启动 htmlunit 后,将在底部启动一个无界面浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
通过一个简单的调用:
HtmlPage 页面 = webClient.getPage(url);
可以得到页面的HtmlPage表示,然后通过:
InputStream 是 = targetPage.getWebResponse().getContentAsStream()
可以获取页面的输入流,进而获取页面的源代码,这对于网络爬虫项目非常有用。
当然,你也可以从页面中获取更多的页面元素。
很重要的一点是 HtmlUnit 提供了对执行 javascript 的支持:
page.executeJavaScript(javascript)
js执行后返回一个ScriptResult对象,通过该对象可以获取js执行后的页面等信息。默认情况下,内部浏览器会在执行 js 后进行一次页面跳转,并跳转到执行 js 后生成的新页面。如果js执行失败,页面跳转将不会被执行。
最后可以通过获取 page.executeJavaScript(javascript).getNewPage() 来获取执行后的页面。换句话说,这里需要人工执行JavaScript。显然这不符合我的初衷。另外,我的水平可能太差了。我在爬新浪新闻页面的时候总是出错。我还没有找到错误在哪里。分析网上的查询结果,最可能的错误原因是htmlunit在执行某些带参数的请求时,参数的顺序或编码问题会导致请求失败并报错。关键是我运行后没有得到我需要的结果。
然后我寻找了另一种解决方案。这时候我找到了SeleniumWebDriver,这就是我需要的解决方案。
参考资料和例子后,就可以开始使用了。示例代码如下。
<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
3 FirefoxProfile firefoxProfile = new FirefoxProfile();
4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
5
6
7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
8
9 ArrayList list = new ArrayList();
10 list.add("http://www.sina.com.cn");
11 list.add("http://www.sohu.com");
12 list.add("http://www.163.com");
13 list.add("http://www.qq.com");
14
15 long start,end;
16
17 for(int i=0;i
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2021-12-03 13:09
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取的HTML文件中没有特定的代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,因为有的存在重复导入或者版本问题)代码如下:
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
} 查看全部
htmlunit抓取动态网页(Java端得到的HTML文件里面没有某一段代码怎么做
)
我最近一直在抓取数据。抓取一般网页数据相对容易。今天在抓取电视猫的节目列表,发现有些数据无法抓取。Java端获取的HTML文件中没有特定的代码。我查了很多资料。,我发现是js动态生成的数据,不能直接抓取。一种解决办法是找到ajax请求地址和参数,重新爬取。这个方法有一个问题,就是当参数加密过时,这个方法不好用,所以,这里有一个方法,就是用HTMLunit来抓取(可以用jsuop处理HTML文件),jar包下载地址:(HTMLunit使用的jar包全部导入后,稍微调整一下,因为有的存在重复导入或者版本问题)代码如下:
public static String getHtml(String url){
// 模拟一个浏览器
@SuppressWarnings("resource")
WebClient webClient = new WebClient();
//webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
clientOptions.setTimeout(35000);
clientOptions.setThrowExceptionOnScriptError(false);
// 模拟浏览器打开一个目标网址
HtmlPage rootPage = null;
try {
rootPage = webClient.getPage(html);
} 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();
}
//保存页面
//rootPage.save(new File("/home/share/Test/1"));
//body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
return xmlContent;
}