Соскоб с помощью Kimurai - PullRequest
2 голосов
/ 28 января 2020

Я занимаюсь веб-копированием с Kimurai Ruby gem . У меня есть этот скрипт, который прекрасно работает:

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!

Однако я хочу, чтобы все это возвращало массив объектов ... или заданий в этом случае. Я хотел бы создать массив заданий в методе parse и сделать что-то вроде jobs << [title, link, description, company] внутри returned_jobs l oop и получить его, когда я вызываю SimpleSpider.crawl!, но это не работает.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Оказывается, существует метод синтаксического анализа , который позволяет возвращать значение. Вот рабочий пример:

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), которые я пробовал.

1 голос
/ 29 января 2020

Вы можете немного изменить свой код следующим образом:

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

Я не уверен насчет компании, поскольку не вижу этой переменной в вашем коде. Тем не менее, вы можете увидеть идею вызова массива выше и работать над этим.

Вот часть вывода, работающего в терминале:

Screen

У меня также есть запись в блоге здесь о том, как использовать Kimurai Framework из Ruby в приложении Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...