PDA

View Full Version : سوال: نمایش اطلاعات سایت های دیگر در سایت خودم



s.mahmood
جمعه 15 دی 1391, 18:29 عصر
سلام به همه
سوال به انگلیسی : Fetch data from Other Websites
راستش دارم به سایت طراحی میکنم با asp.net و نیازه که تو این سایت اطلاعات سایت بورس اوراق بهادار تهران با کلی تغییرات و تجزیه تحلیل نشون داده بشه. این سایت rss نداره و نمیشه به سادگی خوندن rss اطلاعات این سایت رو خوند.
مثل خوندن قیمت طلا یا سکه یا دلار از سایت های دیگه و نشون دادن اون ها تو سایت خودمون مثل سوالی که دوست خوبمون تو این تاپیک پرسیدن اما جواب عمومی نشد

http://barnamenevis.org/showthread.php?371634-%D8%AF%D8%B1%D8%B3%D8%AA-%DA%A9%D8%B1%D8%AF%D9%86-%DA%A9%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%82%DB%8C%D9%85%D8%AA-%D8%AF%D9%84%D8%A7%D8%B1&highlight=%D9%86%D9%85%D8%A7%DB%8C%D8%B4+%D8%A7%D8 %B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA+%DB%8C%DA%A9+%D8 %B3%D8%A7%DB%8C%D8%AA+%D8%AF%DB%8C%DA%AF%D8%B1+%D8 %AF%D8%B1+%D8%B3%D8%A7%DB%8C%D8%AA+%D8%AE%D9%88%D8 %AF%D9%85

تو سرچی که تو اینترنت کردم به جواب هایی مثل

string page = (new WebClient()).DownloadString("http://foo.bar/page");
یا
Document document = Jsoup.parse(new URL("http://www.dictionary30.com/meaning/Misty"), 10000);
Element div = document.select("div[id=contentbox]").first();

System.out.println(div.html());
یا
string url="http://www.hotmail.com";
//now u can use MSXML dll
XMLHTTP ObjHttp = new XMLHTTP();
//Connecting to site
ObjHttp.open("post",url,false,null, null);
//Sending parameters (may be u dont required it)
ObjHttp.send("case="+TicketNum");
if (ObjHttp.status.ToString() == "200") //successfull response
{
return ObjHttp.responseText;
}
"ObjHttp.responseText" //this will be string having html of the page
//u need to parse it using Regex to get ur desired data


اما هیج کدوم بهم کمکی نکرد. اگر کسی تا به حال این کار رو انجام داده ممنون میشم اطلاعاتی رد اختیارم قرار بده:قلب:

s.mahmood
جمعه 15 دی 1391, 20:48 عصر
دوستان من خیلی سرچ کردم و به این نتیجه رسیدم
برای بدست آوردن محتوال html یک آدرس مثلا http://www.google.com باید از دستور زیر استفاده کرد


using System;
using System.Text;
using System.Net;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
// We'll use WebClient class for reading HTML of web page
WebClient MyWebClient = new WebClient();

// Read web page HTML to byte array
Byte[] PageHTMLBytes;
if (txtURL.Text != "")
{
PageHTMLBytes = MyWebClient.DownloadData(txtURL.Text);

// Convert result from byte array to string
// and display it in TextBox txtPageHTML
UTF8Encoding oUTF8 = new UTF8Encoding();
txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes);
}
}
}
}



حالا مسئله سر اینه که تو جوابی که به ما تحویل میده (همون کدهای html) چه جوری میشه جستجو کرد. مثلا بگیم innerHtml هرچی تگ p زیر مجموعه تگ div با ای دی bbb هست رو بده. ینی تو کد زیر جستجو کرد


<div id="bbb">
<p>ali</p>
<p>hasan</p>
<p>ahmad</p>
</div>

که جواب میشه ali,hasan,ahmad

Saeed_script
شنبه 16 دی 1391, 00:24 صبح
با xml parser این کار قابل انجام هستش

http://www.c-sharpcorner.com/UploadFile/shehperu/SimpleXMLParser11292005004801AM/SimpleXMLParser.aspx

ali_mnkt
شنبه 16 دی 1391, 01:54 صبح
دوستان من خیلی سرچ کردم و به این نتیجه رسیدم
برای بدست آوردن محتوال html یک آدرس مثلا http://www.google.com باید از دستور زیر استفاده کرد


using System;
using System.Text;
using System.Net;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
// We'll use WebClient class for reading HTML of web page
WebClient MyWebClient = new WebClient();

