Groovy Scraping Поиск в Google с помощью HttpBuilder - Результат, кажется, не разбирается как HTML или XML - PullRequest
0 голосов
/ 21 сентября 2011

Я пишу простой скрипт на Groovy, чтобы запрашивать простой поиск в Поиске Google, а затем анализировать набор результатов.Я знаю, что есть API пользовательского поиска, но он не будет работать для меня, поэтому, пожалуйста, не указывайте мне в этом направлении.

Я использую HTTPBuilder для выполнения запроса.Я обнаружил, что все другие методы "string" .toURL (), HTMLCleaner ... все они получают код http 403, если вы делаете вызов с ними.Я предполагаю, что это потому, что заголовок запроса недействителен для Google.

Я могу заставить HTTP Builder сделать и получить запрос не 403.Тем не менее, когда я делаю println на «html» (см. Фрагмент кода ниже), он не выглядит как 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?Есть идеи?

1 Ответ

0 голосов
/ 25 сентября 2011

Вы не упомянули используемый вами поисковый URL, поэтому я не могу сказать, почему вы получили 403-е.Следующий код выполняет поиск на стандартном сайте Google и работает для меня без каких-либо запрещенных или других ошибок статуса:

@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

...