Witam.
W jaki sposób można pobrać IP i porty ze strony http://hidemyass.com/proxy-list/ ?
tam każda cyferka jest w osobnym <span>
, jak to można pobrać ?
A jak sądzisz po kiego tak zrobili?
Poza tym, że są powciskane niewidoczne na stronie liczby pomiędzy poszczególne części adresu. Radzę odpuścić sobie tą stronę, bo mogą utrudnienia w parsowaniu z czasem nawarstwiać
Sarrus napisał(a):
Poza tym, że są powciskane niewidoczne na stronie liczby pomiędzy poszczególne części adresu. Radzę odpuścić sobie tą stronę, bo mogą utrudnienia w parsowaniu z czasem nawarstwiać
a z tej strony byloby latwiej ?
http://free-proxy-list.net/
No pewnie że łatwiej - całe adresy IP i numery portów są zapisane w poszczególnych komórkach tabeli; Łatwiej nie oznacza łatwo, bo i tak trzeba wiedzieć jak parsować źródło strony i wyłuskać odpowiednie dane;
Poza tym nie napisałeś czym chcesz przetwarzać źródło strony, więc podaj jakiś język/technologię.
Na obu stronach to do zrobienia tylko na pierwszej więcej zabawy bo parsując IP trzeba brać pod uwagę tylko liczby pomiędzy tagami mającymi style="display:inline"
lub jedną z 3 nazw klas określonych w style (wyżej) .nazwa_losowa{display:inline}
.
język w którym chce pisać to VB, lecz nie wiem jak to wyciągnąć z tabeli =/
Dim sHTML As String = RichTextBox1.Text 'ja dla testu mam kod HTML w RichTextBox
Dim myRegex As New Regex("<tr><td>([0-9\.]+)</td><td>([0-9]+)</td>")
Dim myMatches As MatchCollection = myRegex.Matches(sHTML)
For Each myMatch As Match In myMatches
ListBox1.Items.Add(myMatch.Groups(1).Value & ":" & myMatch.Groups(2).Value) 'Groups(1) to IP Groups(2) to Port
Next
EDIT Gdybyś nie wiedział trzeba Imports System.Text.RegularExpressions
Zapomniałem o portach :D. Ale niech to będzie zadanie domowe, najciekawszą część zrobiłem za ciebie. No i nie w jakiś Visual Basicach ;). Wymaga HtmlAgilityPack.
IEnumerable<string> GetProxies(string source)
{
var document = new HtmlDocument();
document.LoadHtml(source);
return from row in document.DocumentNode.SelectNodes(@"//table[@id='listtable']/tr/td[2]/span")
let classes = GetHideClasses(row.SelectSingleNode("./style").InnerText)
let parts = from element in row.SelectNodes("./*[not(self::style)] | ./text()")
where IsElementVisible(element, classes)
select element.InnerText
select string.Concat(parts);
}
bool IsElementVisible(HtmlNode node, IEnumerable<string> hideClasses)
{
string style = node.GetAttributeValue("style", null);
if (style != null && style.Contains("display:none"))
return false;
string @class = node.GetAttributeValue("class", null);
if (@class != null && hideClasses.Contains(@class))
return false;
return true;
}
IEnumerable<string> GetHideClasses(string stylesheet)
{
return Regex.Matches(stylesheet, @"\.(?<class>.+)\{display:none\}")
.OfType<Match>()
.Select(m => m.Groups["class"].Value);
}