PDA

View Full Version : خواندن اطلاعات از روی وبسایت دیگر



erfanpj
چهارشنبه 02 اردیبهشت 1394, 18:10 عصر
با سلام
میخواستم بپرسم دوستان نظری برای خواندن اطلاعات از روی وبسایت دیگه ای دارن ؟
یا نوشتن روبات که این کار رو انجام بده

مثلا کاری که سایتهای زیر دارن انجام میدن که اطلاعات پرواز رو از سایتهای آژانسها میخونن
دوستان کسی تجربه داره ؟

سایتهای مثل http://charter118.ir
http://tcharter.ir/
http://sepehr360.ir/#!/showflight

ممنون میشم هر راهنمایی میتونید بهم بکنید

ممنون

-سیّد-
پنج شنبه 03 اردیبهشت 1394, 06:54 صبح
با سلام
میخواستم بپرسم دوستان نظری برای خواندن اطلاعات از روی وبسایت دیگه ای دارن ؟
یا نوشتن روبات که این کار رو انجام بده

مثلا کاری که سایتهای زیر دارن انجام میدن که اطلاعات پرواز رو از سایتهای آژانسها میخونن
دوستان کسی تجربه داره ؟

سایتهای مثل http://charter118.ir
http://tcharter.ir/
http://sepehr360.ir/#!/showflight

ممنون میشم هر راهنمایی میتونید بهم بکنید

ممنون
سلام
اینجا ۲ تا نکته وجود داره:
اول این که شما از کجا مطمئن هستید که این سایت‌ها اطلاعات رو از سایت‌های آژانسها می‌خونن؟ با توجه به این که توی اسم سایتشون charter دارن، ممکنه چارتر کرده باشن و خودشون اطلاعات رو ارائه بدن.
حالا فرض می‌کنیم اینطوری نباشه (یا اگه اینا اینطوری هستن، فرض می‌کنیم می‌خوایم از اطلاعات آژانسهای دیگه استفاده کنیم).
با این فرض، باز ۲ تا نکته پیش میاد.
اول این که مراقب باشید: با توجه به این که چه اطلاعاتی رو دارید می‌خونید و چه استفاده‌ای ازش می‌کنید، این کار ممکنه غیرقانونی باشه.
دوم: اینجا هم با توجه به این که اطلاعات رو از کجا می‌خواید بخونید، ممکنه ۲ تا روش وجود داشته باشه:
۱. ممکنه دسترسی به یه API خاصی داشته باشید که خیلی راحت بتونید اطلاعات رو ازش دریافت کنید. مثلاً یک web service. که این سرویس ممکنه public باشه، یا ممکنه فقط به شما ارائه بشه (مثلاً ممکنه خریده باشید، یا رفیقشون باشید به شما داده باشن!). خوب در این حالت که مشکل خاصی نیست و همون شخص یا شرکتی که به شما API می‌ده، معمولاً نحوه‌ی استفاده ازش رو هم بهتون می‌گه (مثل API پرداخت الکترونیکی).
۲. ممکنه دسترسی به چیز خاصی نباشه و قرار باشه که اطلاعات از یه سایت کاملاً معمولی (یعنی خروجی HTML یا AJAX) استخراج بشه. در این حالت، شما یا به صورت آنلاین این کار رو می‌کنید (یعنی به محض این که کاربر به سرور شما درخواست داد، شما همونجا می‌رید اطلاعات رو از اون سایت مورد نظر می‌گیرید و پردازش می‌کنید و به کاربر نشون می‌دید)، یا به صورت آفلاین (که می‌شه همون روبات که گفتید).
اگه آنلاین باشه، مزیتش اینه که اطلاعات کاملاً به‌روز هست.
اگه آفلاین باشه، مزیتش اینه که سرعت پاسخدهی به درخواست کاربر بسیار بالاتر می‌ره. فرض کنید در حالتی که می‌خواین آنلاین از اون سایت جواب بگیرید، در یکی از درخواستها، به هر دلیلی اون سایت به شما جواب نده و مثلاً connection timeout برابر ۵ ثانیه گذاشته باشید. خوب با توجه به این که شما جوابی از اون سرور نگرفتید، جوابی هم ندارید که به کاربرتون بدید! در نتیجه بعد از ۵ ثانیه علاف کردن کاربر، بهش می‌گید که ببخشید برو بعداً بیا!
از طرفی اگه بخواین آفلاین اطلاعات رو بگیرید، باید یه روبات داشته باشید که این کار رو انجام بده. مثلاً توسط cron یه برنامه تنظیم می‌کنید که هر چند وقت یه بار اجرا بشه و بره اطلاعات رو از اون سایت بگیره و به‌روز کنه. حالا سؤالی که پیش میاد اینه که هر چند وقت یه بار این کارو بکنیم؟ هر یک دقیقه یه بار؟ اون وقت شاید اصلاً اون سایت ما رو بلاک کنه! هر یک ساعت یه بار؟ اون وقت شاید اطلاعاتمون بیش از حد قدیمی بشه. یا مثلاً فرض کنید ساعت ۳ نصفه شب هم برنامه‌ی شما داره هر چند دقیقه یه بار اطلاعات رو از اون سایت می‌گیره، در حالی که هیچ بازدید کننده‌ای ندارید و عملاً بیخودی دارید اطلاعات رو به‌روز می‌کنید!
نتیجه‌گیری اخلاقی: این تصمیم که آنلاین باشه یا آفلاین، کاملاً بستگی داره به طراحی شما و اون سایت مورد نظر.

