گرفتن title یک سایت با C#‎ تحت desktop

zootos

عضو جدید
سلام

چطوری میشه title یک سایت با C#‎ تحت desktop گرفت
لطفا یکی راهنماییم کنه.
یعنی آدرس سایت رو بهش بدی title سایت رو برام برگردونه.
ممنون می شم کمکم کنید.
ممنون
 

Sharif_

مدیر بازنشسته
فکر کنم از کلاس webclient خاصیت download string بود
باز دوستان در صورت غلط بودن میان تصحیح می کنن
 

zootos

عضو جدید
فکر کنم از کلاس webclient خاصیت download string بود
باز دوستان در صورت غلط بودن میان تصحیح می کنن


میدونم اینم کدش ولی می خوامیه قیمتی از سورس اونم title ش رو می خ.ام

string url = "http://www.unicomp.ir";
System.Net.WebClient webClient = new System.Net.WebClient();
string strSource = webClient.DownloadString(url);
webClient.Dispose();
textBox1.Text = strSource;
 

A.S.Roma

عضو جدید
کاربر ممتاز
خودتون استرینگ دریافتی رو با compare محدود کنید به تگ title . درسته به نظر optimized نمیاد اما فکر نمی کنم راه دیگه ای داشته باشه .
 

zootos

عضو جدید
قسمتی از title سایت رو می خوام.

قسمتی از title سایت رو می خوام.


قسمتی از title سایت رو می خوام.
چرا اوپیموم هم می شه کرد (با php به راحتی) اما با C# می خواستم بدونم می شه فقط درخواست ارسال title رو سرور کرد یا نه؟
 

A.S.Roma

عضو جدید
کاربر ممتاز
قسمتی از title سایت رو می خوام.
چرا اوپیموم هم می شه کرد (با php به راحتی) اما با C# می خواستم بدونم می شه فقط درخواست ارسال title رو سرور کرد یا نه؟
با ASP.NET هم خیلی راحت میشه ( Page.Title ) اما شما تحت ویندوز می خواهید.
تحقیق می کنم اگر روش ساده تری بود اعلام می کنم.

//-----------------------------------
فکر می کنم یه راه دیگرش هم این باشه که یک webbrowser تو برنامت داشته باشی که page رو لود کنه بعد با یه تابع جاوا اسکریپت title رو بخونی ( که البته روش بالا ساده تر هست. )
 
آخرین ویرایش:

beginner2001

عضو جدید
واقعا که دمتتون گرم با این راهنمایی تون

واقعا شرمنده من این تاپیک رو دیر دیدم که جواب بدم
در هر صورت کد ها رو بارتون میزارم . خیلی سادست 10 دقیقه طول کشید که نوشتم
سوالی یود درخدمتم

کد:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
             //Fetched the title By Beginner
            // Fetching Web site Titles By Moslem Salehi

    string sFullHtml = Beginner.FetchHTML(textBox1.Text);//Type the URL In TextBox1
    string sTitle = Beginner.FetchTitleFromHTML(sFullHtml);
    textBox2.Text = sTitle;//See The Result in Textbox 2 
        }
    }
  	public class Beginner
	{
	    public static string FetchHTML(string sUrl)
	    {
	        System.Net.WebClient oClient = new System.Net.WebClient();
	        return oClient.DownloadString(sUrl);
       
	    }
	    public static string FetchTitleFromHTML(string sHtml)
	    {
	        string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
	        System.Text.RegularExpressions.Regex ex = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
	        return ex.Match(sHtml).Value.Trim();
	 
    }
	 
	}
}

فایل پروژه رو هم واستون گداشتم
 

پیوست ها

  • WindowsFormsApplication1.zip
    39.2 کیلوبایت · بازدیدها: 0

zootos

عضو جدید
سلام داداش دمت گرم اگه اون بالا رو می خوندی می فهمیدی که من خودم این کد رو یجور دیگه نوشتم و می خواستم بدونم کسی می تونه اوپتیموم کنه یعنی من همه کد رو دانلود نکنم چون مثلا فک کن واسه 1000 تا سایت این کار رو بکنه خیلی تول میکشه که حالا این وسط رفت و برگشت به دیتابیس هم بهش اضافه شه
ایجوری می خواستم....
بازم ممنون.
 

beginner2001

عضو جدید
قسمتی از title سایت رو می خوام.
چرا اوپیموم هم می شه کرد (با php به راحتی) اما با C# می خواستم بدونم می شه فقط درخواست ارسال title رو سرور کرد یا نه؟

دوست عزیر به کدها دقت نکردی ! کلاس beginner در این کد فقط درخواست ارسال title رو به سرور ارسال می کنه

کد:
string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";

همونطور که در کد بالا میبنین درخواست به سرو ارسال می شه که هرچیزی بین تگ <title > وجود داره رو برای شما ارسال میکنه نه چیزه دیگه بعید میدونم از این سریعتر بشه !
 

A.S.Roma

عضو جدید
کاربر ممتاز
دوست عزیر به کدها دقت نکردی ! کلاس beginner در این کد فقط درخواست ارسال title رو به سرور ارسال می کنه

کد:
string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
همونطور که در کد بالا میبنین درخواست به سرو ارسال می شه که هرچیزی بین تگ <title > وجود داره رو برای شما ارسال میکنه نه چیزه دیگه بعید میدونم از این سریعتر بشه !
خیر !!
شما دارید یه استرینگ بزرگ رو Filter می کنید ! حالا می خواد RegularExpression باشه میخواد Compare . این دوستمون از اول متدی رو می خواست که فقط Title رو بگیره نه Title رو جداکنه .
 

beginner2001

عضو جدید
خیر !!
شما دارید یه استرینگ بزرگ رو Filter می کنید ! حالا می خواد RegularExpression باشه میخواد Compare . این دوستمون از اول متدی رو می خواست که فقط Title رو بگیره نه Title رو جداکنه .

کاملا حق با شماست من در مورد سوال دچار سوتفاهم شدم .ببخشید

حالا دوستانی که بیشتر واردن بیان یه روش دیگه ای بدن که سریعتر از اونی که من گفتم باشه !!
تنها راه شما اینه که title رو جدا کنی . آیا راه دیگه ای هم هست ؟ اگه آره بیشتر توضیح بدین
 
آخرین ویرایش:

A.S.Roma

عضو جدید
کاربر ممتاز
کاملا حق با شماست من در مورد سوال دچار سوتفاهم شدم .ببخشید

حالا دوستانی که بیشتر واردن بیان یه روش دیگه ای بدن که سریعتر از اونی که من گفتم باشه !!
تنها راه شما اینه که title رو جدا کنی . آیا راه دیگه ای هم هست ؟ اگه آره بیشتر توضیح بدین

اگه مکانیزم کار رو مرور کنیم مشخصه که شما با یه صفحه HTML سر و کار داریم .
( صفحات PHP و ASP هم بعد از پردازش در سرور به html تبدیل میشن. )

بنابراین با Text سرو کار داریم .
تنها راهی که به نظر میرسه چیزی شبیه به StreamReader هست که خاصیت ReadLine و خاصیت Read ( از محدوده خاصی ) رو داره .
که با کلاس WebClient امتحان کردم و نتیجه قابل قبول بود ( از نظر سرعت اجرای برنامه ! )
کد:
private void button2_Click(object sender, EventArgs e)
        {
            StreamReader sr = StreamReader.Null;
            Stream myStream = Stream.Null;
            string title = string.Empty;
            try
            {
                WebClient myWebClient = new WebClient();
                foreach (var item in listBox1.Items)
                {
                    myStream = myWebClient.OpenRead(item.ToString());
                    sr = new StreamReader(myStream);
                    do
                    {
                        title = FetchTitleFromHTML(sr.ReadLine());
                    } while (title == string.Empty && sr.EndOfStream != true);
                    if (title != string.Empty)
                        listBox2.Items.Add(title);  //Submit Title in ListBox
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                myStream.Close();
                sr.Close();
                sr.Dispose();
            }
        }
»»@begiiner با اجازه از متد FetchTitleFromHtml شما استفاده کردم :redface: ( البته ورودیش فرق می کنه ;) )

پی نوشت : به برنامه یه تایمر هم اضافه کردم تا زمان اجرای متد رو حساب کنه اما فکر کنم یه جایشو اشتباه کردم ( تو محاسبات زمان ! ) . پروژه رو پیوست کردم ، دوستان می تونن دانلود کنن ایراد کار رو بگن .

فکر می کنم زمان رو درست حساب نمیکنه ! 489ms باید 4.8s باشه :D
 

پیوست ها

  • TitleApp.zip
    45.3 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

beginner2001

عضو جدید
اگه مکانیزم کار رو مرور کنیم مشخصه که شما با یه صفحه HTML سر و کار داریم .
( صفحات PHP و ASP هم بعد از پردازش در سرور به html تبدیل میشن. )

بنابراین با Text سرو کار داریم .
تنها راهی که به نظر میرسه چیزی شبیه به StreamReader هست که خاصیت ReadLine و خاصیت Read ( از محدوده خاصی ) رو داره .
که با کلاس WebClient امتحان کردم و نتیجه قابل قبول بود ( از نظر سرعت اجرای برنامه ! )
کد:
private void button2_Click(object sender, EventArgs e)
        {
            StreamReader sr = StreamReader.Null;
            Stream myStream = Stream.Null;
            string title = string.Empty;
            try
            {
                WebClient myWebClient = new WebClient();
                foreach (var item in listBox1.Items)
                {
                    myStream = myWebClient.OpenRead(item.ToString());
                    sr = new StreamReader(myStream);
                    do
                    {
                        title = FetchTitleFromHTML(sr.ReadLine());
                    } while (title == string.Empty && sr.EndOfStream != true);
                    if (title != string.Empty)
                        listBox2.Items.Add(title);  //Submit Title in ListBox
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                myStream.Close();
                sr.Close();
                sr.Dispose();
            }
        }
»»@begiiner با اجازه از متد FetchTitleFromHtml شما استفاده کردم :redface: ( البته ورودیش فرق می کنه ;) )

