Хочу написать парсер. Суть такова. Есть ссылки moswar.ru/clan/x. X<500. На некоторых страницах есть "<p>На этот клан можно будет напасть <b>" и потом дата : "13.09.2010 09:07:01</b>.</p> ". Помогите в реализации. Имеется уже такой код: Code: /* * Created by SharpDevelop. * User: Dead4ik * Date: 30.08.2010 * Time: 20:44 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.IO; using System.Text; using System.Web; namespace Moswar { /// <summary> /// Description of MainForm. /// </summary> public partial class MainForm : Form { public int clan=241; public string HtmlText; public string str2; public int first; public int last; public string nav; public MainForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // } void Label1Click(object sender, EventArgs e) { } void Label3Click(object sender, EventArgs e) { } void Button1Click(object sender, EventArgs e) { GetHTML(); } void MainFormLoad(object sender, EventArgs e) { } void GetHTML() { Encoding enc = Encoding.GetEncoding("windows-1251"); for (;clan<258;clan++) //foreach (int a in new int[] {1, 2, 3, 4, 257}) { GoMoswar(clan); System.Threading.Thread.Sleep(1000); GetHTMLText(); /*if (HtmlText.Contains("На")) { if (HtmlText.Contains("этот")) { if (HtmlText.Contains("клан")) {*/ if (HtmlText.Contains("можно будет")) { HtmlText.StartsWith("<p>На этот клан можно будет напасть <b>", System.StringComparison.CurrentCultureIgnoreCase); HtmlText.EndsWith("</b>.</p>", System.StringComparison.CurrentCultureIgnoreCase); first = HtmlText.IndexOf("<p>На этот клан можно будет напасть <b>") + "<p>На этот клан можно будет напасть <b>".Length; last = HtmlText.LastIndexOf("Этот клан сможет напасть"); str2 = HtmlText.Substring(first, last - first); textBox3.Text+=str2+" "+webBrowser1.Url+Environment.NewLine; //str2=""; textBox4.Text=HtmlText; /*} } } } else { textBox3.Text+="Error"; */ } } } void GoMoswar(int clan) { nav = ""; nav="moswar.ru/clan/"+clan; webBrowser1.Navigate(nav , false); } void GetHTMLText() { HtmlText=""; HtmlText=webBrowser1.DocumentText; } void Button2Click(object sender, EventArgs e) { if (webBrowser1.IsBusy==false) webBrowser1.Navigate("moswar.ru/clan/237"); } } }
Код из поста не корректно работает. Он сначала парсит страницу на которой находится, а когда цикл заканчивается, переходит на последнюю страницу
Парсер должен заходить на страницы /clan/x, и если в них есть фраза "<p>На этот клан можно будет напасть <b>", то он должен вывести текст от "<p>На этот клан можно будет напасть <b>" до </b>.</p> ".
Не все так просто. Сайт - moswar.ru. Но, что бы видеть эту надпись нужно зарегистрироваться и вступить в клан
Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) - Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) - Имя 'page' отсутствует в текущем контексте (CS0103) Имя 'page' отсутствует в текущем контексте (CS0103) Имя 'str' отсутствует в текущем контексте (CS0103) - Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) - Имя 'str' отсутствует в текущем контексте (CS0103) - __upd__ Добавил StreamReader myStreamReader; String str; Осталась только исправить ошибку с page сделал string page
Как сделать авторизацию? Страница авторизации - moswar.ru. Инпут акк - <input type="hidden" name="action" value="login"><label for="login-email"><b>E-mail</b>: </label><input type="text" name="email" id="login-email" maxlength="30"> Пароль - <label for="login-password"><b>Пароль</b>: </label><input type="password" name="password" id="login-password" maxlength="40"> Кнопка - <button type="submit" class="button"><span class="f"><i class="rl"></i><i class="bl"></i><i class="brc"></i><div class="c">Войти</div></span></button> Вот что оказалось в inbox.txt после запуска - http://rghost.ru/2612450 (Не на 1 странице нету такого текста, т.к. он не авторизировался)
И правда работает. Пишет authkey=[ключ], лэйбл успешно. Но когда нажимаю на парсить - Он пишет http://www.moswar.ru/clan/2=======, потом HTML этой странички. Но он все равно парсит не залогененным
А как можно добавить именно куки? Если передавать sCookies, будете передаваться параметр authkey (или userid, player, если выбрать другую строку)
Все равно парсит не войдя Проснифя Httpanalyser'ом, (No Cookie Data), но если нажать на вкладку Cookie, то там есть все те же параметры - authkey, userid, player.
Заходишь на сайт, нажимаешь синию кнопку "Начать играть". Но что бы видеть надписи "На этот клан можно напасть", нужно вступить в клан, а это примерно через неделю задротства
str = Parse("<td class=\"label\">Атака:</td>", page, "d>"); Это от куда до чего искать? Большое спасибо
Так, наконец получилось протестировать. Постаянно неправильно работает, просниффил - дело в логине. Сначала (для получения куки) он логиниться нормально, но когда начинает парсить - неверная авторизация, везде authkey=deleted, кроме того, когда логинится UPD: Неправильно передается cookie. В колоннах, например - Domain:.moswar.ru,authkey=[Правильный authkey], а в колоннах Set-Cookie все =deleted
PHPSESSID=[censored]; path=/,authkey=deleted; expires=Fri, 18-Sep-2009 12:52:36 GMT; path=/,userid=deleted; expires=Fri, 18-Sep-2009 12:52:36 GMT; path=/,authkey=deleted; expires=Fri, 18-Sep-2009 12:52:36 GMT; path=/; domain=.moswar.ru,userid=deleted; expires=Fri, 18-Sep-2009 12:52:36 GMT; path=/; domain=.moswar.ru,authkey=[censored]; expires=Mon, 18-Oct-2010 12:52:37 GMT; path=/; domain=.moswar.ru,userid=188313; expires=Mon, 18-Oct-2010 12:52:37 GMT; path=/; domain=.moswar.ru,player=Dead4ik; expires=Mon, 18-Oct-2010 12:52:37 GMT; path=/; domain=.moswar.ru Вот что в кукис передается при парсинге
В браузере передаются кукисы ввида __utma= , __utmb= и т.д., сделал пока проще, добавил кукисы которые использует браузер. Но это очень плохой вариант