حالا از همه‌ی اینا که بگذریم، برای گرفتن یه صفحه از یه سایت دیگه، خیلی راحت می‌تونید از دستوراتی مثل file_get_contents استفاده کنید (البته اگه allow_url_fopen فعال باشه: http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen ):


$html = file_get_contents('http://yooz.ir');

و در ادامه اطلاعات مورد نظرتون رو از توی html ای که دریافت کردید استخراج می‌کنید. برای این کار می‌تونید از طریق توابع کار با string عمل کنید، یا از regular expression استفاده کنید، یا HTML رو parse کنید و اطلاعاتتون رو ازش استخراج کنید.

erfanpj
جمعه 04 اردیبهشت 1394, 12:32 عصر
ممنون دوست عزیز از توضیح کاملت

چندتا موضوع
1. اینکه چارتر کرده باشن مطمن هستم که نیست و چندتا سیستم آژانس هستش که آژانس ها دارن از اون استفاده میککن که این سایتهام میرن از اونا میخونن که حالا چند تا اتفاق این وسط گنگ هست
A اون سیستم هیچ API ی ندارن که بشه استفاده کرد
B اون سیتم ها دارای CAPTCHA CODE هستن که زیاد نتونی راحت ازش رد شی
C کلا تو همشون اطلاعات سمت سرور رندر میشه که باز یکم کارو سخت میشه چون به ازای هر SESSION که میسازه یه خروجی سمت سرور تولید میکنه

و نمیشه از file_get_contents استفاده کرد چون PERMISSION نمیده و ...

باز ممنون که وقت گ اشتی اگر نظر دیگه هم داشتی ممنون میشم راهنمایی کنی

با تشکر



سلام
اینجا ۲ تا نکته وجود داره:
اول این که شما از کجا مطمئن هستید که این سایت‌ها اطلاعات رو از سایت‌های آژانسها می‌خونن؟ با توجه به این که توی اسم سایتشون charter دارن، ممکنه چارتر کرده باشن و خودشون اطلاعات رو ارائه بدن.
حالا فرض می‌کنیم اینطوری نباشه (یا اگه اینا اینطوری هستن، فرض می‌کنیم می‌خوایم از اطلاعات آژانسهای دیگه استفاده کنیم).
با این فرض، باز ۲ تا نکته پیش میاد.
اول این که مراقب باشید: با توجه به این که چه اطلاعاتی رو دارید می‌خونید و چه استفاده‌ای ازش می‌کنید، این کار ممکنه غیرقانونی باشه.
دوم: اینجا هم با توجه به این که اطلاعات رو از کجا می‌خواید بخونید، ممکنه ۲ تا روش وجود داشته باشه:
۱. ممکنه دسترسی به یه API خاصی داشته باشید که خیلی راحت بتونید اطلاعات رو ازش دریافت کنید. مثلاً یک web service. که این سرویس ممکنه public باشه، یا ممکنه فقط به شما ارائه بشه (مثلاً ممکنه خریده باشید، یا رفیقشون باشید به شما داده باشن!). خوب در این حالت که مشکل خاصی نیست و همون شخص یا شرکتی که به شما API می‌ده، معمولاً نحوه‌ی استفاده ازش رو هم بهتون می‌گه (مثل API پرداخت الکترونیکی).
۲. ممکنه دسترسی به چیز خاصی نباشه و قرار باشه که اطلاعات از یه سایت کاملاً معمولی (یعنی خروجی HTML یا AJAX) استخراج بشه. در این حالت، شما یا به صورت آنلاین این کار رو می‌کنید (یعنی به محض این که کاربر به سرور شما درخواست داد، شما همونجا می‌رید اطلاعات رو از اون سایت مورد نظر می‌گیرید و پردازش می‌کنید و به کاربر نشون می‌دید)، یا به صورت آفلاین (که می‌شه همون روبات که گفتید).
اگه آنلاین باشه، مزیتش اینه که اطلاعات کاملاً به‌روز هست.
اگه آفلاین باشه، مزیتش اینه که سرعت پاسخدهی به درخواست کاربر بسیار بالاتر می‌ره. فرض کنید در حالتی که می‌خواین آنلاین از اون سایت جواب بگیرید، در یکی از درخواستها، به هر دلیلی اون سایت به شما جواب نده و مثلاً connection timeout برابر ۵ ثانیه گذاشته باشید. خوب با توجه به این که شما جوابی از اون سرور نگرفتید، جوابی هم ندارید که به کاربرتون بدید! در نتیجه بعد از ۵ ثانیه علاف کردن کاربر، بهش می‌گید که ببخشید برو بعداً بیا!
از طرفی اگه بخواین آفلاین اطلاعات رو بگیرید، باید یه روبات داشته باشید که این کار رو انجام بده. مثلاً توسط cron یه برنامه تنظیم می‌کنید که هر چند وقت یه بار اجرا بشه و بره اطلاعات رو از اون سایت بگیره و به‌روز کنه. حالا سؤالی که پیش میاد اینه که هر چند وقت یه بار این کارو بکنیم؟ هر یک دقیقه یه بار؟ اون وقت شاید اصلاً اون سایت ما رو بلاک کنه! هر یک ساعت یه بار؟ اون وقت شاید اطلاعاتمون بیش از حد قدیمی بشه. یا مثلاً فرض کنید ساعت ۳ نصفه شب هم برنامه‌ی شما داره هر چند دقیقه یه بار اطلاعات رو از اون سایت می‌گیره، در حالی که هیچ بازدید کننده‌ای ندارید و عملاً بیخودی دارید اطلاعات رو به‌روز می‌کنید!
نتیجه‌گیری اخلاقی: این تصمیم که آنلاین باشه یا آفلاین، کاملاً بستگی داره به طراحی شما و اون سایت مورد نظر.

