我正在分析一个包含买家对客户反馈的网站。我想收集每个买家的名字和他或她给出的反馈。
我的问题是第一页上只给出了一些反馈。点击一个按钮就会触发下一个页面,网站会用AJAX进行响应。如何将AJAX响应中的新反馈输入到我的机械化页面对象中?我想尽可能多地点击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 #######################nn"
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}nn"
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>
简单。你只需要不断向发出GET请求
page = agent.get "http://www.trustpilot.dk/domains/reviews?DID=767&page=#{increment me}"
直到没有更多的数据。