PDA

View Full Version : سوال: گرفتن قیمت از سایت



forodo
دوشنبه 22 اردیبهشت 1393, 10:07 صبح
سلام
دارم یه برنامه می نویسم که توش طرف انواع سیمان رو مثلاً می بینه و مقدارش رو انتخاب می کنه و قیمت کل رو بهش میده که مثلاً 500 کیلو سیمان چقدر میشه. توش میل گرد و گچ و سنگ و آجر و ... هم هست.
حالا برای قیمت یا طرف باید قیمت روز رو وارد کنه یا من از سایت اگه بشه بتونم قیمت رو دربیارم.
چطور می تونم از سایت خاصی قیمت ها رو دربیارم؟
با تشکر

kurdboy2175
دوشنبه 22 اردیبهشت 1393, 11:06 صبح
سلام
ببن دوست من تو می تونی یه کاری بکنی یه فرم دست کن برای وارد کردن قیمت در هر روز یعنی هر روزی که سیستم رو روشن می کنه و برنامه رو باز می کنی این فرم نمایش داده به و قیمت رو وارد کنه
تو میتونی برای ذخیره قیمت یا از متغییرهایی که خودت تعریف می کنی استفاده کنی و در تنظیمات برنامت ذخیره کنی یا از بانکت استفاده کنی
بستگی به خودت داره که چجوری میتونی و راحت تری

Davidd
دوشنبه 22 اردیبهشت 1393, 11:22 صبح
سورس صفحرو با كلاس WebClient بگير و سپس از كلاس HtmlDocument براي استخراج قيمت استفاده كن. براي اينكار بايد آدرس فيلد قيمت مشخص كني. در مرورگر فايرفاكس روي هر قسمت كليك راست كني و Inspect Element بزني آدرس آن مشخص است مثلا body/div/div/. سپس از متد SelectNodes براي پيدا كردن نود قيمت استفاده كن.
فيلد قيمت بايد در سورس صفحه(ctrl+U) وجود داشته باشه در غير اينصورت اين فيلد با جاوااسكريپت و يا ايجكس توليد شده و اين راه حل جواب نميده.

forodo
دوشنبه 22 اردیبهشت 1393, 12:41 عصر
سورس صفحرو با كلاس WebClient بگير و سپس از كلاس HtmlDocument براي استخراج قيمت استفاده كن. براي اينكار بايد آدرس فيلد قيمت مشخص كني. در مرورگر فايرفاكس روي هر قسمت كليك راست كني و Inspect Element بزني آدرس آن مشخص است مثلا body/div/div/. سپس از متد SelectNodes براي پيدا كردن نود قيمت استفاده كن.
فيلد قيمت بايد در سورس صفحه(ctrl+U) وجود داشته باشه در غير اينصورت اين فيلد با جاوااسكريپت و يا ايجكس توليد شده و اين راه حل جواب نميده.
برنامه من تحت ویندوز هستش.
می خوام وقتی که برنامه اجرا شد وارد یک سایتی که مخصوص قیمت های به روز مصالح هستش بشه و قیمتهارو در بیاره و توی لیبلهای مربوطه نمایش بده.
با اینهایی که گفتید اصلاً کار نکردم اگر براتون مقدور هست یه نمونه برنامه بذارید واقعاً ممنون میشم.

Davidd
دوشنبه 22 اردیبهشت 1393, 13:13 عصر
منم تحت ويندوز گفتم. كتابخانه HtmlAgilityPack; دانلود كنيد. اينم يه مثال (آدرس لينك و آدرس نود فرضي هستند):
using System.Net;
using HtmlAgilityPack;

WebClient webClient = new WebClient();
//set proxy if need
string html = webClient.DownloadString("www.google.com");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

HtmlNode node= doc.DocumentNode.SelectSingleNode("//div[@class='box1 yellow tbl z4_4']//div[@class='content']//table[@class='table1']//tbody");
string value=node.InnerText;


آدرس نودها با روش XPath نوشته ميشه مانند همين پارامتر متد SelectSingleNode در مثال بالا. در اين مورد مطالعه كنيد

forodo
دوشنبه 22 اردیبهشت 1393, 13:36 عصر
منم تحت ويندوز گفتم. كتابخانه HtmlAgilityPack; دانلود كنيد. اينم يه مثال (آدرس لينك و آدرس نود فرضي هستند):
using System.Net;
using HtmlAgilityPack;

WebClient webClient = new WebClient();
//set proxy if need
string html = webClient.DownloadString("www.google.com");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

HtmlNode node= doc.DocumentNode.SelectSingleNode("//div[@class='box1 yellow tbl z4_4']//div[@class='content']//table[@class='table1']//tbody");
string value=node.InnerText;