پی نوشت : به برنامه یه تایمر هم اضافه کردم تا زمان اجرای متد رو حساب کنه اما فکر کنم یه جایشو اشتباه کردم ( تو محاسبات زمان ! ) . پروژه رو پیوست کردم ، دوستان می تونن دانلود کنن ایراد کار رو بگن .

فکر می کنم زمان رو درست حساب نمیکنه ! 489ms باید 4.8s باشه :D

بازم زمان گرفتن title کمی زیاده چون بازم باید درخواست ارسال بشه و کل html رو ***** کنیم


کد:
public static string FetchTitleFromHTML(string sHtml)
        {
            string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
            System.Text.RegularExpressions.Regex ex = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            return ex.Match(sHtml).Value.Trim();

        }
حالا نظرتون در باره این روش چیه؟ من sr.ReadLine() شما رو اینطوری نوشتم
کد:
    try
    {
        WebRequest request = WebRequest.Create(url);
        request.Timeout = timeout;

        response = request.GetResponse();
        Stream streamReceive = response.GetResponseStream();
        Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
        StreamReader streamRead = new System.IO.StreamReader(streamReceive, encoding);

        while(streamRead.EndOfStream != true)
        {
            line = streamRead.ReadLine();
            if (line.Contains("<title>"))
            {
                line = line.Split(new char[] { '<', '>' })[2];
                break;
            }
        }
    }
 
آخرین ویرایش:

A.S.Roma

عضو جدید
کاربر ممتاز
ممنون از شما دوست عزیز ؛
روش شما با روشی که من نوشتم فرقی نداره . جفتمون دارین استریم رو خط به خط می خونیم .

بازم زمان گرفتن title کمی زیاده چون بازم باید درخواست ارسال بشه و کل html رو ***** کنیم
در مورد متدی که شما نوشتید و من استفاده کردم هم باید بگم که شما تو چندتا پست بالاتر کل html رو می خونید و پاس میدادید به متد. من یه خط می خونم .
 

zootos

عضو جدید
استفاده از multithread

استفاده از multithread

اگه مکانیزم کار رو مرور کنیم مشخصه که شما با یه صفحه HTML سر و کار داریم .
( صفحات PHP و ASP هم بعد از پردازش در سرور به html تبدیل میشن. )

بنابراین با Text سرو کار داریم .
تنها راهی که به نظر میرسه چیزی شبیه به StreamReader هست که خاصیت ReadLine و خاصیت Read ( از محدوده خاصی ) رو داره .
که با کلاس WebClient امتحان کردم و نتیجه قابل قبول بود ( از نظر سرعت اجرای برنامه ! )
کد:
private void button2_Click(object sender, EventArgs e)
        {
            StreamReader sr = StreamReader.Null;
            Stream myStream = Stream.Null;
            string title = string.Empty;
            try
            {
                WebClient myWebClient = new WebClient();
                foreach (var item in listBox1.Items)
                {
                    myStream = myWebClient.OpenRead(item.ToString());
                    sr = new StreamReader(myStream);
                    do
                    {
                        title = FetchTitleFromHTML(sr.ReadLine());
                    } while (title == string.Empty && sr.EndOfStream != true);
                    if (title != string.Empty)
                        listBox2.Items.Add(title);  //Submit Title in ListBox
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                myStream.Close();
                sr.Close();
                sr.Dispose();
            }
        }
»»@begiiner با اجازه از متد FetchTitleFromHtml شما استفاده کردم :redface: ( البته ورودیش فرق می کنه ;) )

پی نوشت : به برنامه یه تایمر هم اضافه کردم تا زمان اجرای متد رو حساب کنه اما فکر کنم یه جایشو اشتباه کردم ( تو محاسبات زمان ! ) . پروژه رو پیوست کردم ، دوستان می تونن دانلود کنن ایراد کار رو بگن .

فکر می کنم زمان رو درست حساب نمیکنه ! 489ms باید 4.8s باشه :D

سلام
ممنون از راهنمایی تون می خواستم بدونم می شه با multithread سرعتشو بالاتر ببریم؟
اگه می شه واسه اونم راهنماییم کنید.ممنون.
 

A.S.Roma

عضو جدید
کاربر ممتاز
من به شخصه تجربه کار با Thread ها را نداشته ام .
دوستان مجرب تر می تونن بهتر کمک کنن
 

Similar threads

بالا