Механизированный ruby не может видеть весь контент в linkedin

#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'