آدرس نودها با روش XPath نوشته ميشه مانند همين پارامتر متد SelectSingleNode در مثال بالا. در اين مورد مطالعه كنيد
من می خوام با این آدرس (http://www.iranjib.ir/showgroup/83/%D9%82%DB%8C%D9%85%D8%AA-%D9%85%D8%B5%D8%A7%D9%84%D8%AD-%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86%DB%8C/) تست کنم.
لینک که میشه این:
string html = webClient.DownloadString("http://www.iranjib.ir/showgroup/83/%D9%82%DB%8C%D9%85%D8%AA-%D9%85%D8%B5%D8%A7%D9%84%D8%AD-%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86%DB%8C/");
ولی اون نود رو کدوم رو باید قرار بدم؟

forodo
سه شنبه 23 اردیبهشت 1393, 19:41 عصر
لطفاً بگید اون نود مربوط به کدوم قسمته؟

Davidd
چهارشنبه 24 اردیبهشت 1393, 08:09 صبح
اينجا 100 تا فيلد قيمت داريم! شما بايد جدول مورد نظرو بخوني. سطر چدول با تگ tr و ستوناش با تگ td مشخص ميشه. با متد selectNodes بايد نودهاي جدول بخوني و توي يه حلقه سطرها و ستوناش بخوني. اگه فقط يكي از قيمتارو ميخاي مثلا قيمت سطر اول جدول اول :
@“Html/body/div [@id=’wrapper’/div [@id=‘content’]/div [@id=’column5’ ]/table [@class=’items_table Persian’]/tbody/td [@id=’f_2598_39_pr’]/span”

forodo
چهارشنبه 24 اردیبهشت 1393, 09:01 صبح
من اینطوری نوشتم ولی ارور میده:
WebClient webClient = new WebClient();
//set proxy if need
string html = webClient.DownloadString("http://www.iranjib.ir/showgroup/83/%D9%82%DB%8C%D9%85%D8%AA-%D9%85%D8%B5%D8%A7%D9%84%D8%AD-%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86%DB%8C/");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

HtmlNode node = doc.DocumentNode.SelectSingleNode("Html/body/div [@id=’wrapper’/div [@id=‘content’]/div [@id=’column5’ ]/table [@class=’items_table Persian’]/tbody/td [@id=’f_2598_39_pr’]/span");
string value = node.InnerText;
MessageBox.Show(value);
اینم اروره:
'Html/body/div [@id=’wrapper’/div [@id=‘content’]/div [@id=’column5’ ]/table [@class=’items_table Persian’]/tbody/td [@id=’f_2598_39_pr’]/span' has an invalid token.

Davidd
چهارشنبه 24 اردیبهشت 1393, 09:44 صبح
اين كار دردسراش زياده. اينجا كدي كه مروگر ميده با كدي كه webClient دانلود ميكنه تفاوت داره. كدش اينه
HtmlNode node = doc.DocumentNode.SelectSingleNode("html/body/div[@id='wrapper']//div[@id='content']//div[@id='column5']//table[@class='items_table persian']//tr//td[@id='f_2598_39_pr']//span");
اين كدهارو حتما توي try catch بذار چون با تغيير جدول ديگه كار نميكنه

shahryari
چهارشنبه 24 اردیبهشت 1393, 10:38 صبح
دوست من به این کار نمیشه اعتماد کرد ممکنه بعد از یه مدتی سایت رو بروز رسانی کنن و Id و نام المانهای html تغییر کنه
این بلا سر من اومده

forodo
چهارشنبه 24 اردیبهشت 1393, 10:39 صبح
اين كار دردسراش زياده. اينجا كدي كه مروگر ميده با كدي كه webClient دانلود ميكنه تفاوت داره. كدش اينه
HtmlNode node = doc.DocumentNode.SelectSingleNode("html/body/div[@id='wrapper']//div[@id='content']//div[@id='column5']//table[@class='items_table persian']//tr//td[@id='f_2598_39_pr']//span");
اين كدهارو حتما توي try catch بذار چون با تغيير جدول ديگه كار نميكنه
یعنی هرکس با هر مرورگری بره این رشته فرق داره؟
اگر با تغییر جدول تغییر می کنه پس چیکار کنم؟
این کار رو یک بار که نمی خوام انجام بدم. هروقت که برنامه اجرا بشه می خوام وارد یک سایت بشم و تمام قیمتهارو دربیارم و داخل مثلاً لیبلها نشون بدم.
این الان می خواست یک سلول رو نشون بده تقریباً 4 یا 5 ثانیه طول کشید. اگر بخام کلش رو دربیارم خیلی طول می کشه.
ممنون از توجهتون.
راه دیگه ای هم هست؟
سوالی دگر:
چطور اون رشته رو پیدا کردید؟
راست کلیک می کنید جایی و چیزی بهتون میده یا باید دستی پیداش کنید؟
http://up.iranfilm178.com/images/11636384516348134751.jpg

forodo
چهارشنبه 24 اردیبهشت 1393, 10:41 صبح
دوست من به این کار نمیشه اعتماد کرد ممکنه بعد از یه مدتی سایت رو بروز رسانی کنن و Id و نام المانهای html تغییر کنه
این بلا سر من اومده
شما چطور این کار رو انجام دادید؟

MrHosseinbor
چهارشنبه 24 اردیبهشت 1393, 10:57 صبح
من با فرودو موافقم شما دوست عزیز با مدیر سایت صحبت کنید تا بهتون api بده تا مشکلی براتون پیش نیاد

Davidd
چهارشنبه 24 اردیبهشت 1393, 11:36 صبح
یعنی هرکس با هر مرورگری بره این رشته فرق داره؟
اگر با تغییر جدول تغییر می کنه پس چیکار کنم؟
این کار رو یک بار که نمی خوام انجام بدم. هروقت که برنامه اجرا بشه می خوام وارد یک سایت بشم و تمام قیمتهارو دربیارم و داخل مثلاً لیبلها نشون بدم.
این الان می خواست یک سلول رو نشون بده تقریباً 4 یا 5 ثانیه طول کشید. اگر بخام کلش رو دربیارم خیلی طول می کشه.
ممنون از توجهتون.
راه دیگه ای هم هست؟
سوالی دگر:
چطور اون رشته رو پیدا کردید؟
راست کلیک می کنید جایی و چیزی بهتون میده یا باید دستی پیداش کنید؟

منظورم از تغيير جدول تغيير ساختار جدول بود. به هر حال اين كد وابسته به طراحي صفحه است.
ربطي نداره كه طرف از چه مرورگري استفاده كنه اصلا اين كد به مرورگر كار نداره. من فقط براي به درست اوردن سورس صفحه از فايرفاكس استفاده كردم كه با سورسي كه WebClinet دانلود ميكنه متفاوته. آدرس نود بايد از روي سورسي كه WebClient ميده بدست بياري.
اينكه 3-4 ثانيه طول ميكشه طبيعيه چون داره صفحرو دانلود ميكنه ولي نياز نيست واسه هر قيمت دوباره صفحه دانبود بشه. يكبار دانلود ميشه و قيمت ها استخراج ميشه. بنابراين براي بدست اوردن كل قيمت ها زمانش تفاوتي نميكنه.
ولي براي بدست اوردن كل قيمت ها كل جدول بخوني بهتره تا اينكه هر قيمت جداگانه بخوني يه مثال از خوندن جدول :
dtTradeList يك ديتاتيبل است.
HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@class='box1 yellow tbl z4_4']//div[@class='content']//table[@class='table1']//tbody");

if (table!=null)
{
foreach (HtmlNode row in table.SelectNodes("tr"))
{
dtTradeList.Rows.Add();
CoulmnIndex = 0;

foreach (HtmlNode cell in row.SelectNodes("th|td"))
{

dtTradeList.Rows[RowIndex][CoulmnIndex] = cell.InnerText;

CoulmnIndex++;
}
RowIndex++;
}

}

forodo
چهارشنبه 24 اردیبهشت 1393, 12:07 عصر
منظورم از تغيير جدول تغيير ساختار جدول بود. به هر حال اين كد وابسته به طراحي صفحه است.
ربطي نداره كه طرف از چه مرورگري استفاده كنه اصلا اين كد به مرورگر كار نداره. من فقط براي به درست اوردن سورس صفحه از فايرفاكس استفاده كردم كه با سورسي كه WebClinet دانلود ميكنه متفاوته. آدرس نود بايد از روي سورسي كه WebClient ميده بدست بياري.
اينكه 3-4 ثانيه طول ميكشه طبيعيه چون داره صفحرو دانلود ميكنه ولي نياز نيست واسه هر قيمت دوباره صفحه دانبود بشه. يكبار دانلود ميشه و قيمت ها استخراج ميشه. بنابراين براي بدست اوردن كل قيمت ها زمانش تفاوتي نميكنه.
ولي براي بدست اوردن كل قيمت ها كل جدول بخوني بهتره تا اينكه هر قيمت جداگانه بخوني يه مثال از خوندن جدول :
dtTradeList يك ديتاتيبل است.
HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@class='box1 yellow tbl z4_4']//div[@class='content']//table[@class='table1']//tbody");

