PDA

View Full Version : اجرای دستور چک کردن صفحات پیاپی یک سایت



raico90
شنبه 28 خرداد 1390, 22:46 عصر
سلام به همگی

ببخشید اگه سوال خیلی مبتدی هستش...ولی من اون کلماتی که فکر میکردم منو به مطلبی که تو این زمینه کمکم بکنه پیدا نکردم.

به فرض ما بوسیله یک تابعی که محتواش لینکهای مشخص یک سایت هست میخوایم که دونه دونه رو صفحات کار کنیم.

مثلاً سایت خبرگزاری مهر :

http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=1316559

الان به فرض میخوایم از شماره 1 تا 1000 NewsID رو چک کنیم

باید چجوری این متغییر رو عدد دهی کنم؟

alismith
یک شنبه 29 خرداد 1390, 00:29 صبح
سلام

اگر امکان داره بیشتر توضیح بدید، چون این کار که با تعریف یک باید امکان پذیر باشه
در کجا می خواهید استفاده کنید؟
مثلا :



for($i=1; $i <= 1000; $i++){

$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i"

/////////////////////////

$file = file_get_contents($url);

}




موفق باشید

raico90
یک شنبه 29 خرداد 1390, 01:35 صبح
سلام

اگر امکان داره بیشتر توضیح بدید، چون این کار که با تعریف یک باید امکان پذیر باشه
در کجا می خواهید استفاده کنید؟
مثلا :



for($i=1; $i <= 1000; $i++){

$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i"

/////////////////////////

$file = file_get_contents($url);

}




موفق باشید

من این کد رو اجرا میکنم ولی ارور میده!


<?
for($i=134566; $i <= 134570; $i++){
$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i"
$file = file_get_contents($url);
file_put_contents("mehr$i.html", $file)
}
?>


Parse error: parse error in D:\project\mehr.php on line 4

alismith
یک شنبه 29 خرداد 1390, 01:56 صبح
دوست عزیز این خط را اصلاح کنید


$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i";


موفق باشید

raico90
یک شنبه 29 خرداد 1390, 02:04 صبح
الان ارور اومد رو خط 6 :


Parse error: parse error in D:\project\mehr.php on line 6

alismith
یک شنبه 29 خرداد 1390, 02:18 صبح
باز هم مشکل قبای هستش :


file_put_contents("mehr$i.html", $file);

استفاده از ;


موفق باشید

raico90
یک شنبه 29 خرداد 1390, 02:28 صبح
درست شد.
ممنون علی جان.

الان چجوری میشه بجز فایلهای html خروجی...یک پرینت از وضعیت هم گرفت.
مثلاً وقتی فایل اولی ایجاد شده بنویسه که فایل یک ایجاد شد.
دومی الی آخر...
اگه فایلی ایجاد نشد و اون صفحه وجود نداشت بگه که فایل ایکس موجود نبود.

alismith
یک شنبه 29 خرداد 1390, 03:00 صبح
سلام

این هم نمونه کد :

<?php


for($i=1; $i <= 2; $i++){

$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i";

/////////////////////////

$file = file_get_contents($url);

if(file_put_contents("mehr$i.html", $file)){

echo "file has been successfully created - mehr$i.html<br/>";

}else{

echo 'Error to create file :(<br/>';

}
}

?>





موفق باشید

raico90
یک شنبه 29 خرداد 1390, 18:03 عصر
ممنون علی جان...

حالا ما بیایم و موضوع رو کمی پیشرفته تر کنیم.
با اجرای فایل یک خروجی از لیست لینکها رو تو صفحه ببینیم. مثل زیر :


Your News Link :

http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=1
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=2
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=3
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=4
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=5
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=6
http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=7

بعد یک دکمه ای باشه که استارت زده بشه.
بعد از استارت یکی یکی که فایلهای صفحات به سرور انتقال پیدا میکنه اعلام وضعیت صورت بگیره.
اونهایی که اوکی بود یه تیک بیافته کنارش
اونهایی که مشکل داشت یه علامت ضربدر بخوره.

alismith
یک شنبه 29 خرداد 1390, 21:33 عصر
سلام

من الان به وب سرور دسترسی ندارم این رو امتحان کنید ببینید مشکل حل میشه :



<?php

function getContent(){

for($i=1; $i <= 4; $i++){

$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i";

/////////////////////////

$file = file_get_contents($url);
if($file){

if(file_put_contents("mehr$i.html", $file)){

echo "file has been successfully created - mehr$i.html FROM $url <br/>";

}else{

echo "Error to create file FROM $url<br/>";

}
}else{

echo "Eror file NOT found FROM $url<br/>";

}
}

}

if(isset($_GET['do'])){

getContent();

}

?>

