首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kimurai gem进行Web抓取

问使用Kimurai gem进行Web抓取
EN

Stack Overflow用户
提问于 2020-01-29 04:26:05
回答 2查看 1.3K关注 0票数 3

我正在用Kimurai Ruby gem做一些网页抓取。我有一个运行得很好的脚本:

代码语言:javascript
复制
require 'kimurai'

class SimpleSpider < Kimurai::Base
  @name = "simple_spider"
  @engine = :selenium_chrome
  @start_urls = ["https://apply.workable.com/taxjar/"]

  def parse(response, url:, data: {})
    # Update response to current response after interaction with a browser
    count = 0
    # browser.click_button "Show more"
    doc = browser.current_response
    returned_jobs = doc.css('.careers-jobs-list-styles__jobsList--3_v12')
    returned_jobs.css('li').each do |char_element|
        # puts char_element
        title = char_element.css('a')[0]['aria-label']
        link = "https://apply.workable.com" + char_element.css('a')[0]['href']

        #click on job link and get description
        browser.visit(link)
        job_page = browser.current_response
        description = job_page.xpath('/html/body/div[1]/div/div[1]/div[2]/div[2]/div[2]').text

        puts '*******'
        puts title
      puts link
        puts description
        puts count += 1
    end
    puts "There are #{count} jobs total"
  end
end

SimpleSpider.crawl!

但是,在本例中,我希望所有这些都返回一个objects...or作业数组。我想在解析方法中创建一个作业数组,并在returned_jobs循环中执行类似jobs << [title, link, description, company]的操作,并在调用SimpleSpider.crawl!时返回该作业数组,但这不起作用。

感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-30 01:04:09

原来有一个允许返回值的parse method。以下是工作示例:

代码语言:javascript
复制
require 'open-uri'
require 'nokogiri'
require 'kimurai'

class TaxJar < Kimurai::Base
  @name = "tax_jar"
  @engine = :selenium_chrome
  @start_urls = ["https://apply.workable.com/taxjar/"]

  def parse(response, url:, data: {})
  jobs = Array.new

    doc = browser.current_response
    returned_jobs = doc.css('.careers-jobs-list-styles__jobsList--3_v12')
    returned_jobs.css('li').each do |char_element|
      title = char_element.css('a')[0]['aria-label']
      link = "https://apply.workable.com" + char_element.css('a')[0]['href']

      #click on job link and get description
      browser.visit(link)
      job_page = browser.current_response
      description = job_page.xpath('/html/body/div[1]/div/div[1]/div[2]/div[2]/div[2]').text
      company = 'TaxJar'
      puts "title is: #{title}, link is: #{link}, \n description is: #{description}"
      jobs << [title, link, description, company]
    end
    return jobs
  end
end

jobs = TaxJar.parse!(:parse, url: "https://apply.workable.com/taxjar/")
puts jobs.inspect

如果你正在抓取JS网站,与我尝试过的其他网站(waitr/selenium)相比,这个gem似乎相当健壮。

票数 2
EN

Stack Overflow用户

发布于 2020-01-29 08:10:33

您可以稍微修改代码,如下所示:

代码语言:javascript
复制
class SimpleSpider < Kimurai::Base
  @name = "simple_spider"
  @engine = :selenium_chrome
  @start_urls = ["https://apply.workable.com/taxjar/"]

  def parse(response, url:, data: {})
    # Update response to current response after interaction with a browser
    count = 0
    # browser.click_button "Show more"
    doc = browser.current_response
    returned_jobs = doc.css('.careers-jobs-list-styles__jobsList--3_v12')

    jobs = []
    returned_jobs.css('li').each do |char_element|
        # puts char_element
        title = char_element.css('a')[0]['aria-label']
        link = "https://apply.workable.com" + char_element.css('a')[0]['href']

        #click on job link and get description
        browser.visit(link)
        job_page = browser.current_response
        description = job_page.xpath('/html/body/div[1]/div/div[1]/div[2]/div[2]/div[2]').text

        jobs << [title, link, description]
    end

    puts "There are #{jobs.count} jobs total"
    puts jobs
  end
end

我对公司不太确定,因为我在你的代码中看不到这个变量。但是,您可以看到调用上面的数组并在其上工作的想法。

以下是在终端中运行的输出的一部分:

​

​

我还有一篇关于如何使用Ruby on Rails应用程序中的Kimurai框架的博客文章here。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59956507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档