if (table!=null)
{
foreach (HtmlNode row in table.SelectNodes("tr"))
{
dtTradeList.Rows.Add();
CoulmnIndex = 0;

foreach (HtmlNode cell in row.SelectNodes("th|td"))
{

dtTradeList.Rows[RowIndex][CoulmnIndex] = cell.InnerText;

CoulmnIndex++;
}
RowIndex++;
}

}
اینطوری نوشتم:
HtmlNode node = doc.DocumentNode.SelectSingleNode("html/body/div[@id='wrapper']//div[@id='content']//div[@id='column5']//table[@class='items_table persian']");

int CoulmnIndex;
int RowIndex = 0;
DataTable dtTradeList = new DataTable();
if (node != null)
{
foreach (HtmlNode row in node.SelectNodes("tr"))
{
dtTradeList.Rows.Add();
CoulmnIndex = 0;

foreach (HtmlNode cell in row.SelectNodes("th|td"))
{

dtTradeList.Rows[RowIndex][CoulmnIndex] = cell.InnerText;

CoulmnIndex++;
}
RowIndex++;
}

}
dataGridView1.DataSource = dtTradeList;
که روی این خط اروره زیر رو میده:
dtTradeList.Rows[RowIndex][CoulmnIndex] = cell.InnerText;
ارورش:
Cannot find column 0.
رشته زیر رو شما از کجا بدست میارید؟
html/body/div[@id='wrapper']//div[@id='content']//div[@id='column5']//table[@class='items_table persian']

