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 をもう少し調整する必要がありますか? 何か案は?