PDA

View Full Version : استفاده از يك قسمت از سايت ديگر بدون داشتن سرويس از آن سايت



ahmad1358
سه شنبه 25 اسفند 1388, 10:40 صبح
با سلا من سورس html يه سايت رو با كد زير بدست آوردم و ريختم داخل يه Label و وقتي اون ليبل را تو سايت اصلي خودم نمايش ميدم دقيقا اون سايت رو بدون استفاده از Iframe تو سايت من نمايش ميده سوال من اينه كه چجوري ميتونم يه قسمتهايي خاص از اون كدي كه بدست اوردم رو نمايش بدم مثلا من ميخوام فقط قسمت وسط سايت اصلي رو نمايش بدم نه كل منوي هاي راست و چپ رو با تشكر
كد بدست اوردن Html سايت:


WebClient MyWebClient = new WebClient();
string myString;
Byte[] PageHTMLBytes;
PageHTMLBytes = MyWebClient.DownloadData("http://livescore.com");

UTF8Encoding oUTF8 = new UTF8Encoding();
txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes);

mehdi.mousavi
سه شنبه 25 اسفند 1388, 11:03 صبح
با سلا من سورس html يه سايت رو با كد زير بدست آوردم و ريختم داخل يه Label و وقتي اون ليبل را تو سايت اصلي خودم نمايش ميدم دقيقا اون سايت رو بدون استفاده از Iframe تو سايت من نمايش ميده سوال من اينه كه چجوري ميتونم يه قسمتهايي خاص از اون كدي كه بدست اوردم رو نمايش بدم مثلا من ميخوام فقط قسمت وسط سايت اصلي رو نمايش بدم نه كل منوي هاي راست و چپ رو با تشكر كد بدست اوردن Html سايت:


WebClient MyWebClient = new WebClient();
string myString;
Byte[] PageHTMLBytes;
PageHTMLBytes = MyWebClient.DownloadData("http://livescore.com");

UTF8Encoding oUTF8 = new UTF8Encoding();
txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes);





سلام.
احتمالا من در تعطیلات در مورد این مساله مقاله ای بنویسم، چون ظاهرا این مشکل بسیاری از دوستان هستش. یکی میخواد وضعیت آب و هوا رو از یک سایتی بر داره، یکی میخواد قیمت ارز و سکه رو برداره و شما هم که بدنبال آخرین نتایج لیگ هستید. :)

بعنوان پاسخی سریع و گذرا باید خدمتتون عرض کنم که شما باید پس از دریافت این HTML، اونو مورد پردازش قرار بدید و خودتون، توی HTML دریافت شده، دنبال Pattern مورد نظر باشید و اطلاعات مورد نیاز رو خودتون از داخل string مربوطه، Extract کنید. کار پیچیده ای نیست، اما عموما بسته به سایت، میتونه دشوار باشه و صد البته، اینکار ناقض قوانین Copyright هستش، چون اگر قرار بود این اطلاعات رو با دیگران به اشترام بذارن، میتونستن خودشون یک RSS یا وب سرویسی بدین منظور اختصاص بدن و ...

موفق باشید.

ahmad1358
سه شنبه 25 اسفند 1388, 19:40 عصر
اگه امکانش هست یه توضیح در مورد پیدا کردن الگوی مورد نظر در مورد این نوع سایتها بدین با تشکر

ahmad1358
چهارشنبه 26 اسفند 1388, 00:21 صبح
در حال حاضر سايت هايي هستند كه از اين موضع دارن تو سايت خودشون استفاده ميكنن

البته بعضي هاشون دارن بابت اين كار مبلغي رو پرداخت مي كنن ولي اين سايت داره از روش بالا استفاده مي كنه و با يه سري عمليات جايگزيني بعضي تيم ها رو فارسي كرده مشكل فقط خوندن قسمتي از كد هست كه ما مي خاهيم نه همه كد يه صفحه

مثلا سايت زير داره اين كار رو خيلي خوب انجام ميده
http://www.90gol.com/LiveScore/

ahmad1358
چهارشنبه 26 اسفند 1388, 10:56 صبح
نمیدونم چرا هر سوالی تو این سایت میکنم یا جواب داده نمیشه یا اینه تا آخر بحث پیش نمیره که به یه راه حل منطقی برسم.یا مشکل از منه یا از سوالهای من یکی ما رو راهنمایی کنه با تشکر