<a href="?do=start">START</a>





موفق باشید

alismith
یک شنبه 29 خرداد 1390, 21:49 عصر
این رو هم امتحان کنید :



<?php

function getContent(){

for($i=1; $i < 5; $i++){

$url = "http://www.mehrnews.com/fa/NewsDetail.aspx?NewsID=$i";

/////////////////////////

$file = file_get_contents($url);
if($file){

if(file_put_contents("mehr$i.html", $file)){

echo "file has been successfully created - mehr$i.html FROM $url <br/>";

}else{

echo "Error to create file FROM $url<br/>";

}

fclose($file);

}else{

echo "Eror file NOT found FROM $url<br/>";

fclose($file);

}
}

}

if(isset($_GET['do'])){

getContent();

}

?>

<a href="?do=start">START</a>





موفق باشید

raico90
دوشنبه 30 خرداد 1390, 00:10 صبح
کدهای آخری برای خط 28 این اررو رو میده :
Parse error: parse error, expecting `','' or `';'' in

البته این فقط یک start رو نشون میده که با کلیک روش فایل ها کشیده میشه رو سرور.
من میخواستم که قبل از استارت لینکها ساخته و لیست بشه.
به محض اتمام کار هر لینک هم جلوش مشخص بشه که چه وضعیتی داره.
یه جورایی progress Bar داشته باشه...وضعیت عملیات مشخص باشه.

ممنون

alismith
دوشنبه 30 خرداد 1390, 00:37 صبح
سلام

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


موفق باشید

raico90
دوشنبه 30 خرداد 1390, 10:18 صبح
علی جان ... لطف میکنید مثالی برای نمایش خروجی بصورت آژاکس بزنید؟

صابر طهماسبی
چهارشنبه 01 تیر 1390, 11:27 صبح
سلام
همه تاپیک ها رو خوندم
چیزخاصی به نظرم نمی رسه هرچی بوده دوستان فرموده اند.
فقط دو مورد که دوست عزیز raico90 سوال کردند :


سرعت سرور : این یک امر نسبی است و شما باید تصمیم بگیرید که چه چیز برای شما مهم تر است : حجم پردازش سرور کاهش پیدا کند ولی در مقابل داده هایی که بین شما و سرور رد و بدل می شود افزایش می یابد و بلعکس.مثلا اگر می توانید لینکها را با جاوا اسکریپت تولید کنید و با استفاده از آژاکس یکی یکی به سرور ارسال کنید و سرور هم سریع فایل را دانلود و کرده و نتیجه را بر می گرداند که می توانید ان را با تیک زدن جلوی لینک یا علامت خطا نمایش دهید،مزیت این روش کاهش حجم پردازش سرور هست و همچنین امکان اطلاع از لینکهای خراب که دانلود آنها با مشکل مواجه می شود.ولی در کل متوسط سرعت انجام کار تغییر چندانی نمی کند فقط پردازش بین سرور و کلاینت تقسیم می شود.
استفاده از cURL تاثیری در سرعت ندارد فقط cURL امکاناتی دارد که در اینجا کاربرد ندارند(مانند لاگین کردن و ارسال و دریافت کوکی ها و...)


در ضمن کدی را که دوست گرامی alismith گذاشتند که هرفایلی که دریافت می شود نتیجه را نمایش دهد بنده امتحان نکردم ولی بر اساس مباحث تئوریک و تجربه گمان نمی کنم کار کند چون وقتی یک پروسه شروع می شود تا زمانی که به اجرای آخرین دستور نرسد نتیجه به مرورگر ارسال نمی شود.

raico90
چهارشنبه 01 تیر 1390, 18:50 عصر
حق با شماست جناب طهماسبی.
کدی که علی عزیز زحمتش رو کشیدند نتایج نهایی رو نمایش میده...یعنی بعد اینکه همه لینکها تعیین وضیع شد همه رو پشت سرهم مینویسه.

صابر طهماسبی
پنج شنبه 02 تیر 1390, 12:17 عصر
سلام
با اجازه دوستان
قدم به قدم شروع به ساخت یک برنامه برای اینکار می کنم(ممکنه چند روزی طول بکشه چون سرم خیلی شلوغه) همه بخش های کد را تکه تکه می نویسم و در آخر به صورت یک پروژه کامل جمع بندی می کنم انشاءالله:
ابتدا تابعی برای دریافت محتویات صفحه به صورت استاندارد می نویسیم :

function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

توضیح فکر نکنم بخواد!اظهر من الشمس

