Mechanize Rails - Web Scraping - Сервер отвечает JSON - Как разобрать URL-адрес, чтобы загрузить CSV - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в механизации и пытаюсь преодолеть этот, вероятно, очень очевидный ответ.

Я собрал короткий скрипт для авторизации на внешнем сайте, затем щелкнул ссылку, которая динамически генерирует файл CSV.

Я наконец получил его, чтобы нажать кнопку экспорта, однако,возвращает URL-адрес AWS.

Я пытаюсь получить скрипт для загрузки указанного CSV из этого ответа JSON (см. Ниже).

Myscript.rb

require 'mechanize'
require 'logger'
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'zlib'    
USERNAME = "myemail"
    PASSWORD = "mysecret"
    USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"

    mechanize = Mechanize.new do |a|
      a.user_agent = USER_AGENT
    end

    form_page = mechanize.get('https://XXXX.XXXXX.com/signin')
    form = form_page.form_with(:id =>'login')
    form.field_with(:id => 'user_email').value=USERNAME
    form.field_with(:id => 'user_password').value=PASSWORD
    page = form.click_button

    donations = mechanize.get('https://XXXXX.XXXXXX.com/pages/ACCOUNT/statistics')
    puts donations.body

    donations = mechanize.get('https://xxx.siteimscraping.com/pages/myaccount/statistics')
    bs_csv_download = page.link_with(:text => 'Download CSV')

JSON-ответ с веб-сайта, содержащего ссылку на CSV Мне нужно проанализировать и скачать через Mechanize и / или nokogiri.

{"message":"Find your report at https://s3.amazonaws.com/reports.XXXXXXX.com/XXXXXXX.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=AKIAIKW4BJKQUNOJ6D2A%2F20190228%2Fus-east-1%2Fs3%2Faws4_request\u0026X-Amz-Date=20190228T025844Z\u0026X-Amz-Expires=86400\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=b19b6f1d5120398c850fc03c474889570820d33f5ede5ff3446b7b8ecbaf706e"}

Я очень ценю любую помощь.

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете проанализировать его как JSON и затем извлечь подстроку из ответа (при условии, что он всегда отвечает в одном и том же формате):

require 'json'

...

bs_csv_download = page.link_with(:text => 'Download CSV')
json_response = JSON.parse(bs_csv_download)
direct_link = json_response["message"][20..-1]
mechanize.get(direct_link).save('file.csv')

Мы получаем 20-й символ в значении "message"с [20..-1] (-1 означает до конца строки).

...