// Read web page HTML to byte array
Byte[] PageHTMLBytes;
if (txtURL.Text != "")
{
PageHTMLBytes = MyWebClient.DownloadData(txtURL.Text);

// Convert result from byte array to string
// and display it in TextBox txtPageHTML
UTF8Encoding oUTF8 = new UTF8Encoding();
txtPageHTML.Text = oUTF8.GetString(PageHTMLBytes);
}
}
}
}



حالا مسئله سر اینه که تو جوابی که به ما تحویل میده (همون کدهای html) چه جوری میشه جستجو کرد. مثلا بگیم innerHtml هرچی تگ p زیر مجموعه تگ div با ای دی bbb هست رو بده. ینی تو کد زیر جستجو کرد


<div id="bbb">
<p>ali</p>
<p>hasan</p>
<p>ahmad</p>
</div>

که جواب میشه ali,hasan,ahmad

سلام دوست عزیز . شما که این همه در مورد این قضیه گشتی مطمئنا از من تجربت بیشتره یک سئوال دارم . فرض کن در صفحه ای که قراره به html اون دسترسی داشته باشیم یکسری input از نوع textbox هست که کاربر با وارد کردن اطلاعات در اون textbox ها و زدن دکمه ای در صفحه یکسری کد های پشت اون دکمه اجرا می شه . خوب حالا ما چطور می تونیم از طریق این روش اطلاعات رو به صورت post به صفحه مقصد بفرستیم و باعث بشیم کد های پشت دکمه اجرا بشن ( انگار که خوذمون در صفحه مقصد هستیم و input های رو پر کردیم و دکمه رو زدیم ) ؟؟؟؟؟؟؟؟؟؟؟؟؟

s.mahmood
یک شنبه 24 دی 1391, 22:19 عصر
دوست عزیز جواب سوالت رو نمیدونم ولی بگردم مطمئنم که پیدا می کنم اما برای سوال خودم جواب 100% درست پیدا کردم و اینجا جواب رو میگم تا همه استفاده کنن
خوبی جوابی که پیدا کردم اینه که میتونم توی محتوای برگشته داده شده از Linq استفاده کنم.
برای شروع یک شی از کلاس HtmlDocument می سازم
HtmlDocument مثل کلاس XmlDocument با این تفاوت که برای html نوشته شده و در فضای نام using HtmlAgilityPack هست که میتونی از طریق Package Manager در vs2010 و با دستور PM> Install-Package HtmlAgilityPack نصب کنی
حالا متود زیر رو می نویسم


private static HtmlDocument GetXHtmlFromUri(string uri)
{
HtmlDocument htmlDoc = new HtmlDocument()
{
OptionCheckSyntax = true,
OptionFixNestedTags = true,
OptionAutoCloseOnEnd = true,
OptionDefaultStreamEncoding = Encoding.UTF8,
};

var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";



//important
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
request.Accept = "text/html";
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

using (var response = request.GetResponse() as HttpWebResponse)
{
using (var stream = response.GetResponseStream())
{
htmlDoc.Load(stream, Encoding.UTF8);
}
}
return htmlDoc;
}

و برای استفاده از اون به این شکل استفاده می کنم


TextBox1.Text = GetXHtmlFromUri(txtURL.Text).DocumentNode.InnerHtm l;

فکر کنم همه چیز واضح باشه
حالا می خوام تو جوابی که برگشت داده شده هم از foreach و هم از Linq استفاده کنم و دنبال تگ div بگردم که کلاس box داره

var document = GetXHtmlFromUri(txtURL.Text);
var divWithBoxClass = from p in document.DocumentNode.Descendants()
where p.Name == "div" && p.Attributes["class"].Value == "box"
select p.InnerText;

foreach (var node in document.DocumentNode.Descendants())
{
if (node.Name == "div")
if (node.Attributes["class"] != null)
if (node.Attributes["class"].Value == "box")
txtPageHTML.Text += node.InnerText + "\n";
}


و جواب .....
خدایی تو این سایت به این بزرگی کسی نبود جواب ما رو بده؟:متفکر:

aliblue
یک شنبه 24 دی 1391, 22:24 عصر
ببخشید اینجا سوال میکنم.آیا میشه بخشی از سایت را که نیاز به عضویت دارد(با عضو بودن در آن سایت) در یک صفحه نشان دهیم؟مثلا در یک صفحه از یک سایت ، صفحه پروفایل خودم در برنامه نویس را نمایش بدهم؟

s.mahmood
یک شنبه 24 دی 1391, 22:39 عصر
با این نوع دسترسی چک کردم نشد اما باید به روش دیگه بشه :چشمک: