2011-09-21 43 views
0

我寫一個簡單的Groovy腳本請求從谷歌搜索簡單搜索,然後分析結果集。我知道有自定義搜索API - 但這對我不起作用,所以請不要指出我的方向。Groovy的刮谷歌搜索使用HttpBuilder - 結果似乎並不解析爲HTML或XML

我使用HTTPBuilder發出請求。我發現所有的其他方法「串」 .toURL(),HTMLCleaner ......所有的人都得到一個HTTP 403代碼,如果你與他們通話。我假設這是因爲請求標題對Google無效。

我可以得到HTTP Builder創建並得到一個非403請求。也就是說,當我在「html」上執行println(請參閱下面的代碼片段)時,它看起來不像html或xml。它看起來就像文字。

這裏是HTTPBuilder片段獲得響應:

//build query 
    def query = "" 
    queryTerms.eachWithIndex({term , i -> (i > 0) ? (query += "+" + term) : (query  += term)}) 

    def http = new HTTPBuilder(baseUrl) 

    http.request(Method.GET,ContentType.TEXT) { req -> 
     headers.'User-Agent' = 'Mozilla/5.0' } 

    def html = http.get(path : searchPath, contentType : ContentType.HTML, query : [q:query]) 
    // println html 
    assert html instanceof groovy.util.slurpersupport.GPathResult 
    assert html.HEAD.size() == 1 
    assert html.BODY.size() == 1 

我找回了一些成績,所以我嘗試分析它按如下。我將首先提供實際結構,然後解析。也就是說,任何分析過的元素都不會顯示出來。

實際結構:

HTML的「體#gsr-> DIV#main-> div-> DIV#CNT-> DIV#rcnt-> DIV#center_col-> DIV#res.med-> DIV #搜索 - > DIV#IRES-> OL#rso->

代碼:

def mainDiv = html.body.div.findAll {[email protected]() == 'main'} 
    println mainDiv 
    def rcntDiv = mainDiv.div.div.div.findAll { [email protected]() == 'rcnt' } 
    println rcntDiv 
    def searchDiv = rcntDiv.div.findAll { [email protected] == "center_col" }.div.div.findAll { [email protected] == "search" } 
    println searchDiv 
    searchDiv.div.ol.li.each { println it } 

所以這是不可能的?谷歌是否欺騙我,並向我發送垃圾數​​據,還是我需要調整我的HTTPBuilder更多?有任何想法嗎?

回答

0

你沒有提到你正在使用的搜索URL,所以我不能說出你爲什麼得到403s。下面的代碼不符合標準谷歌網站搜索,以及對我的作品沒有任何禁止或其他狀態錯誤:

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

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

def http = new groovyx.net.http.HTTPBuilder('http://www.google.com') 

def queryTerms =['queen','of','hearts'] 

http.request(GET,HTML) { req -> 
    uri.path = '/search' 
    uri.query= [q: queryTerms.join('+'), hl: 'en'] 

    headers.'User-Agent' = 'Mozilla/5.0' 

    response.success = { resp, html -> 
     println "Site title: ${html.HEAD.TITLE.text()}" 
    } 
    response.failure = { resp -> 
    println resp.statusLine 
    } 
} 

它輸出網站的標題,以表明它已成功解析HTML:

網站標題:女王+的+心 - Google搜索