0

Google 検索から単純な検索を要求し、結果セットを解析する単純な Groovy スクリプトを作成しています。Custom Search API があることは知っていますが、それはうまくいかないので、その方向に向けないでください。

HTTPBuilder を使用してリクエストを作成しています。他のすべてのメソッド "string".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->body#gsr->div#main->div->div#cnt->div#rcnt->div#center_col->div#res.med->div#search->div#ires->ol# rso->

コード:

    def mainDiv = html.body.div.findAll {it.@id.text() == 'main'}
    println mainDiv
    def rcntDiv = mainDiv.div.div.div.findAll { it.@id.text() == 'rcnt' }
    println rcntDiv
    def searchDiv = rcntDiv.div.findAll { it.@id.text == "center_col" }.div.div.findAll { it.@id.text == "search" }
    println searchDiv
    searchDiv.div.ol.li.each { println it }

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

4

1 に答える 1

0

使用していた検索 URL について言及していないため、403 が表示された理由についてはお答えできません。次のコードは、標準の Google サイトで検索を行い、Forbidden またはその他のステータス エラーなしで機能します。

@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 を正常に解析していることを示すために、サイトのタイトルを出力します。

サイトのタイトル: Queen+of+hearts - Google 検索

于 2011-09-25T19:50:55.237 に答える