VB.NET пишем грабер rss.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by icqxaker, 24 Jul 2009.

  1. icqxaker

    icqxaker New Member

    Joined:
    4 Jun 2007
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Привет всем =)
    Сегодня мы будем писать грабер RSS. Но им можно грабить так же html/xml при желании
    Писать мы будем на дотнете, а именно на VB.NET
    Приступим.

    Для написания грабера конечно можно юзать соткеты, но мы пойдем более простым путем – используем класс WebClient. Так же в проге будут регулярные выражения. -Т.е. мы ищем тег, к примеру <html> добавляем к начальной позиции его длину и едем пока не наткнемся на следующий тег (<). Приступим

    Создадим проект и добавим User Control. Назовоем его rss_graber и напишем такой код:
    Code:
    Imports System.Web
    Imports System.Net
    Imports System.IO
    Imports System.Text
    Imports System.Threading
    Public Class rss_graber
        Dim URL, KEY, END1, posle As String ' буферчеГи
        Dim rss As New WebClient 'сам граберчеГ
        Public WithEvents th As New System.ComponentModel.BackgroundWorker '
        ' события
        Public Event data(ByVal data As String, ByVal key As String) ' приход данных
        Public Event rss_error() ' ошибочка(
        ' -----------------------
        Public Sub get_rss(ByVal URL_ As String, ByVal key_ As String, ByVal end_s As String, ByVal posle_ As String) ' начинаем грабить rss
            URL = URL_ 'запоминаем URL rss'ки
            KEY = key_ 'запоминаем ключеГ
            END1 = end_s ' чем заканчивается (например <)
            posle = posle_ ' после чего искать (юзать чтоб обрезать заголовок)
            While th.IsBusy ' еси мы уже что то грабим то ждемс ;)
                Application.DoEvents()
            End While
            th.RunWorkerAsync() 'включаем другой поточеГ
        End Sub
        Public Sub about()
            MessageBox.Show(Encoding.Default.GetString(Convert.FromBase64String("UlNTIEdSQUJFUiBieSBEYXJrX0xvcmQ=")), Encoding.Default.GetString(Convert.FromBase64String("z+vg7eXy8yAtIPXg6uXw4Ow=")), MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Sub
    
        Private Sub th_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles th.DoWork
            Dim rss_code As String = rss.DownloadString(URL) 'загружаем код и запоминаем
            If posle <> "" Then rss_code = Mid(rss_code, InStr(rss_code, posle) + Len(posle)) ' еси мы ищем не с начала то удаляем лишнее
            If rss2str(rss_code, KEY, END1) <> "False" Then ' еси все гуд
                RaiseEvent data(rss2str(rss_code, KEY, END1), KEY) ' выводим данные
            Else 'еси чет не гуд
                RaiseEvent rss_error() ' выдаем ошибочку
            End If
        End Sub
    
        Private Function rss2str(ByVal rss_code As String, ByVal par As String, ByVal end_s As String) As String 'доп функция
            Dim p As Integer = InStr(rss_code, par) + Len(par) ' находим нужный нам ключ
            Dim value As String ' буферчеГ
            If p = 0 Then Return "False" ' еси не нашли то возвращаем false
            While Mid(rss_code, p, 1) <> end_s ' еси нашли то берем один символ и смотрим, еси он не равен < то идем далее
                value &= Mid(rss_code, p, 1) ' добавляем наш символ в буффер
                p = p + 1 ' добавляем одЫн
            End While ' едем по циклу
            Return value ' выдаем значение
        End Function
    End Class
    

    Ну думаю комментарии понятны.

    Юзать его так:

    Code:
    Imports System.Text
    Public Class Form1
        Dim WithEvents rss_graber As New rss_graber
        Dim data1 As String
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            rss_graber.get_rss("http://rian.ru/export/rss2/politics/index.xml", "<description>", "<", "<item>") ' начинаем грабить
        End Sub
        Private Sub rss_graber_data(ByVal data As String, ByVal key As String) Handles rss_graber.data
            key = Replace(key, "<", "") ' удаляем теги
            key = Replace(key, ">", "") ' ....
            data1 = key & " : " & data & vbCrLf ' добавляем в буффер
        End Sub
    
        Private Sub rss_graber_rss_error() Handles rss_graber.rss_error
            data1 = "Ошибка при получении данных" & vbCrLf ' еси ошибкО
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If data1 <> "" Then ' еси данные есть то
                data1 = Encoding.UTF8.GetString(Encoding.Default.GetBytes(data1)) ' меняем кодировку на нужную нам
                TextBox1.Text &= data1 ' добавляем данные
                data1 = "" ' чистем буферчеГ
            End If
        End Sub
    End Class
    
    Далее можно писать ботов но это уже как говорится для самостоятельного изучения :derisive:

    P.S. Сорцы в приложении.

    (c) Dark_Lord. Специально для planety-hackeram.ru

    http://slil.ru/27856496

    Вопросы можете оставлять тут
     
    #1 icqxaker, 24 Jul 2009
    Last edited: 24 Jul 2009
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    эм почему граббер тока мне интересно. он че хитит rss ленты? ) хех
    помоему он просто их читает поэтому это скорее rss reader.
     
    _________________________
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    http://ru.wikipedia.org/wiki/Xml
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    На питоне
    Code:
    import feedparser
    feed = feedparser.parse(ссылка)
    
     
  5. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    это вообще клиника!