我写了这个红宝石脚本以从制造商网站上刮擦产品信息.数组中产品对象的刮擦和存储工作起作用,但是我不知道如何将数组数据导出到CSV文件.正在抛出此错误: scraper.rb:45:未定义的方法`send_data'for main:object(nomethoderror) 我不了解这件代码.这是什么,为什么不起作用? send_data csv_data, :type => 'text/csv; charset=iso-8859-1; header=present', :disposition => "attachment; filename=products.csv" 完整代码: #!/usr/bin/ruby require 'rubygems' require 'anemone' require 'fastercsv' productsArray = Array.new class Product
以下是关于 ruby 的编程技术问答
我正在使用以下代码来生成一个包含特定网站的所有类别信息的JSON文件. require 'mechanize' @hashes = [] @categories_hash = {} @categories_hash['category'] ||= {} @categories_hash['category']['id'] ||= {} @categories_hash['category']['name'] ||= {} @categories_hash['category']['group'] ||= {} # Initialize Mechanize object a = Mechanize.new # Begin scraping a.get('http://www.marktplaats.nl/') do |page| groups = page.search('//*[(@id = "navigation-categories")]//a') group
我正在编写一个应用程序来爬网和从中删除数据.我正在使用Ruby,Curl和Nokogiri来做到这一点.在大多数情况下,它很简单,我只需要ping URL并解析HTML数据.该设置工作正常. 但是,在某些情况下,网站根据某些无线电按钮上的用户输入来检索数据.这调用了一些JavaScript,该JavaScript从服务器中获取了更多数据.生成的URL和发布的数据由JavaScript代码确定. 可以使用: JavaScript库以及此设置,它可以确定在我的HTML页面中执行JavaScript? 除了使用其他库,HTML和JS库是否有某种集成或一种方式进行通信?例如,如果单击一个按钮,Nokogiri需要致电JavaScript,然后JavaScript需要更新Nokogiri. 如果我的方法似乎不是最好的,那么您建议使用Ruby在网络上构建爬网 +刮刀的建议. 编辑:看起来1点1可以使用Therubyrace将V8引擎嵌入您的代码中,但是是否可以替代
这是预订网站源代码的一部分: booking.ensureNamespaceExists('env'); booking.env.b_map_center_latitude = 53.36480155016638; booking.env.b_map_center_longitude = -2.2752803564071655; booking.env.b_hotel_id = '35523'; booking.env.b_query_params_no_ext = '?label=gen173nr-17CAEoggJCAlhYSDNiBW5vcmVmaFCIAQGYAS64AQTIAQTYAQHoAQH4AQs;sid=e1c9e4c7a000518d8a3725b9bb6e5306;dcid=1'; 我想提取booking.env.b_hotel_id.这样我就可以获得" 25523"的价值.如何使用诺科吉里(Nokogiri)和机械化
我认为主题问这个问题,我通常会使用PHP进行解析/网络刮擦,但是我真的很糟糕的时间刮擦JavaScript ex:解析JavaScript执行时出现的DIV. 我阅读了有关javaScript的解析器库的Ruby,所以问题是wangaje是用于程序刮擦的languaje,它将有效刮擦JavaScript生成的内容?它在这里是PHP的图书馆,例如Ruby用于解析JavaScript内容的图书馆? 解决方案 为此有一些策略.根据您的需求,请考虑在语法上实例化浏览器实例,您可以将其连接到. 这个想法是,让浏览器完成工作,因为该页面是为浏览器而不是您的机器人制作的.然后,您可以使用浏览器插件来点击并刮掉,该浏览器插件将数据馈送到运行的主要应用程序中. 这可能对您需要的东西过大.我会给你决定. 其他解决方案 您应该查看一些无关/无头浏览器.有一些为爪哇写的.我没有找到一个php. 看: htmlunit 高尔夫 其他解决方案 您可以尝试使用
嗨,我正在Ruby构建一个程序,以生成网页上图像的Alt属性.我正在将图像的页面刮擦,然后将其SRC(换句话说)发送到Google-cloud-Vision以进行标签检测和其他云视觉方法.每个图像大约需要2-6秒.我想知道是否有任何方法可以减少响应时间.我首先使用tinypng压缩图像.云视觉的速度更快,但是压缩的时间远远超过了改进.如何改善响应时间?我会列出一些想法. 1)由于我们将URL发送到Google Cloud,因此Google Cloud收到响应需要时间,即来自IMG_SRC,甚至可以分析图像.发送Base64编码图像的速度更快吗?要发送(或真正供Google收到的)发送图像的最快形式是什么? cloud_vision = Google::Cloud::Vision.new project: PROJECT_ID @vision = cloud_vision.image(@file_name) @vision.labels #or @vision.web, etc
我想搜索网站的每个页面.我的想法是在页面上保留在域内,访问它们并重复的页面上的所有链接.我将必须采取措施,以免重复努力. 因此,它很容易开始: page = 'http://example.com' nf = Nokogiri::HTML(open(page)) links = nf.xpath '//a' #find all links on current page main_links = links.map{|l| l['href'] if l['href'] =~ /^\//}.compact.uniq " main_links"现在是以"/"开头的活动页面中的一系列链接(仅在当前域上链接). 从这里我可以喂食并将这些链接读取到上面的类似代码中,但是我不知道确保我不重复自己的最佳方法.我以为我在访问它们时开始收集所有访问的链接: main_links.each do |ml| visited_links = [] #new array of
我正在尝试使用Nokogiri和XPath从网站上刮擦图像,到目前为止取得了有限的成功.对于一个典型的HTML具有img和src的网站,我可以使用: tmp2 = Nokogiri::HTML(open(site_url)) tmp2.xpath("//img/@src").each do |src| ...do whatever end 但是,某些网站(例如Amazon和eBay)仅使用JavaScript触发某些图像.如果我查看代码,我可以在数组中看到数据.例如,来自 P.when('jQuery', 'cf').execute(function($, cf){ P.load.js('http://z-ecx.images-amazon.com/images/G/01/browser-scripts/imageBlock-udp-airy/imageBlock-udp-airy-4060168860._V1
我正在努力使用Ruby和以下教程构建一个简单的矿工( http://ngauthier.com/2014/06/scraping-the-web-with-ruby.html ) 这是我目前拥有的代码: #!/usr/bin/ruby require 'capybara' require 'capybara/poltergeist' include Capybara::DSL Capybara.default_driver = :poltergeist visit "http://dilloncarter.com" all(".posts .post ").each do |post| title = post.find("h1 a").text url = post.find("h1 a")["href"] date = post.find("a")["datetime"] summary = post.find("p.prev
我有一个大HTML页面.但是我想使用XPath选择某些节点: ........
some text
Some more elements
....... 我可以在之后选择HTML: "//comment()[. = ' begin content ']/following::*" 也可以在之前选择HTML: "//comment()[. = ' end content ']/preceding::*" 但是我必须有xpath才能选择两个评论之间的所有html? 解决方案 我会寻找先于第一个评论的元素,然后是第二条评论: doc.xpath("//*[preceding::comm
我正在使用机械化来构建一个脚本来从网站上刮擦数据.该脚本应该单击"读传记"链接,然后在下一页上刮擦成员的传记. 这是耙子文件中的脚本: require 'mechanize' require 'date' require 'json' task :testing2 do agent = Mechanize.new page = agent.get("https://www.congress.gov/members") page_links = page.links_with(href: %r{.*/member/\w+}) member_links = page_links[0...2] members = member_links.map do |link| member = link.click name = member.search('title').text.split('|')[0]
我想从 在head > script > var token中. 我不知道该变量是如何由浏览器设置的,因为当我从机械化中获得此页面时,我会得到: var token = '' || 'empty-token', 这是我用来获取此页面的代码: login_url = "https://admin.booking.com/hotel/hoteladmin" agent = Mechanize.new agent.verify_mode= OpenSSL::SSL::VERIFY_NONE page = agent.get(login_url) 解决方案 如果要通过Mechanizize/Watir中的JavaScript访问此令牌,则还需要使用浏览器开发人员工具访问它. 不幸的是,变量本身封闭在范围中,这使得不可能像这样访问它.您可以在此出色帖子中阅读JS中许多不同类型的范围的更多信息: JavaScript中变量的范围是什么? 现在回答您的问题.当然
我使用诺科吉里(Nokogiri 当我尝试删除AngularJS页面时,我遇到了一些问题,因为宝石在完全渲染之前打开了HTML. 有其他方法可以报废此类型的页面吗?在刮擦之前,我该如何使页面完全渲染? 解决方案 如果您想以完全通用的方式刮擦AngularJS页面,那么您可能会需要@tadman在评论中提到的内容(Phantomjs) - 某种完全的无头浏览器处理AngularJS JavaScript并打开DOM以后进行检查. 如果您有要刮擦的特定站点或网站,则阻力最小的路径可能完全避免了AngularJS的前端,并直接查询了角度代码从中拉出内容的API.许多/大多数AngularJS网站的标准方案是,它们拉下了静态JS和HTML代码/模板,然后他们将Ajax召集回服务器(他们自己的或某些第三方API),以获取将是的内容渲染.如果您查看其代码,则可以直接查询任何角度呼叫的内容(即通过$ http,ngresource或Restangular).返回数据通常是JSON
我正在尝试刮擦这些清单,并在属于我的客户的网站上为这些工作清单提供更多的曝光率.问题是,我需要能够链接到特定的作业清单,以便求职者申请. 这是页面我正在尝试从. 如果我可以为求职者保存一个地址以单击以查看原始清单然后申请,那将是理想的选择. 本网站在没有为这些页面的URL 做些什么 是否可以提供列表特定地址 如果有可能,我该如何生成该地址? 如果我无法获得特定的地址,我认为我可以得到它,以便用户单击一个触发客户端网站上的内部脚本的链接,该链接获取列表ID并搜索我发现该列表的网站,并且然后将用户重定向到该特定清单. 不利的一面是,用户必须等待一会儿,具体取决于列表在目录上的距离.我可以将某种进度栏放在一个令人愉快的"寻找您的清单!感谢您的耐心"消息的情况下. ,如果我能避免这样做,那就太好了! 我正在使用Nokogiri并机械化. 解决方案 您所指的页面似乎是由Oracle产品生成的,因此人们认为他们愿意正确构建网络表单(并参考可访问性问题).他
我刚刚开始学习轨道.您能帮我了解解析单个链接吗?好教程也会有所帮助... 问题: 当您在DIGG,Facebook等中提交链接时.表示附加链接后,它解析了链接以获取标题,内容,特定URL的图像.您能帮我如何在铁轨中实施类似的事情? 我已经看过诸如feedzirra等的饲料解析器,但它们似乎获得了完整的网站feed ..不仅是我们正在寻找的链接..还是我在某个地方犯了一个错误? 非常感谢. 解决方案 看起来您可能正在寻找诸如Pismo之类的东西: https://github.com/peterc/pismo require 'pismo' # Load a Web page (you could pass an IO object or a string with existing HTML data along, as you prefer) doc = Pismo::Document.new('http://www.rubyinside.com