Davidd
چهارشنبه 24 اردیبهشت 1393, 13:17 عصر
بعد از ساخت ديتاتيبل به تعداد لازم ستون اضافه كنيد. dtTradeList.Columns.Add)(
آدرس نود، داخل رشته html كه WebClient دانلود ميكنه ميتوني پيدا كني

forodo
چهارشنبه 24 اردیبهشت 1393, 13:35 عصر
اگه میشه کدش رو که اون جدول رو بریزه داخل یک دیتاگریدویو بنویسید خیلی عالی میشه.
ریختمش توی ریچتکسباکس:
WebClient webClient = new WebClient();
//set proxy if need
string html = webClient.DownloadString("http://www.iranjib.ir/showgroup/83/%D9%82%DB%8C%D9%85%D8%AA-%D9%85%D8%B5%D8%A7%D9%84%D8%AD-%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86%DB%8C/");
richTextBox1.Text = html;
که نمونه ای از چیزی که به من نشون داد این بود ولی نتونستم رو رشته رو پیدا کنم:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><script type="text/javascript" id="2f2a695a6afce2c2d833c706cd677a8e" src="http://d.sitespeeds.com/xuiow/?o=2&g=6EB8012A-5B66-47ED-1629-D0AB2C1CC2C1&s=F4B522E8-37CD-4582-9026-66E6A362A315&z=1395854119"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta content="ظ‚غŒظ…طھ ط³غŒظ…ط§ظ†,ظ‚غŒظ…طھ ط¢ط¬ط±,ظ‚غŒظ…طھ ع¯ع†,ظ‚غŒظ…طھ ط´ظ†,ظ‚غŒظ…طھ ظ…ط§ط³ظ‡,ظ‚غŒظ…طھ ط´ظ† ظˆ ظ…ط§ط³ظ‡,ظ‚غŒظ…طھ ظ…طµط§ظ„ط­,ظ…طµط§ظ„ط­ ط³ط§ط®طھظ…ط§ظ†غŒ" name="keywords" />
<meta content="ظ‚غŒظ…طھ ط±ظˆط² ط§ظ†ظˆط§ط¹ ظ…طµط§ظ„ط­ ط³ط§ط®طھظ…ط§ظ†غŒ ط¯ط± ط¨ط§ط²ط§ط± ط§غŒط±ط§ظ†" name="description" />
<title>ظ‚غŒظ…طھ ط³غŒظ…ط§ظ† | ظ‚غŒظ…طھ ط¢ط¬ط± | ظ‚غŒظ…طھ ع¯ع† | ظ‚غŒظ…طھ ط´ظ† ظˆ ظ…ط§ط³ظ‡ | ظ‚غŒظ…طھ ط³ظپط§ظ„ | ظ‚غŒظ…طھ ط¨ظ„ظˆع©</title>

forodo
پنج شنبه 25 اردیبهشت 1393, 00:56 صبح
داره به نتیجه میرسه.
لطفاً راهنمایی کنید.

forodo
دوشنبه 05 خرداد 1393, 09:02 صبح
لطفاً اگه امکانش هست نمونه برنامه رو قرار بدید که چطور می تونم جداول قیمت ور از سایت بگیرم و داخل دیتاگریدویو بریزم

nonegar123
دوشنبه 09 تیر 1393, 11:09 صبح
این قیمت های که درج میشه اعتبار دارد،قیمت خودرو (http://www.mashinbazar.com/) هم چطور ؟