Как читать чужой форум - PullRequest
       32

Как читать чужой форум

2 голосов
/ 14 января 2010

У моего друга есть форум, который полон сообщений, содержащих информацию. Иногда она хочет просмотреть сообщения на своем форуме и прийти к выводам. В данный момент она просматривает сообщения, просматривая свой форум, и генерирует не обязательно точную картину данных (в своем мозгу), из которых она делает выводы. Сегодня я подумал, что, возможно, смогу создать быстрый скрипт на Ruby, который будет анализировать необходимый HTML, чтобы дать ей реальное представление о том, что говорят данные.

Сегодня я впервые использую библиотеку Ruby net / http, и у меня возникла проблема. Хотя у моего браузера нет проблем с просмотром форума моего друга, похоже, что метод Net :: HTTP.new ("forumname.net") выдает следующую ошибку:

Невозможно установить соединение, так как целевой компьютер активно отказал в этом. - подключить (2)

Погуглив эту ошибку, я узнал, что она имеет отношение к MySQL (или что-то в этом роде), не желая любопытных парней вроде меня удаленно ковыряться там: по соображениям безопасности. Это имеет смысл для меня, но заставляет задуматься: как мой браузер может копаться в форуме моего друга, но мой маленький скрипт на Ruby не получает никаких прав. Есть ли способ для моего скрипта сказать серверу, что это не угроза? Что я хочу только права на чтение, а не права на запись?

Спасибо, ребята,

г.

Ответы [ 2 ]

6 голосов
/ 14 января 2010

Очистка веб-сайта? Используйте механизировать :

#!/usr/bin/ruby1.8

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get("http://xkcd.com")
page = page.link_with(:text=>'Forums').click
page = page.link_with(:text=>'Mathematics').click
page = page.link_with(:text=>'Math Books').click
#puts page.parser.to_html    # If you want to see the html you just got
posts = page.parser.xpath("//div[@class='postbody']")
for post in posts
  title = post.at_xpath('h3//text()').to_s
  author = post.at_xpath("p[@class='author']//a//text()").to_s
  body = post.xpath("div[@class='content']//text()").collect do |div|
    div.to_s
  end.join("\n")
  puts '-' * 40
  puts "title: #{title}"
  puts "author: #{author}"
  puts "body:", body
end

Первая часть вывода:

----------------------------------------
title: Math Books
author: Cleverbeans
body:
This is now the official thread for questions about math books at any level, fr\
om high school through advanced college courses.
I'm looking for a good vector calculus text to brush up on what I've forgotten.\
 We used Stewart's Multivariable Calculus as a baseline but I was unable to pur\
chase the text for financial reasons at the time. I figured some things may hav\
e changed in the last 12 years, so if anyone can suggest some good texts on thi\
s subject I'd appreciate it.
----------------------------------------
title: Re: Multivariable Calculus Text?
author: ThomasS
body:
The textbooks go up in price and new pretty pictures appear. However, Calculus \
really hasn't changed all that much.
If you don't mind a certain lack of pretty pictures, you might try something li\
ke Widder's Advanced Calculus from Dover. it is much easier to carry around tha\
n Stewart. It is also written in a style that a mathematician might consider no\
rmal. If you think that you might want to move on to real math at some point, i\
t might serve as an introduction to the associated style of writing.
1 голос
/ 14 января 2010

доступ к некоторым сайтам возможен только с поддоменом «www», поэтому это может быть причиной проблемы.

чтобы создать запрос на получение, вы должны использовать метод Get:

require 'net/http'

url = URI.parse('http://www.forum.site/')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}
puts res.body

u также может потребоваться установить пользовательский агент в какой-то момент в качестве опции:

{'User-Agent' => 'Mozilla/5.0 (Windows; U;
    Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1'})
...