PDA

View Full Version : خوندن بخش دلخواه از لینک به کمک curl و ترکیب با preg_match



funpatogh
شنبه 08 اسفند 1388, 00:50 صبح
سلام
من با curl محتویات یک لینک رو میخوام بخونم با پترن ها تریکبش کنم و مثلا ازیک لینک خبر فقط title خبر و متن کامل خبر رو بگیرم
این کد کورل


<?php
// create a new curl resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.barnamenevis.org/forum/");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);

// grab URL and pass it to the browser
$output=curl_exec($ch);

// close curl resource, and free up system resources
curl_close($ch);


if (preg_match ("@\<title\>(.*)\</title\>@i", $output, $array)) {

$title = $array[1];

}

echo $title;
?>



الان عنوان خبر رو میتونم ببینم بدون مشکل
اما برای خوندن متن کامل خبر نمیدونم دقیقا باید چه کار کنم
یعنی مثل عنوان که <title></title> داره متن کامل خبر تگ خاصی نداره
نیازمند معلومات شما هستم

امیـرحسین
شنبه 08 اسفند 1388, 01:40 صبح
شما دارید توسط C-URL محتوای صفحه رو میگیرید پس باید همونجور که عنوان رو پیدا کردید. خبر رو هم از طریق DOM پیدا کنید. باید HTML صفحه رو از طریق توابع DOM در PHP به DOM تبدیل کنید و از اون طریق بین Nodeها و تگها حرکت کنید. مثلا متن خبر در تگ body در یک DIV با id مثلا content هست و الا آخر....
یه نگاهی به SimpleXML بندازید. کار کردن باهاش خیلی سادست.

Mah
یک شنبه 09 اسفند 1388, 10:59 صبح
دوست عزيز :
من قبلا چنين كاري را انجام دادم .
اما من از تابع file_get_contents استفاده كردم .
مثال :


$str1=file_get_contents('http://barnamenevis.org/forum/showthread.php?t=207420');


پس از خواندن صفحه اطلاعات مورد نياز را جدا كردم و نشان دادم .

موفق باشيد .

yasgig
یک شنبه 09 اسفند 1388, 13:48 عصر
پس از خواندن صفحه اطلاعات مورد نياز را جدا كردم و نشان دادم .
میشه در مورد جداسازی کمی توضیح بدین یا همون کد خودتون رو که با هاش جداسازی می کنید اینجا قرار بدین؟

Mah
یک شنبه 09 اسفند 1388, 14:42 عصر
همانطور كه مي دانيد من كل صفحه را به صورت يك رشته خوندم ، بعد قسمتي از رشته را كه مي خواستم بريدم و استفاده كردم :


//خواندن محتواي صفحه ....
$st2=file_get_contents("http://www.Myweb.Com/Work.aspx");
//بدست آوردن و بريدن بخش ابتدايي ...
$st2=substr($st2,strpos('<table id="tbwork">'));
// جدا سازي بخش انتهايي ....
$st2=substr($st2,0,strpos($st2,'</table>'));

// بعد هم رشته باقيمانده كه همان قسمت دلخواه شماست را مي توانيد هر طور كه مايليد استفاده نمائيد .


