2011-09-21 8 views
0

Google検索から簡単な検索をリクエストして結果セットを解析するための簡単なGroovyスクリプトを作成しています。私はカスタム検索APIがあることを知っていますが、それは私のためには機能しませんので、その方向で私を指摘しないでください。HttpBuilderを使用したGoogle検索のスクレイピング - 結果がhtmlやxmlとして解析されないようです。

HTTPBuilderを使用してリクエストしています。私は他のすべてのメソッド "文字列" .toURL()、HTMLCleaner ...これらのメソッドは、あなたがそれらを使って呼び出しを行うとhttp 403コードを取得することがわかりました。リクエストの見出しがGoogleにとって有効でないため、私はそれを仮定しています。

私は、HTTPビルダーに、403以外の要求をしてもらうことができます。それは、私が "html"(下記のコードスニペットを参照)でprintlnを実行すると、htmlやxmlのようには見えません。テキストのように見えます。私はいくつかの結果を返す取得しています

//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 

ので、私は以下の通りそれを解析してみてください:ここ

は、応答を取得するためにHTTPBuilderスニペットです。私は実際の構造を最初に提供し、次に構文解析を行います。つまり、解析された要素には何も表示されません。

実際の構造:

HTML->ボディ#gsr->のdiv#メーン> div->のdiv#CNT->のdiv#rcnt->のdiv#center_col->のdiv#res.med->のdiv #検索 - >のdiv#IRES->オール#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 } 

だから、これは単に可能ではないでしょうか? Googleは私を偽装して、私にガベージデータを送信していますか、私はHTTPBuilderをもう少し調整する必要がありますか?何か案は?

答えて

0

あなたが使用していた検索URLについては言及していませんでしたので、なぜあなたが403を取得したのかについては話すことができません。次のコードは、標準のGoogleサイトで検索を行い、かつ任意の禁止またはその他のステータスエラーなしで私の作品:

:それは成功したHTMLの構文解析されていることを示すために、それはサイトのタイトルを出力

@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 
    } 
} 

サイトのタイトル:クイーン+ of + hearts - Google検索

関連する問題