我正在编写一个简单的 Groovy 脚本来请求来自 Google 搜索的简单搜索,然后解析结果集。我知道有自定义搜索 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 }
那么这是不可能的吗?谷歌是在欺骗我并向我发送垃圾数据,还是我需要更多地调整我的 HTTPBuilder?有任何想法吗?