上一篇博客“Groovy 安装与开发”,介绍了Groovy的安装和开发,包括基本语法、变量、函数等,本文将重点介绍Groovy爬取网页。

在介绍Groovy爬取网页前,先介绍下 Grails框架,它是Groovy抓取网页的基础Web框架。

 

Grails 简介

Grails 官网: http://www.grails.org

A powerful Groovy-based web application framework for the JVM built on top of Spring Boot

Grails is an Open Source (Apache 2 License) web framework, for the Java platform aimed at multiplying developers’ productivity thanks to a Convention-over-Configuration, sensible defaults and opinionated APIs. It integrates smoothly with the JVM, allowing you to be immediately productive whilst providing powerful features, including integrated ORM, Domain-Specific Languages, runtime and compile-time meta-programming and Asynchronous programming.

Grails 是搭建在动态语言 Groovy 之上的一个开源 MVC Web 开发框架,Grails 的一个显著特点在于“快”,这主要得益于 Groovy 脚本语言的动态特性,也得益于其“一栈式”的设计。与传统的 Java、C#、PHP等Web 开发框架相比,它可以使用极少的代码和配置实现诸如表单提交、数据库读写等常见的 Web 应用功能,实现了开发效率的成倍提高。 

与它的老师 Ruby on Rails 相比,Grails 的优势在于 Groovy 语言与 Java 平台的紧密集成。

一方面, Groovy 在语法上与 Java 十分相似,降低了众多的 Java 程序员学习 Grails 的门槛。

另一方面,Groovy 本身运行于 JVM 之上,可以直接调用 Java 代码,实现了与 Java 平台的完美整合,因此可以将 Grails Web 应用运行在成熟可靠的 Java EE 应用服务器之上。 

Grails 是一个遵循 MVC 设计模式的 Web 开发框架。它分别用 Domain Class、View、Controller 对应于 MVC 的模型、视图和控制器。可以简单的把一个 Domain Class 理解为数据库中的一张表,Grails 在底层通过 Hibernate 将 Domain Class 和数据库的表进行了映射。View 在 Grails 中指的是 GSP 页面(注意是 GSP 不是 JSP),它用于显示用户界面。GSP 与 JSP 类似,既可以编写静态网页的元素,也可以嵌入 Groovy 代码实现动态内容。Controller 在 Grails 中充当着重要的角色:它可以响应用户的请求,可以接收用户提交的表单,还可以访问模型的数据,并传递给 View。Grails 在 MVC 三方面的具体内容,将在后面的例子中做详细介绍。 

 

Grails 预备知识

1、熟练使用常见的 HTML 标签; 
2、有一定的 Web 开发基础(理解表单提交 POST/GET 、理解Session会话); 
3、Java 语言或者 Groovy 语言的基础; 
4、 Hibernate、Mybatis; 

 

Grails 安装配置

1、下载 Grails 安装程序,将压缩包解压到硬盘上,并设置环境变量 GRAILS_HOME 

官网下载 grails-3.3.0.zip

由于国内下载较慢,用我们米扑科技的美国服务器下载了,上传了百度云盘,方便您下载

百度网盘下载: grails-3.3.0.zip

 

2、设置 GRAILS_HOME 环境变量,然后把 %GRAIS_HOME%\bin 加到 System 的 Path 变量中

解压zip

unzip grails-3.3.0.zip
sudo cp -r grails-3.3.0 /opt/

配置环境变量

vim /etc/profile

GRAILS_HOME=/opt/grails-3.3.0
export PATH=$GRAILS_HOME/bin:$PATH

使其生效:

source /etc/profile

验证安装:

$ grails -v
| Grails Version: 3.3.0
| Groovy Version: 2.4.11
| JVM Version: 1.8.0_121

从上面版本可看出,Grails 是基于Groovy 和 Java,她们三个是好基友,哈哈

 

3、在控制台下输入 grails help,如果能看到 Grails 的命令列表,Grails 的安装配置就算成功了

$ grails help

Usage (optionals marked with *):'
grails [environment]* [target] [arguments]*'

| Examples:
$ grails dev run-app
$ grails create-app books

| Available Commands (type grails help 'command-name' for more info):
| Command Name                          Command Description
----------------------------------------------------------------------------------------------------
create-app                              Creates an application
create-plugin                           Creates a plugin
create-profile                          Creates a profile
help                                    Prints help information for a specific command
list-profiles                           Lists the available profiles
profile-info                            Display information about a given profile

