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