PDA

View Full Version : دانلود سایت و ایجاد سایت آفلاین در سطوح مختلف



achaemenianboy
شنبه 07 خرداد 1390, 01:25 صبح
با سلام خدمت دوستان عزیز
در این مقاله قصد دارم روش ایجاد یک برنامه آفلاین کننده سایت را توضیح بدم. امیدوارم بدردتون بخوره.
در ابتدا از همه دوستان عذر میخوام بابت اینکه ممکنه الگوریتمی که استفاده میکنم بهینه یا اصولی نباشه (به هر حال هرکس دیدی داره :لبخند:) ! :افسرده:
برای ایجاد یک برنامه که بتونه یک سایت را با لینک های مرتبط(لینک های موجود در صفحه) و ... آفلاین کنه باید چند نکته در نظر گرفته بشه (اگر از ساختار صفحات وب اطلاعاتی ندارید بهتون پیشنهاد میکنم این سایت (http://www.pagetutor.com/html_tutor/index.html) مراجعه کنید :لبخند:)
1- یک صفحه وب (بدون در نظر گرفتن نوع زبان برنامه نویسی) دارای یک محتوی متنی است که می توان آنرا مشاهده کرد(IE: Right Click ->View Source , Fire Fox: Right Click ->View Page Source). در این محتوی ما می توانیم کد کامپایل شده و یک سری تگ می بینیم.
2- تصاویر به صورت آدرس در صفحات تعریف می شوند (برای دسترسی به یک تصویر باید آدرس آنرا داشته باشیم)
3- فایل های Style Sheet و کتابخانه هایی که در طراحی از آنها استفاده شده است نیز مانند تصاویر دارای آدرس دسترسی می باشند.
4- و در آخر لینک های موجود در صفحه که به صفحه یا سایت دیگر ارجاع داده می شوند

با توجه به توضیحات بالا احتمال متوجه شده ای که برای آفلاین کردن یک سایت باید چند مرحله کار صورت بگیرد.

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

مراحل کار را توضیح میدم :
1- قبل از هر کاری باید بدونیم که از چه کتابخانه هایی باید استفاده کنیم
import java.net.URL;
import java.net.URLConnection;

این دوتا کتابخانه اصلی ترین ها هستند و ممکن بنا به کدی که میزنید به سایر کتابخانه ها هم نیاز داشته باشید.
2- ذخیره محتوی صفحه : همونطور که توضیح داده بودم ما میتونیم محتوی یک صفحه را ببینیم، پس می تونیم دانلودش هم کنیم.
برای دسترسی به محتوی یک صفحه می تونیم از کد زیر استفاده کنیم :

String _content = null;
URL _url = new URL("http://www.sarinsoft.com/default.aspx");

URLConnection _urlConnection = _url.openConnection();

_urlConnection.setDoOutput(true);
InputStream _inputStream = null;
_inputStream = _url.openStream();

StringBuffer _stringBuffer = new StringBuffer();
String _readLine = null;
BufferedReader _bufferReader = new BufferedReader(new InputStreamReader(_inputStream, charset));

while ((_readLine = _bufferReader.readLine()) != null) {
String _temp = _readLine;
int str_len = _temp.length();
if (str_len > 0) {
_stringBuffer.append(_temp);
}
_temp = null;
}
_inputStream.close();
_content = _stringBuffer.toString();


با کد بالا ما محتوی متنی (کد کامپایل شده) یک صفحه را بدست آوردیم حالا باید این محتوی در یک جایی ذخیره بشه :

PrintWriter _printWriter = null;
FileOutputStream _fileOutputStream = new FileOutputStream(path);
OutputStreamWriter _outputStreamWriter = new OutputStreamWriter(_fileOutputStream, charset);
_printWriter = new PrintWriter(_outputStreamWriter);
_printWriter.println(value);
_printWriter.flush();
_printWriter.close();


اگر برنامه را تا اینجا کامل کرده باشید، بعد از ذخیره یک صفحه خواهید دید که چهره صفحه ذخیره شده تغییر کرده و همچنین هیچ عکسی در صفحه وجود نداره ! :متفکر:
درسته ! اینطور که میشه ! باید فکری کرد:لبخند:
راه حل چیه ؟ :متعجب:
3- پیشنهاد : ما میتونیم Style Sheet ها و تصاویر را ذخیره کنیم ! :خجالت:
اما یه مشکلی هست ! وقتی شما سورس این صفحه ای که ذخیره کردید را ببینید متوجه خواهید شد که هر تصویر یا فایل یه آدرس داره که اتفاقاً ممکنه به یه سایت دیگه ارجاع داده شده باشه :متعجب:
در این صورت ذخیره کردن فایل های مرتبط هیچ سودی نداره !
4- پیشنهاد : ما می تونیم اول فایل های مرتبط را ذخیره کنیم و بعد آدرس اونها را در صفحه تغییر بدیم (اگر راه حل بهتری دارید بگید تا ماهم ... )
این کار نیاز به کمی وقت،حوصله،خلاقیت و صد البته توانایی داره ! :شیطان::قهقهه:
در اینجا ما فرض میکنیم که شما این مرحله را پشت سر گذاشتید !!!!!

5- اگر همون صفحه قبل را ببینید متوجه میشید که هیچ کدوم از لینک ها کار نمیکنن ! :گریه:
دلیلش مشخصه ! شما فقط همین یک صفحه را دارید !
پس باید همه صفحاتی که لینک های موجود در صفحه به اونها اشاره می کنند را بدست آورد.
برای این کار ما نیاز داریم که لیست همه لینکهای موجود را داشته باشیم! چجوری ؟:افسرده:
برای اینکار ما می تونیم از محتوی متنی صفحه استفاده کنیم! (بازهم وقت،حوصله و ...)

6- فرض میکنیم که شما این لیست را دارید، حالا باید آدرس لینک های موجود در صفحه را دستکاری کنید (آدرس محلی که صفحه مرتبط را در اونجا ذخیره کردید)



String newContent = content;
String _temp = content.substring(content.indexOf("<body"));
while (_temp.indexOf("<a") > 0) {
String _linkUrl = _temp.substring(_temp.indexOf("<a"));
if (_linkUrl.contains("href=\""))
_linkUrl = _linkUrl.substring(_linkUrl.indexOf("href=\"") + 6, _linkUrl.indexOf("\"", _linkUrl.indexOf("href=\"") + 6));
else if (_linkUrl.contains("href='"))
_linkUrl = _linkUrl.substring(_linkUrl.indexOf("href='") + 6, _linkUrl.indexOf("'", _linkUrl.indexOf("href='") + 6));

if (!_linkUrl.contains("#") & _linkUrl.indexOf("/") > 0 & _linkUrl.contains(".")) {
_tempLinks.add(_linkUrl);
newContent = newContent.replace(_linkUrl, getPath(_linkUrl) + getFileName(_linkUrl)); //*******
}
_temp = _temp.substring(_temp.indexOf("<a") + 3);
}



7- با فرض اینکه شما تا مرحله 6 را با موفقیت پشت سر گذاشتید ، توضیحات را ادامه میدم :
این برنامه خوب کار میکنه اما یه مشکلی هست ! اینکه اگر ما بخواهیم مثلا 10 سطح را ذخیره کنیم یه سری مشکل خواهیم داشت؛ از جمله اینکه ممکن چندین با ارجاع به یک صفحه وجود داشته باشه و یا اینکه تعداد فایلهای ذخیره شده اونقدر زیاد بشه که همه چیز قاطی بشه !:متفکر:
برای حل این معظل ما می تونیم فایل های مربوط به هر سایت را داخل پوشه مجزا قرار بدیم.
70457
با این کار هم یه نظمی به فایل های ذخیره شده دادیم و هم می تونیم از ذخیره مجدد و تکراری فایل ها راحت بشیم و در آدرس دهی ها هم مشکلی وجود نخواهد داشت(وقتی ذخیره در چند سطح صورت میگیره دسترسی به لینک های یک سطح خواص غیر ممکن میشه:متعجب:).

در آخر باید خدمتتون عرض کنم که کل کد این برنامه(کنسول، با کلی متد اضافه) حدوداً 200 خط میشه (20 دقیقه) :لبخند: پس لطفاً وقت بزارید و کد را کامل کنید.

taghymusavi
جمعه 20 خرداد 1390, 13:55 عصر
سلام
واقعا دستت درد نكنه خيلي مفيد بود
اما اين 20 كه گفتي فكر كنم منظور روز بوده نه دقيقه! خيلي ريز كاري داره

ميخواستم من با گذاشتن يه مطلب كامل ترش كنم
حالا چطوري عكس هاي يه سايت رو دانلود كنيم و تو كامپيوتر بريزيم

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

public class SaveImageFromUrl {

public static void main(String[] args) throws Exception {
String imageUrl = "http://www.avajava.com/images/avajavalogo.jpg";</SPAN>
String destinationFile = "image.jpg"; saveImage(imageUrl, destinationFile); } public static void saveImage(String imageUrl, String destinationFile) throws IOException {
URL url = new URL(imageUrl);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destinationFile);

byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}

is.close();
os.close();
}

}

taghymusavi
جمعه 20 خرداد 1390, 13:59 عصر
يه نكته مهم ديگه اينه كه معمولا تو سايت هاي آدرس هاي به صورت ضمني نوشته ميشه مثل
Style/stayle.css اين كار مارو ساده تر ميكنه
ميشه يه پوشه به همين نام تو كامپيوتر ايجاد كرد و فايل مورد نظر رو اونجا دانلود كرد بدون اينكه احتياجي به تغيير آدرس تو فايل اصلي باشه
مثلا تو مثال بالا ما ميتونيم فايل Css رو تو پوشه Style تو كامپيوتر