حالا از همه‌ی اینا که بگذریم، برای گرفتن یه صفحه از یه سایت دیگه، خیلی راحت می‌تونید از دستوراتی مثل file_get_contents استفاده کنید (البته اگه allow_url_fopen فعال باشه: http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen ):


$html = file_get_contents('http://yooz.ir');

و در ادامه اطلاعات مورد نظرتون رو از توی html ای که دریافت کردید استخراج می‌کنید. برای این کار می‌تونید از طریق توابع کار با string عمل کنید، یا از regular expression استفاده کنید، یا HTML رو parse کنید و اطلاعاتتون رو ازش استخراج کنید.

-سیّد-
جمعه 04 اردیبهشت 1394, 17:37 عصر
اون سیتم ها دارای CAPTCHA CODE هستن که زیاد نتونی راحت ازش رد شی

این رو هم می‌شه براش راه حل پیدا کرد! اگه روبات داشته باشید، کافیه یه بار لاگینش کنید (یعنی captcha رو دستی وارد کنید) و بعد دیگه می‌تونه دوره‌ای سر بزنه به سیستم و اطلاعات رو به‌روز کنه. هر وقت هم که session اش expire شد، مجدداً captcha رو براش دستی وارد می‌کنید و مجدداً لاگین می‌شه.
می‌شه یه سیستم نوشت و یه تعداد آدم گذاشت پاش که فقط captcha نشونشون بده و اونا وارد کنن و سیستم بقیه‌ی کار رو به صورت خودکار انجام بده. بسته به این که rate سر زدن روبات شما به اون سیستم چقدره، و session timeout اش چقدره، تعداد آدم مورد نیازش فرق می‌کنه، که فکر نکنم در موارد معمولی بیش از یک نفر نیاز باشه.



کلا تو همشون اطلاعات سمت سرور رندر میشه که باز یکم کارو سخت میشه چون به ازای هر SESSION که میسازه یه خروجی سمت سرور تولید میکنه

این بخش رو منظورتون رو نفهمیدم. شما به سرور وصل می‌شید و ازش اطلاعات رو می‌گیرید. حالا دیگه چی کار دارید که سمت سرور session ساخته می‌شه؟



و نمیشه از file_get_contents استفاده کرد چون PERMISSION نمیده و ...

یعنی چی permission نمی‌ده؟ مگه دست خودشه؟! :)
شما تقریباً هر صفحه‌ای از وب رو می‌تونید با file_get_contents بگیرید (توجه دارید که اگه آدرس http بهش بدید، می‌ره و براتون دانلودش می‌کنه). مگر این که شرایط خاصی داشته باشه. مثلاً کوکی خاصی بخواد (مثل لاگین) یا User-Agent خاصی بخواد یا ...
در صورتی که صفحه‌ی مورد نظر شما مثلاً لاگین داره، و یا به هر دلیل دیگه می‌خواین یه مقدار پیشرفته‌تر با صفحات وب برخورد کنید، می‌تونید از curl استفاده کنید:
http://php.net/manual/en/book.curl.php

freddy
دوشنبه 11 خرداد 1394, 12:03 عصر
http://hiholiday.ir/WebService