| Detailed usage with help [command]

 

Groovy 特点

1、无需“;”结尾(有“;”也不会报错); 

2、简单数据类型,与 Java 相同; 

 

Groovy 爬取网页

方式1)Groovy URL 爬取网页

/**
 * mimvp.com
 * 2015-11-09
 */


class MimvpSpider {
	static def mimvp_url = "http://proxy.mimvp.com/exist.php"
	static def mimvp_url2 = "https://proxy.mimvp.com/exist.php"
	
	static main(args) {
		spider_http(MimvpSpider.mimvp_url)
	}

	// 不需要 groovyx.net.http.HTTPBuilder
	static spider_http(mimvp_url) {
		def connection = new URL(mimvp_url).openConnection()
		connection.setRequestMethod('GET')
		connection.doOutput = true

		def writer = new OutputStreamWriter(connection.outputStream)
		writer.flush()
		writer.close()
		connection.connect()

		def respText = connection.content.text
		println respText
	}
}

 

方式2) Groovy HTTPBuilder 爬取网页

/**
 * mimvp.com
 * 2015-11-09
 */

 
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1' )

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*


class MimvpSpider {
	static main(args) {
		spider_web(MimvpSpider.mimvp_url)
	}

	// 需要 groovyx.net.http.HTTPBuilder
	// 首先groovy请求http需要依赖HTTPBuilder模块儿,不知道怎么安装模块儿,辗转了半天,后来发现支持Grab语法,代码如下
	static spider_web(mimvp_url) {
		def http = new HTTPBuilder('https://proxy.mimvp.com')	// http://proxy.mimvp.com/free.php?proxy=out_hp
		http.ignoreSSLIssues()		// 访问https网站,不需验证, module='http-builder', version='0.7.1'
		http.request(GET, TEXT) {
			uri.path="/free.php"								// 请求路由
			uri.query = ['proxy' : 'out_hp']					// 请求参数

			response.success ={resp, reader->
				println resp.statusLine.statusCode		// 200
				println resp.headers.'Expires'			// Thu, 19 Nov 1981 08:52:00 GMT
				println resp.headers.'Vary'				// Accept-Encoding
				System.out << reader					// 网页正文
			}
			response.failure={resp-> println resp.status }
		}
	}
}

 

方式3)Groovy 通过代理爬取网页

/**
 * Groovy 支持 http
 *
 * 米扑代理示例:
 * http://proxy.mimvp.com/demo2.php
 *
 * 米扑代理购买:
 * http://proxy.mimvp.com
 *
 * mimvp.com
 * 2015-11-09
 */

 
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1' )

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
import org.apache.http.auth.*


class MimvpSpider {
	static def proxy_http = "http://208.92.93.218:1080"
	
	static def mimvp_url = "http://proxy.mimvp.com/exist.php"
	static def mimvp_url2 = "https://proxy.mimvp.com/exist.php"
	

	static main(args) {
		spider_proxy(MimvpSpider.mimvp_url, MimvpSpider.proxy_http)		// http
		spider_proxy(MimvpSpider.mimvp_url2, MimvpSpider.proxy_http)	// https
	}

	// 设置代理
	static spider_proxy(mimvp_url, proxy) {
		def http = new HTTPBuilder(mimvp_url)

//		http.client.getCredentialsProvider().setCredentials(
//		    new AuthScope("myproxy.com", 8080),
//		    new UsernamePasswordCredentials("proxy-username", "proxy-password")
//		)
		
		def proxy_type = proxy.split("://")[0]
		def proxy_ip = proxy.split("://")[1].split(":")[0]
		def proxy_port = proxy.split("://")[1].split(":")[1]
		proxy_port = proxy_port.toInteger()
		
		println proxy_type
		println proxy_ip
		println proxy_port
		
		
//		http.setProxy('myproxy.com', 8080, 'http')
		http.setProxy(proxy_ip, proxy_port, proxy_type)
		http.ignoreSSLIssues()		// 访问https网站,不需验证, module='http-builder', version='0.7.1'

		http.request( GET, TEXT ){ req ->
			response.success = { resp, reader ->
				println "Response: ${reader.text}"
			}
		}
	}
}

 

本示例采用的米扑代理,支持 http、https、socks4、socks5等多种协议,覆盖全球120多个国家,中国34个省市

推荐米扑代理: http://proxy.mimvp.com

 

 

参考推荐:

Groovy 安装与开发

Groovy 操作http请求

Groovy语言 Grails框架入门

httpbuilder SSL