【问题标题】:Webscraping Nokogiri unable to pick any classesWebscraping Nokogiri 无法选择任何课程
【发布时间】:2018-03-21 02:00:00
【问题描述】:

我正在使用这个页面: https://www.google.com/search?q=ford+fusion+msrp&oq=ford+fusion+msrp&aqs=chrome.0.0l6.2942j0j7&sourceid=chrome&ie=UTF-8

我正在尝试获取此元素:class="_XWk"

  page = HTTParty.get('https://www.google.com/search?q=ford+fusion+msrp&oq=ford+fusion+msrp&aqs=chrome.0.0l6.11452j0j7&sourceid=chrome&ie=UTF-8')

  parse_page = Nokogiri::HTML(page)
  parse_page.css('_XWk')

在这里,我可以在 parse_page 中看到整个页面,但是当我尝试 .cc('classname') 时,我什么也没看到。我是不是用错了方法?

【问题讨论】:

  • 你确定有那个类的元素吗?

标签: ruby web-scraping web-crawler nokogiri


【解决方案1】:

查看SelectorGadget Chrome 扩展程序,通过在浏览器中单击所需元素来获取css 选择器。

这是因为一个简单的错字,例如. (dot) 在选择器之前,ran 已经提到。

此外,可能会出现下一个问题,因为没有指定 HTTP user-agent,因此 Google 最终会阻止请求,您将收到完全不同的 HTML,其中包含错误消息或类似内容,而没有您的实际数据寻找。 What is my user-agent.

传递一个user-agent

headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

HTTParty.get("https://www.google.com/search", headers: headers)

遍历容器以从 Google 搜索中提取标题:

data = doc.css(".tF2Cxc").map do |result|
  title = result.at_css(".DKV0Md")&.text

代码和example in the online IDE

headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

params = {
  q: "ford fusion msrp",
  num: "20"
}

response = HTTParty.get("https://www.google.com/search",
                        query: params,
                        headers: headers)
doc = Nokogiri::HTML(response.body)

data = doc.css(".tF2Cxc").map do |result|
  title = result.at_css(".DKV0Md")&.text
  link = result.at_css(".yuRUbf a")&.attr("href")
  displayed_link = result.at_css(".tjvcx")&.text
  snippet = result.at_css(".VwiC3b")&.text
  puts "#{title}#{snippet}#{link}#{displayed_link}\n\n"

-------
'''
2020 Ford Fusion Prices, Reviews, & Pictures - Best Carshttps://cars.usnews.com/cars-trucks/ford/fusionhttps://cars.usnews.com › Cars › Used Cars › Used Ford

Ford® Fusion Retired | Now What?Not all vehicles qualify for A, Z or X Plan. All Mustang Shelby GT350® and Shelby® GT350R prices exclude gas guzzler tax. 2. EPA-estimated city/hwy mpg for the ...https://www.ford.com/cars/fusion/https://www.ford.com › cars › fusion
...
'''

或者,您可以使用来自 SerpApi 的 Google Organic Results API 来实现此目的。这是一个带有免费计划的付费 API。

您的情况的不同之处在于,您不需要弄清楚正确的选择器是什么或为什么输出中的结果不同,因为它已经为最终用户完成了。

基本上,唯一需要做的就是迭代结构化 JSON 并获取您正在寻找的数据。

示例代码:

require 'google_search_results' 

params = {
  api_key: ENV["API_KEY"],
  engine: "google",
  q: "ford fusion msrp",
  hl: "en",
  num: "20"
}

search = GoogleSearch.new(params)
hash_results = search.get_hash

data = hash_results[:organic_results].map do |result|
  title = result[:title]
  link = result[:link]
  displayed_link = result[:displayed_link]
  snippet = result[:snippet]
  puts "#{title}#{snippet}#{link}#{displayed_link}\n\n"

-------
'''
2020 Ford Fusion Prices, Reviews, & Pictures - Best Carshttps://cars.usnews.com/cars-trucks/ford/fusionhttps://cars.usnews.com › Cars › Used Cars › Used Ford

Ford® Fusion Retired | Now What?Not all vehicles qualify for A, Z or X Plan. All Mustang Shelby GT350® and Shelby® GT350R prices exclude gas guzzler tax. 2. EPA-estimated city/hwy mpg for the ...https://www.ford.com/cars/fusion/https://www.ford.com › cars › fusion
...
'''

P.S - 我写了一篇关于如何抓取 Google Organic Search Results 的博文。

免责声明,我为 SerpApi 工作。

【讨论】:

    【解决方案2】:

    parse_page.css('_XWk') 更改为parse_page.css('._XWk')

    注意点 (.) 的区别。点引用一个类。

    使用parse_page.css('_XWk'),nokogiri 不知道 _XWk 是否是类、id、数据属性等。

    【讨论】:

      【解决方案3】:

      看起来有些东西正在交换类,所以你在浏览器中看到的不是你从 http 调用中得到的。在这种情况下,从 _XWk 到 _tA

        page = HTTParty.get('https://www.google.com/search?q=ford+fusion+msrp&oq=ford+fusion+msrp&aqs=chrome.0.0l6.11452j0j7&sourceid=chrome&ie=UTF-8')
        parse_page = Nokogiri::HTML(page)
        parse_page.css('._tA').map(&:text) 
      
      # >>["Up to 23 city / 34 highway", "From $22,610", "175 to 325 hp", "192″ L x 73″ W x 58″ H", "3,431 to 3,681 lbs"]
      

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多