Peyman.Gh
چهارشنبه 26 اسفند 1388, 12:24 عصر
mehdi.mousavi (http://barnamenevis.biz/forum/member.php?u=41233) عزیز توضیحاتی دادند من هم پیشنهاد میدم درباره HttpWebRequest و HttpWebResponse جستجو کنید.(اگر اشتباه گفتم اساتید تصحیح کنند)

Omid.Mafakher
چهارشنبه 26 اسفند 1388, 19:21 عصر
-------------------------------------

ahmad1358
جمعه 28 اسفند 1388, 03:06 صبح
دوست عزیز شما برای دریافت Source یک صفحه می توانید از DownloadString استفاده کنید به جای آنکه عملیات Encode کردن را خودتان انجام بدید. و اما در رابطه با پیدا کردن این بخش مورد نظر، شما باید از از ابزار Regular استفاده کنید
Expresso (http://www.codeproject.com/KB/dotnet/expresso.aspx) نرم افزاری است که به شما این امکان را می هده که کد های زبان Regex را تولید کنید.
برای انجام این کار در C#‎ شما باید از ابزار Regex در زیر مجموعه System.Text.RegularExpressions استفاده کنید

من كه فكر نكنم با اطلاعاتي كه من از RegularExpressions دارم و اين وقت كمم بتونم كارمو انجام بدم ولي يه سوال دارم ايا ميشه وقتي كد صفحه رو بدست آوردم خط به خط دنبال اون رشته ابتدايي كه ميخوام بگردم ، و بعد از پيدا كردن اون تا رشته انتهايي را تو يه رشته ديگه ذخيره كنم .

با تشكر

mehdi.mousavi
جمعه 28 اسفند 1388, 03:21 صبح
من كه فكر نكنم با اطلاعاتي كه من از RegularExpressions دارم و اين وقت كمم بتونم كارمو انجام بدم ولي يه سوال دارم ايا ميشه وقتي كد صفحه رو بدست آوردم خط به خط دنبال اون رشته ابتدايي كه ميخوام بگردم ، و بعد از پيدا كردن اون تا رشته انتهايي را تو يه رشته ديگه ذخيره كنم .

با تشكر

سلام.
روشی که آقای مفاخر ارائه دادن، بهترین روش برای انجام اینکاره. درسته که میتونید از RegEx استفاده نکنید و خودتون string رو پردازش کنید، اما با RegEx کار بسیار ساده میشه (واقعا قابل وصف نیست) و شما در یک Pass میتونید خروارها اطلاعات رو از بخشهای مختلف این BULK داده، بیرون بکشید. در صورتیکه اگر خودتون بخواهید string رو بررسی کنید، احتمالا باید توی رشته عقب و جلو برید، ربط نودها به همدیگرو در نظر داشته باشید، تکرار برخی tag ها و بسیاری از مسائلی که همشون رو میشه با نوشتن یک یا چند الگو براحتی Handle کرد رو خودتون باید باهاش تعامل داشته باشید.

موفق باشید.

ahmad1358
جمعه 28 اسفند 1388, 11:37 صبح
حالا اگه نظر شما اينه اگه امكانش هست يه مثال بزنين كه من بتونم مثلا از متن زير


<body >



<table class="Main" width="1000" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td><table width="" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="311"><img src="/theme/90gol/images/Main_01.gif" alt="نود گل" /></td>
<td width="658" class="logoBG">&nbsp;</td>
<td width="31"><img src="/theme/90gol/images/Main_04.gif" alt="نود گل" /></td>
</tr>
<tr>
<td align="left" class="MenuBG"><img src="/theme/90gol/images/Menu_01.gif" width="288" height="29" /></td>
<td colspan="2" class="MenuBG">

</tr>
</table></td>
</tr>
<tr>
<td valign="top" style="vertical-align:top">
<table width="1000" border="0" height="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="728" rowspan="4" align="center" valign="top" style="padding-top:17px; padding-right:10px; padding-left:10px;">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="top" class="NewsScroll">
<p style="text-align: center"><span style="font-size: smaller"><span style="color: #ff0000"><strong><img alt="اخبار جدید" align="right" src="http://www.freeimagehosting.net/uploads/d5174723fd.gif" />&nbsp;</strong></span></span><a href="http://www.90gol.com/Register/"><span style="font-size: large"><span style="color: #0000ff"><u><strong><em></em></strong></u></span></span></a></p>
<p style="text-align: justify">&nbsp;</p> </td>
</tr>

<tr>
<td height="20"></td>
</tr>
<tr>
<td align="center" valign="top" class="main" id="main"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div class="news-head">نتایج زنده مسابقات</div>
<table width="100%" class="grid" border="0" cellspacing="0" cellpadding="0" dir="ltr" style="direction:ltr">
<table width="99%" dir="rtl" cellspacing="0" cellpadding="0">
<tr bgcolor="#111111">
<td colspan="4" height="4">
</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#437A9C" style="color:#fff">
<td class="title" colspan="4" height="25">&nbsp;<strong style="padding-right:10px;">
<img src="/images/arrow_green.gif" />&nbsp;یوفا اروپا لیگ</strong>
</tr>
<tr style="display:none">
<td>&nbsp;13:00</td>
<td class="match-light" align="left" width="423" colspan="3">March 18&nbsp;</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#ADD9F3" style="border-bottom:#6CC5FB 1px dashed;">
<td width="155" style="text-align:right" height="25">&nbsp;19:00</td>
<td align="left" width="186">فولهام</td>
<td align="center" width="51">? - ?</td>
<td width="186">يوونتوس </td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#E7F1FA">
<td width="155" style="text-align:right" height="25">&nbsp;19:00</td>
<td align="left" width="186">مارسی</td>
<td align="center" width="51">? - ?</td>
<td width="186">بنفیكا</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#ADD9F3" style="border-bottom:#6CC5FB 1px dashed;">
<td width="155" style="text-align:right" height="25">&nbsp;19:00</td>
<td align="left" width="186">استاندارد لیژ</td>
<td align="center" width="51">? - ?</td>
<td width="186">پاناتینایكوس</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#E7F1FA">
<td width="155" style="text-align:right" height="25">&nbsp;19:00</td>
<td align="left" width="186">وردربرمن</td>
<td align="center" width="51">? - ?</td>
<td width="186">والنسيا </td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#ADD9F3" style="border-bottom:#6CC5FB 1px dashed;">
<td width="155" style="text-align:right" height="25">&nbsp;21:05</td>
<td align="left" width="186">اندرلشت</td>
<td align="center" width="51">? - ?</td>
<td width="186">هامبورگ </td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#E7F1FA">
<td width="155" style="text-align:right" height="25">&nbsp;21:05</td>
<td align="left" width="186">لیورپول</td>
<td align="center" width="51">? - ?</td>
<td width="186">لیل</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#ADD9F3" style="border-bottom:#6CC5FB 1px dashed;">
<td width="155" style="text-align:right" height="25">&nbsp;21:05</td>
<td align="left" width="186">اسپورتینگ لیسبون</td>
<td align="center" width="51">? - ?</td>
<td width="186">اتلتیکو مادرید</td>
</tr>
<tr>
<td colspan="4" height="1">
</td>
</tr>
<tr bgcolor="#E7F1FA">
<td width="155" style="text-align:right" height="25">&nbsp;21:05</td>
<td align="left" width="186">ولفزبورگ آلمان</td>
<td align="center" width="51">? - ?</td>
<td width="186">روبین کازان</td>
</tr>


رشته هايي كه با <tr bgcolor="#E7F1FA"> شروع شوند و با </tr> تمام ميشوند را انتخاب كند چيست.
با تشكر

من از اين گزينه استفاده كردم ولي نشد


(?<tr>(?<=(?:\s|\G|\A))\w?</tr>)

Behrouz_Rad
جمعه 28 اسفند 1388, 13:43 عصر
یک حالت می تونه به شکل ذیل باشه:


<tr\sbgcolor="\#E7F1FA">(\r\n.*){4}(\r\n)</tr>

البته این حالت Lazy هست. اگر بخوای تا آخرین <tr/> مربوط به آخرین تگ <tr> مورد تطبیق رو داشته باشی فرق می کنه. دقیقاً منظورت رو نگفتی.

موفق باشید.

ahmad1358
جمعه 28 اسفند 1388, 15:36 عصر
ممنون آقاي راد من ميخوام اولين تگي كه با گزينه <tr bgcolor="#E7F1FA"> شروع شد رو بگيرم تا آخرین <tr/> مربوط به آخرین تگ <tr> مورد تطبیق كه دقيقا همون چيزيه كه شما گفتين يعني من تمام tr هايي رو ميخوام كه با اين تگ <tr bgcolor="#E7F1FA"> شروع ميشن.

البته من تو برنامه Expresso وقتي عبارت <tr\sbgcolor="\#.*">(\r\n.*){4}(\r\n)</tr> را وارد كردم دقيقا تمام اون خطوطي رو كه مي خواستم به صورت جداگانه
تو يه treeview بمن نشون داد مثل شكل زير اگه من دقيقا خروجي اين برنامه رو بخوام تو يه آرايه تو برنامه وب خودم داشته باشم بايد چيكار كنم

ممنون از راهنماييتون.

Behrouz_Rad
جمعه 28 اسفند 1388, 23:55 عصر
شما الان اون چیزی که میخوای و میگی رو در پست قبلیم واست نوشتم دیگه.


اگه من دقيقا خروجي اين برنامه رو بخوام تو يه آرايه تو برنامه وب خودم داشته باشم بايد چيكار كنم

آرایه خوب نیست. از لیست جنریک استفاده کن:


Regex regEx = new Regex("pattern", RegexOptions.Compiled | RegexOptions.CultureInvariant);

Match[] mc = regEx.Matches("textToSearch").Cast<Match>().ToArray();

List<string> list = new List<string>();

Array.ForEach(mc, s =>
{
list.Add(s.Value);
});


موفق باشید.

ahmad1358
پنج شنبه 05 فروردین 1389, 15:00 عصر
با سلام
بعد از اينكه جواب بالا رو گرفتم به خيلي از سايتها سر زدم و انواع مختلف الگوهايي كه اونا استفاده كردن رو امتحان كردم و به اون چيزي كه ميخواستم رسيدم حالا ميخوام از الگوي زير در كد بالا استفاده كنم ولي وقتي اونو به عنوان Pattern معرفي ميكنم پيغام Unrecognized escape sequence
رو ميده : خط اول


string patern="<table\swidth=\"331\"\sbgcolor=\"\#666666\".*>(.*?)</table>";
PageHTMLBytes = MyWebClient.DownloadData("http://x--x--x--x.com");
UTF8Encoding oUTF8 = new UTF8Encoding();
txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes);
myString = txtPageHTML.Text;
Regex regEx = new Regex(patern, RegexOptions.Compiled | RegexOptions.CultureInvariant);
Match[] mc = regEx.Matches(myString).Cast<Match>().ToArray();
List<string> list = new List<string>();
Array.ForEach(mc, s => { list.Add(s.Value); });
txtPageHTML.Text = s;


و تو خط 7 هم پيغام Match[] mc = regex.Matches("textToSearch").Cast<Match>().ToArray();
'System.Text.RegularExpressions.MatchCollection' does not contain a definition for 'Cast'

با تشكر

Behrouz_Rad
پنج شنبه 05 فروردین 1389, 17:42 عصر
وقتي اونو به عنوان Pattern معرفي ميكنم پيغام Unrecognized escape sequence
رو ميده : خط اول

اینجوری Escape کن:


<tr\\sbgcolor=\"\\#E7F1FA\">(\\r\\n.*){4}(\\r\\n)</tr>



و تو خط 7 هم پيغام Match[] mc = regex.Matches("textToSearch").Cast<Match>().ToArra y();
'System.Text.RegularExpressions.MatchCollection' does not contain a definition for 'Cast

Cast یکی از عملگرهای LINQ هست. نیم اسپیس System.Linq رو using کن.

موفق باشید.

ahmad1358
پنج شنبه 05 فروردین 1389, 18:30 عصر
مشكلم با تيديل الگو به صورت زير حل شد اما


@"<table\swidth=""331""\sbgcolor=""\#666666"".*>(.*?)</table>"

اما ميخوام تو رشته اي كه دريافت كردم يه سري تغييرات بدم ولي براي هر تغييري كه ميخوام بدم بايد يه خط با replace بنويسم


txtPageHTML.Text = Regex.Replace(txtPageHTML.Text, "333333", "7DB1EC");

آيا راهي وجود داره كه بشه ركوردهاي تغييراتم رو از تو بانك بخونم و با فيلد متناظر تو اون جدول جايگزين كنم تو يه خط يا نه؟

با تشكر

am 241
سه شنبه 10 فروردین 1389, 10:26 صبح
سلام احمد آقا
منم دقیقا یک همچین سوالی کردم توی یک تاپیک جدا
اما چون نتونستم باهاش کار کنم تاپیک شما رو پیدا کردم
و چون سی شارپ بلد نیستم میتونی لطف کنی این تیکه از برنامتو برام بذاری تا من بفهم چی به چیه (قابلیت کامپایل داشته باشه)

am 241
شنبه 14 فروردین 1389, 08:57 صبح
کسی نیست کمک کنه