#ruby-on-rails #ruby #web-scraping #mechanize
#ruby-on-rails #ruby #очистка веб-страниц #механизировать
Вопрос:
Я установил драгоценный камень mechanize в приложении rails и для его тестирования просто копирую и вставляю приведенный ниже код в консоль irb. Он входит на страницу, и я могу ввести Orange в поле поиска и отправить, но затем на следующей странице нет содержимого с «Orange» или ни одного из сотрудников orange, которые я вижу в своем браузере. Есть ли в linkedin какие-либо функции безопасности, чтобы остановить это, или я делаю что-то не так?
require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'open-uri'
#create agent
agent = Mechanize.new { |agent|
agent.user_agent_alias = 'Mac Safari 4'
}
agent.follow_meta_refresh = true
#visit page
page = agent.get("https://www.linkedin.com/")
#login
login_form = page.form('login')
login_form.session_key = "email"
login_form.session_password = "password"
page = agent.submit(login_form, login_form.buttons.first)
# get the form
form = agent.page.form_with(:name => "commonSearch")
#fill form out
form.keywords = 'Orange France'
# get the button you want from the form
button = form.button_with(:value => "Search")
# submit the form using that button
agent.submit(form, button)
agent.page.link_with(:text => "Orange")
=> nil
Комментарии:
1. Шансы действительно хороши, у них есть JavaScript, загружающий содержимое их страниц. Mechanize не может помочь вам в этом случае. Однако вместо очистки вам следует взглянуть на их API .
2. @Mlennie у вас есть какие-либо обходные пути?
Ответ №1:
Проблема с Mechanize заключается в том, что он не будет работать напрямую с загруженным JavaScript контентом, как тот, который найден в этом сценарии с помощью поиска LinkedIn.
Решение для этого — посмотреть на тело страницы и использовать регулярные выражения для получения желаемого контента, а затем проанализировать результаты в формате JSON.
Например:
url = "http://www.linkedin.com/vsearch/p?type=peopleamp;keywords=dario barrionuevo"
results = agent.get(url).body.scan(/{"person":{.*?}}/)
person = results.first # You'd use an each here, but for the example we'll get the first
json = JSON.parse(person)
json['person']['firstName'] # => 'Dario'
json['person']['lastName'] # => 'Barrionuevo'