[C#]Парсер. Нужна помощь

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Dead4ik, 12 Sep 2010.

  1. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Хочу написать парсер. Суть такова. Есть ссылки 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");
    		}
    	}
    }
     
  2. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Ничего из вопроса не понял...
     
  3. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Код из поста не корректно работает. Он сначала парсит страницу на которой находится, а когда цикл заканчивается, переходит на последнюю страницу
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Действительно, суть вопроса не указана. Помочь в реализации чего? Что парсер именно делать должен?
     
  5. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Парсер должен заходить на страницы /clan/x, и если в них есть фраза "<p>На этот клан можно будет напасть <b>", то он должен вывести текст от "<p>На этот клан можно будет напасть <b>" до </b>.</p> ".
     
  6. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Дай пожалуйста сайт, без него очень трудно что либо делать.
     
  7. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Не все так просто. Сайт - moswar.ru. Но, что бы видеть эту надпись нужно зарегистрироваться и вступить в клан
     
  8. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) -
    Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) -
    Имя 'page' отсутствует в текущем контексте (CS0103)
    Имя 'page' отсутствует в текущем контексте (CS0103)
    Имя 'str' отсутствует в текущем контексте (CS0103) -
    Имя 'myStreamReader' отсутствует в текущем контексте (CS0103) -
    Имя 'str' отсутствует в текущем контексте (CS0103) -

    __upd__
    Добавил StreamReader myStreamReader;
    String str;
    Осталась только исправить ошибку с page
    сделал string page
     
    #8 Dead4ik, 13 Sep 2010
    Last edited: 13 Sep 2010
  9. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Как сделать авторизацию? Страница авторизации - 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 странице нету такого текста, т.к. он не авторизировался)
     
    #9 Dead4ik, 13 Sep 2010
    Last edited: 13 Sep 2010
  10. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    И правда работает. Пишет authkey=[ключ], лэйбл успешно. Но когда нажимаю на парсить - Он пишет http://www.moswar.ru/clan/2=======, потом HTML этой странички. Но он все равно парсит не залогененным
     
  11. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    А как можно добавить именно куки? Если передавать sCookies, будете передаваться параметр authkey (или userid, player, если выбрать другую строку)
     
  12. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Все равно парсит не войдя
    Проснифя Httpanalyser'ом, (No Cookie Data), но если нажать на вкладку Cookie, то там есть все те же параметры - authkey, userid, player.
     
  13. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Заходишь на сайт, нажимаешь синию кнопку "Начать играть". Но что бы видеть надписи "На этот клан можно напасть", нужно вступить в клан, а это примерно через неделю задротства
     
  14. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    str = Parse("<td class=\"label\">Атака:</td>", page, "d>");
    Это от куда до чего искать? Большое спасибо
     
    #14 Dead4ik, 14 Sep 2010
    Last edited: 14 Sep 2010
  15. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Все работает, большое спасибо!
     
  16. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    Так, наконец получилось протестировать. Постаянно неправильно работает, просниффил - дело в логине. Сначала (для получения куки) он логиниться нормально, но когда начинает парсить - неверная авторизация, везде authkey=deleted, кроме того, когда логинится
    UPD:
    Неправильно передается cookie. В колоннах, например - Domain:.moswar.ru,authkey=[Правильный authkey], а в колоннах Set-Cookie все =deleted
     
    #16 Dead4ik, 18 Sep 2010
    Last edited: 18 Sep 2010
  17. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    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
    Вот что в кукис передается при парсинге
     
    #17 Dead4ik, 18 Sep 2010
    Last edited: 18 Sep 2010
  18. Dead4ik

    Dead4ik Member

    Joined:
    23 Jun 2009
    Messages:
    34
    Likes Received:
    25
    Reputations:
    5
    В браузере передаются кукисы ввида __utma= , __utmb= и т.д., сделал пока проще, добавил кукисы которые использует браузер. Но это очень плохой вариант