【问题标题】:Triggering ajax requests/responses before parsing a webpage with Mechanize/Nokogiri在使用 Mechanize/Nokogiri 解析网页之前触发 ajax 请求/响应
【发布时间】:2013-07-31 06:59:50
【问题描述】:

我正在解析一个包含买家反馈的网站。我想收集每个买家的姓名以及他或她给出的反馈。

我的问题是首页上只给出了一些反馈。通过单击按钮触发下一页,网站以 AJAX 响应。如何从 AJAX 响应中获取新的反馈到我的 Mechanize 页面对象中?我想尽可能多地点击 AJAX 触发按钮,所以我会得到尽可能多的反馈。

我的代码如下所示:

require 'mechanize'
require 'nokogiri'

log_file = "log_file.txt"
log = File.open(log_file, 'w')

www = "http://www.trustpilot.dk/review/www.fona.dk"

agent = Mechanize.new
page = agent.get(www)
reviews = page.search(".clear")

reviews.each do |r|
  doc = Nokogiri::HTML::Document.parse(r.to_html)

  log << "####################### NEW REVIEW #######################\n\n"

  name = r.at_css(".profileinfo a").text.strip
  log << "Customer name: #{name}\n"

  rating = doc.at("//meta[@itemprop = 'ratingValue']/@content").to_s
  log << "Rating: #{rating}\n\n"
end

log.close

日志文件 fyi 将如下所示:

####################### NEW REVIEW #######################

Customer name: Hans-Oluf
Rating: 5

####################### NEW REVIEW #######################

Customer name: Jørgen
Rating: 3

####################### NEW REVIEW #######################

Customer name: Frederik
Rating: 4

AJAX 触发器应该在这段源代码中:

                <div id="AjaxLoader_1" class="AjaxPager">
    <div class="AjaxPagerLinkWrapper">
        <a class="button AjaxPagerLink" href="http://www.trustpilot.dk/review/www.fona.dk?page=2">
            Vis flere anmeldelser
        </a>
    </div>
</div>
<script type="text/javascript">
    $(document).ready (function() {
        // Testing spilttest console.log("/domains/reviews?DID=767");
        // Get element right before this control
        var containerId = 'reviewContainer';
        var container = containerId == '' 
            ? $('#AjaxLoader_1').prev()
            : $($.f('#{0}', containerId));
        var pager = new Pager(
            1,
            25,
            'nextPageLoaded',
            'AjaxLoader_1',
            '/domains/reviews?DID=767',
            'page',
            '',
            container);
        });
</script>

【问题讨论】:

    标签: ruby ajax web-scraping nokogiri mechanize


    【解决方案1】:

    简单。您只需继续向以下位置发出 GET 请求:

    page = agent.get "http://www.trustpilot.dk/domains/reviews?DID=767&page=#{increment me}"
    

    直到没有更多数据为止。

    【讨论】:

    • 感谢您的回答。但我不确定我是否遵循。 http://www.trustpilot.dk/domains/reviews 应该替换 http://www.trustpilot.dk/review/www.fona.dk 还是放在它后面?至于increment me,我的Ruby脚本说undefined local variable or method me for main:Object (NameError)
    • 对不起,我的错。我现在明白了。现在的问题是 mechanize 不包括页面对象中的脚本,所以我无法从页面中读取 DID,例如page.to_s.scan(/\/domains\/reviews\?DID=(\d*)/)[0].
    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多