Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   VB.NET пишем грабер rss. (https://forum.antichat.xyz/showthread.php?t=131151)

icqxaker 24.07.2009 12:15

VB.NET пишем грабер rss.
 
Привет всем =)
Сегодня мы будем писать грабер RSS. Но им можно грабить так же html/xml при желании
Писать мы будем на дотнете, а именно на VB.NET
Приступим.

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

Создадим проект и добавим User Control. Назовоем его rss_graber и напишем такой код:
Код:

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


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

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

Код:

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

Вопросы можете оставлять тут

Gar|k 24.07.2009 13:28

эм почему граббер тока мне интересно. он че хитит rss ленты? ) хех
помоему он просто их читает поэтому это скорее rss reader.

nerezus 25.07.2009 06:12

http://ru.wikipedia.org/wiki/Xml

nerezus 07.08.2009 15:00

На питоне
Код:

import feedparser
feed = feedparser.parse(ссылка)


Forcer 07.08.2009 15:18

Цитата:

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

это вообще клиника!


Время: 15:20