icqxaker
24.07.2009, 12:15
Привет всем =)
Сегодня мы будем писать грабер 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.FromBase64Strin g("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
Вопросы можете оставлять тут (http://www.planety-hackeram.ru/showthread.php?t=13806)
Сегодня мы будем писать грабер 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.FromBase64Strin g("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
Вопросы можете оставлять тут (http://www.planety-hackeram.ru/showthread.php?t=13806)