در مورد پردازش اطلاعات بستگی به محتویات صفحه ای که دریافت می کنیم روش خاص خودش را باید در نظر بگیریم برای مثال اگر XML باشد باید آن را با تواع خاص خودش پردازش کنیم و ... در اینجا محتویات صفحه ما html است البته نکته قابل توجه این است که اگر قالب html سایت استاندارد باشد و تگها منظم باشند می توان از توابع خاصی که برای اینکار در خود php هست استفاده کرد (مثلا عبارات منظم یا همان RgegularExpression یا DomDocumnet)و به راحتی اطلاعات را استخراج کرد اما متاسفانه بیشتر سایت ها با این مورد مشکل دارند و استاندارد نیستند و ما باید کمی ابتکار به خرج داده و روشی را خودمان پیدا کنیم.

روشی را که بنده به ذهنم رسید عرض خواهم کرد و اگر دوستان چیز بهتری پیدا کردند دریغ نکنند.

خوب حالا اطلاعات صفحه رو با این تابع گرفته و در متغیر content می ریزیم :


$content = file_get_contents_utf8("http://www.mehrnews.com/fa/newsdetail.aspx?NewsID=1342313");

خوب پردازش را شروع می کنیم:فرض کنید می خواهیم عنوان خبر و متن آن را از صفحه استخراج کنیم برای اینکار از روش خودم استفاده می کنم البته ممکن است با روشهایی که گفتم بتوان به راحتی این کار را انجام داد اما بدلیل اینکه بنده فرصت تست کردن ندارم سایت مورد استفاده را با امتحان نکردم اگر دوستان توانستند حتما تست کنند چون ممکن است کار کند و کار راحتتر شود.
اگر به سورس صفحه نگاه کنید متوجه می شوید که عنوان خبر در داخل تگ span با class به نام news_title قرار دارد برای استخراج قسمتی از کد که حاوی عنوان باشد ابتدا و انتهای آن را پیدا می کنیم سپس با substr آن را استخراج می کنیم(البته بازهم کار دارد).خوب ابتدای متن (ابتدای عنوان) را با کد زیر استخراج می کنیم :

$start=strpos($content, 'class="news_title"');

و پایان متن(بعد از متن خبر) را با کد زیر :

$end=$end=strpos($content, '</p></span>');

در مورد کد بالا عرض کنم که اینجا شانس بزرگی یار ما بود که پایان متن را می شود با علامتی خاص تشخیص داد در غیر این صورت اگر </p></span> چند بار در کد صفحه تکرار شده بود این عمل به این سادگی امکان پذیر نبود شاید هم اصلا ممکن نبود.

و در نهایت ان بخش از کد صفحه که بین start و end هست را استخراج می کنیم :

$result = substr($content,$start,$end-$start);

تمامی کدهای این قسمت به صورت یکجا (می تونید تست کنید) البته یه echo به آخرش اضافه کردم برای نمایش خروجی:

<?php

function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

$content = file_get_contents_utf8("http://www.mehrnews.com/fa/newsdetail.aspx?

NewsID=1342313");
$start=strpos($content, 'class="news_title"');
$end=$end=strpos($content, '</p></span>');
$result = substr($content,$start,$end-$start);

echo $result;

?>

تا قسمت بعد فعلا مرخص می شوم.
خداحافظ

raico90
جمعه 03 تیر 1390, 16:44 عصر
این کد جواب میده...فقط باید به تعداد کاراکترهای تگ استارت از ابتدای متن حذف بشه...چون همین تگی که میدیم رو تو خروجی نشون میده که نیازی نیست.
البته اگه بشه برنامه خودش تعداد کاراکتر ابتدایی که میدیم رو حساب کنه و اتومات حذف کنه کار پردازش هم راحتتر و اشتباهات هم کمتر خواهد بود.
تو این مثال باید به تعداد class="news_title" که 18 کاراکتر هستش حذف بشه.

renosa900
چهارشنبه 19 بهمن 1390, 13:24 عصر
با سلام و خسته نباشید

در صورتی که بخواهیم صفحه وبی را جستجو کنیم که احتیاج به لوگین داره چیکار باید بکنیم

سئوالمو با یه مثال می پرسم
فرض کنید من یه اطلاعاتی را دارم که وقتی وارد سایت می شم برام نمایش میده مثل تعداد پست شما و یا تشکر کردن از شما و غیره ....
اگر بخوام این اعداد رو فرضا" بدست بیارم و توصفحات وب خودم استفاده کنم چیکار باید بکنم با تشکر

mbf5923
چهارشنبه 19 بهمن 1390, 14:25 عصر
باید از Curl استفاده کنید و ابتدا مقادیر خواسته شده رو از اون سایت بخونید و نتیجه رو دریافت کنید

renosa900
چهارشنبه 19 بهمن 1390, 23:40 عصر
با سلامی مجدد

میشه یه مثال بزنید تا بیشتر متوجه بشم ؟