از محاسن اين روش اين است كه وب سايت شما به صورت خودكار آپديت مي شود و مزايايي كه شما بهتر مي دانيد ....
نمونه كامل اين مثال همين صفحه آگهي استخدام روزنامه هاي كثير الانتشار (http://www.hamisabzghomes.ir/UrlRead.php) كه در امضاء من نيز آمده است .

موفق و پيروز باشيد .

yasgig
یک شنبه 09 اسفند 1388, 19:44 عصر
فرض کنید محتوای صفحه من به صورت زیر هستش

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body style="margin: 1px; background-color: rgb(255, 255, 255);">
<div style="background-color: rgb(255, 255, 255); font-family: tahoma; font-style: normal; font-variant: normal; font-weight: normal; font-size: 8pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; height: 108px; color: rgb(0, 0, 0);" dir="rtl">
<div style="padding: 3px; text-align: center;"><b>
آمار سایت
</b></div>

<div style="padding: 0px 5px 2px; font-family: tahoma; font-style: normal; font-variant: normal; font-weight: normal; font-size: 9pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; text-align: right;">
بازديد امروز:&nbsp;2 <br>
بازديد هفته:&nbsp;13 <br>
بازديد ماه:&nbsp;13 <br>
بازديد سال:&nbsp;13 <br>
بازديد كل:&nbsp;13 <br>
</div>

<div style="text-align: center;">
<a target="_blank" style="text-decoration: none; color: rgb(0, 0, 0);" href="http://yasgig.ir/">یاس گیگ
</a>
</div>
</div>

</body></html>
حالا چجوری میشه از کد شما استفاده کرد و فقط از

<div style="padding: 0px 5px 2px; font-family: tahoma; font-style: normal; font-variant: normal; font-weight: normal; font-size: 9pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; text-align: right;">
تا اولین div بسته شده را نشون داد؟من هر کاری کردم نتونستم جداسازی کنم.در ضمن می تونین کمی در مورد او 0 و ... کمی توضیح بدین؟یعنی می خوام بدونم نقش اون 0 چیه؟
با تشکر

امیـرحسین
یک شنبه 09 اسفند 1388, 21:28 عصر
همانطور كه مي دانيد من كل صفحه را به صورت يك رشته خوندم ، بعد قسمتي از رشته را كه مي خواستم بريدم و استفاده كردم :


//خواندن محتواي صفحه ....
$st2=file_get_contents("http://www.Myweb.Com/Work.aspx");
//بدست آوردن و بريدن بخش ابتدايي ...
$st2=substr($st2,strpos('<table id="tbwork">'));
// جدا سازي بخش انتهايي ....
$st2=substr($st2,0,strpos($st2,'</table>'));

// بعد هم رشته باقيمانده كه همان قسمت دلخواه شماست را مي توانيد هر طور كه مايليد استفاده نمائيد .

اگر توی اون table یه table دیگه باشه چی؟ اون موقع اسکریپت با رسیدن به اون متوقف میشه. در این حالت بهتره از Regex استفاده بشه که در اون حالت هم اگر بالای این جدول یک جدول مشابه ایجاد بشه مشکل بوجود میاد.

برای این کار روشهای زیادی وجود داره. این بستگی به شرایط داره. حتی میشه با جاوااسکریپت این کار رو کرد اگر محتوا کم باشه. روش Mah خوبه اگر ساختار صفحه چنین امکانی رو به ما بده.

همونجور که گفتم با DOM هم میشه این کار رو کرد. می تونیم کدهای صفحه رو XML در نظر بگیریم و با استفاده از SimpeXML توش حرکت کنیم. که این روش هم محدودیت داره و اون اینکه ساختار صفحه باید استاندارد و کامل باشه یعنی <br> مشکل داره و باید </ br> باشه تا کار کنه یا همه تگها بسته شده باشه یا همه کدها توی <html> باشن.
یه اکستنژن هست به نام Tidy که کارش اینه که میاد کدهای HTML رو مرتب می کنه. میشه باهاش یه صفحه HTML بی سر و ته رو به XML و XHTML معتبر تبدیل کرد. کد زیر نمونه Yasgig هست که از قضا بسیاری از قوانین XHTML رو رعایت نکرده و میشه tidy رو باهاش مثال زد:
$page = <<<PAGE
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body style="margin: 1px; background-color: rgb(255, 255, 255);">
<div style="background-color: rgb(255, 255, 255); font-family: tahoma; font-style: normal; font-variant: normal; font-weight: normal; font-size: 8pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; height: 108px; color: rgb(0, 0, 0);" dir="rtl">
<div style="padding: 3px; text-align: center;"><b>
آمار سایت
</b></div>

<div style="padding: 0px 5px 2px; font-family: tahoma; font-style: normal; font-variant: normal; font-weight: normal; font-size: 9pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; text-align: right;">
بازديد امروز:&nbsp;2 <br>
بازديد هفته:&nbsp;13 <br>
بازديد ماه:&nbsp;13 <br>
بازديد سال:&nbsp;13 <br>
بازديد كل:&nbsp;13 <br>
</div>

<div style="text-align: center;">
<a target="_blank" style="text-decoration: none; color: rgb(0, 0, 0);" href="http://yasgig.ir/">یاس گیگ
</a>
</div>
</div>

</body></html>
PAGE;


$tidy = new tidy;
$tidy = tidy_parse_string($page, array('output-xhtml' => TRUE), 'UTF8'); // Parse HTML codes
$page = $tidy->cleanRepair(); // Clean the codes

$page = "<?xml version='1.0'?>" . $page; // Add XML header

$xml = simplexml_load_string($page); // Create SimpleXML instance
$target = $xml->body[0]->div[0]->div[1]; // Get: First <body> ... first <div> in it ... second <div> in previous <div>
echo $target->asXML(); // asXML shows data with html tags
Tidy باید روی PHP5 نصب باشه ولی من الان دو تا هاست رو چک کردم دیدم نبود. اطلاعات بیشتر از Tidy:

پيکربندی Tidy (http://blog.phpmystery.com/?plink=59)
بهينه سازی فايلها توسط Tidy (http://blog.phpmystery.com/?plink=60)


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

funpatogh
یک شنبه 09 اسفند 1388, 22:01 عصر
خوب مشکل من اینه که همه سایت ها که شروع و پایان متن کامل خبرشون یکی نیست
مثلا تایتل صفحه توی همه جا تگ <title></title>هست و مسلما معلومه اما برای بادی صفحه ما کلیه قالب سایت رو داریم با منو های اصلی سایت و ...
این که چه طوری بفهمونیم که فقط وسط صفحه رو جدا کنه یکم سخته
من اگه توی سایتم متن کامل خبر رو این شکلی بدم


<p align=right dir=rtl>
متن کامل خبر
</p>

اگه باز از این تگ موجود بود چی؟
یا اصلا من بین تگ <p> بزارم یک سیات دیگه بین <div></div> گزاشتش چی؟
فکر کنم باید برای هر سایتی که میخوهیم اخبارشو برداریم باید یک الگو تعریف کنیم مثلا بگیم اگه از فلان سایت بود از این الگو استفاده کنه و فلان سایت بود از الگوی ویژه که برای اون نوشتیم

Mah
سه شنبه 11 اسفند 1388, 08:19 صبح
دوست عزيز .
شما بايد براي هر خبرگزاري يك كد جدا بنويسيد .
من نيز قبلا به چنين مشكلي برخوردم كه مجبور شدم كدم را تغيير بدم .
بهتره براي هر خبرگزاري يك صفحه داشته باشي ، كه بر حسب مورد از جداساز مناسب استفاده كني .

موفق باشيد .

funpatogh
سه شنبه 11 اسفند 1388, 20:24 عصر
دوست عزيز .
شما بايد براي هر خبرگزاري يك كد جدا بنويسيد .
من نيز قبلا به چنين مشكلي برخوردم كه مجبور شدم كدم را تغيير بدم .
بهتره براي هر خبرگزاري يك صفحه داشته باشي ، كه بر حسب مورد از جداساز مناسب استفاده كني .

موفق باشيد .
آها مرسی عزیز
میشه از یک ایده هم استفاده کرد
به جای اینکه مثلا صفحه جدا بسازیم برای هر سایت پترنش رو بریزیم توی دیتابیس و از بانک پترن رو بخونیم
بهتر نیست؟

Mah
جمعه 14 اسفند 1388, 11:50 صبح
آها مرسی عزیز
میشه از یک ایده هم استفاده کرد
به جای اینکه مثلا صفحه جدا بسازیم برای هر سایت پترنش رو بریزیم توی دیتابیس و از بانک پترن رو بخونیم
بهتر نیست؟

من با اين ايده موافقم .
چيز جالبي ميشه .

yasgig
جمعه 14 اسفند 1388, 18:03 عصر
آیا میشه با file_get_contents محتوای یه صفحه رو گرفت و یه متن خاص رو حذفش کرد و به جای اون متن خودمون رو بنویسیم.به طور مثال از محتوای صفحه به صورت زیر باشه:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="margin:1px;background-color: FFFFFF ">
<div style="background-color:FFFFFF ; font:8pt tahoma; height:108px; color: 000000 " dir="rtl">
<div style="padding:3px; text-align:center"><b>
آمار سایت
</b></div>

<div style="padding: 0px 5px 2px 5px ; font:9pt tahoma; text-align:right">
بازديد امروز:&nbsp;2 <br>
بازديد هفته:&nbsp;13 <br>
بازديد ماه:&nbsp;13 <br>
بازديد سال:&nbsp;13 <br>
بازديد كل:&nbsp;13 <br>
</div>

<div style="text-align:center">
<a target="_blank" style="text-decoration:none; color: 000000" href="http://example.com">دریافت كد آمارگیر از وب استات
</span></a>
</div>
</div>
</body></html>

حالا می خوام نام اون لینک رو به صورت دریافت ابزار از یاس گیگ و آدرس لینک رو به http://www.yasgig.ir تغییر بدم. یا اینکه با چه قاعده ای میشه فقط قسمت آمار رو جداسازی کرد؟
با تشکر

Mah
شنبه 15 اسفند 1388, 09:09 صبح
دوست عزيز همانطور مي بيني (در پستهاي قبلي همين تاپيك) من بخشي از لينكها و ... را تغيير دادم ؛ يعني Replace كردم .
شما هم مي تواني از همين تكنينك استفاده كني .

yasgig
شنبه 15 اسفند 1388, 13:23 عصر
اون کدی رو که شما قرار دادین یکم مشکل داره.من با هاش هر کاری کردم ارور داد.در ضمن یک متغییر رو دو بار تعریف کردین.میشه کمی اونو بهینه کنید؟در ضمن میشه کمی در مورد اون کد کمی توضیح بدین؟این substr و strpos چیه؟
با تشکر

Mah
شنبه 15 اسفند 1388, 13:51 عصر
من داخل رشته جستجو مي كنم .


//بدست آوردن و بريدن بخش ابتدايي ...
$st2=substr($st2,strpos('<table id="tbwork">'));

در اينجا '<table id="tbwork"' را پيدا كردم و با تابع substr رشته را بريدم . يعني از ابتداي رشته تا محل برگردانده شده توسط تابع strpos را دور انداختم .


// جدا سازي بخش انتهايي ....
$st2=substr($st2,0,strpos($st2,'</table>'));

در اينجا هم همان عمليات اتفاق مي افته ؛ فقط يك فرق كوچك داره كه من از ابتداي رشته يعني موقعيت 0 تا محل انتهاي رشته مورد نظر را جدا مي كنم و نگه مي دارم .

توضيحات substr و strpos



strpos

(PHP 4, PHP 5)
strpos — Find position of first occurrence of a string

Description

int strpos ( string $haystack , mixed (http://barnamenevis.org/forum/language.pseudo-types.html#language.types.mixed) $needle [, int $offset = 0 ] )
Returns the numeric position of the first occurrence of needle in the haystack string. Unlike the strrpos() (http://barnamenevis.org/forum/function.strrpos.html) before PHP 5, this function can take a full string as the needle parameter and the entire string will be used.


------------


SubStr

string substr ( string $string , int $start [, int $length ] )
Returns the portion of string specified by the start and length parameters.








موفق باشيد .

nimatramon
پنج شنبه 20 اسفند 1388, 23:42 عصر
دوست عزیز من واسه صفحات گوگل این کار را گردم، اگر با DOM آشنا نیستی یا کار کردن با XML و Request برات سخته می تونی با file_Get_content محتوا را بگیری و با پترن مورد نظرت داده ها را استخراج کنی با چند تا split و preg ساده می تونی راحت این کار را انجام بدی... :لبخندساده:

funpatogh
جمعه 21 اسفند 1388, 14:56 عصر
یاس گیگ عزیز جوابشو خودم فهمیدم در اختیارتون میزارم تجربه خودم رو


<?php
$url ="http://forum.funpatogh.com/showthread.php?t=46335";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
ob_start();
$html=curl_exec($ch);
ob_end_clean();
curl_close ($ch);

if( preg_match( '/<title>(.*?)<\/title>/si' , $html , $match ) ) {
echo "<b>$match[1]</b>";
}

if( preg_match( '/<div id="post_message_219936">(.*?)<\/div>/si' , $html , $Match ) ) {
echo $Match[1];
}












?>

yasgig
جمعه 21 اسفند 1388, 23:38 عصر
خیلی ممنون.مشکل حل شد.