۳ سیدرضا بازیار
درخواست راهنمایی برای خروجی کد اسکرپینگ با روش curl
جامعه پی اچ پی ایجاد شده در ۱۲ اسفند ۱۴۰۰

سلام. من یه کد دارم که کد رو پایین میزارم (از یه کتاب قدیمی گرفتم)


function curlGet($url) {
 $ch = curl_init(); 
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
 curl_setopt($ch, CURLOPT_URL, $url);
 $results = curl_exec($ch); 
 curl_close($ch); 
 return $results; 
}
function scrapeBetween($item, $start, $end) 
{
    if (($startPos = stripos($item, $start)) === false) {
        return false; 
    } 
    else if (($endPos = stripos($item, $end)) === false) 
    {
        return false; 
    } 
    else 
    {
        $substrStart = $startPos + strlen($start); 
        return substr($item, $substrStart, $endPos - $substrStart);
    }
}
$page = curlGet('https://www.packtpub.com/');
$analyticsId = scrapeBetween($page, '(["_setAccount", "', '"])');
echo $analyticsId;

اول میاد توی تابع curlGet یه صفحه وب رو میگیره. سپس با CURLOPT_RETURNTRANSFER میاد بجای اینکه خروجی رو نمایش بده، اون رو برمیگردونه. سپس با true کردن CURLOPT_FOLLOWLOCATION اجازه ریدایرکت رو هم میدیم. سپس با CURLOPT_URL آدرس صفحه ای رو که میخوایم پردازش کنیم رو ارسال میکنیم و در نهایت این تابع باید سورس صفحه رو return کنه.

حالا در تابع scrapeBetween سه متغیر رو دریافت میکنیم. ۱- در متغیر اول سورس صفحه ای رو میفرستیم که در تابع بالا پردازش شده. ۲- در متغیر دوم چی رو خواسته؟ ۳- در متغیر سوم چی رو خواسته؟

حالا در تایع scrapeBetween از حلقه if استفاده شده که در او از تابه stripos استفاده شده:

stripos(string,find,start)

string: رشته میزبان که قرار است رشته ی مورد نظر در آن یافت شود.

find: رشته ی مورد جستجو

start: این پارامتر مشخص می‌کند که فعل جستجو از کجا/کدام اندیس شروع شود.

پس در if اول میاد رشته اول که از طریق scrapeBetween ارسال شده رو جستجو میکنه. اگر false بود، false برمیگردونه. درغیر اینصورت میره else if که در اون رشته دوم رو جستجو میکنه. اگر false بود، false برمیگردونه. درغیر اینصورت میره else و در اینجا:

$substrStart = $startPos + strlen($start); /// not false + strlen((["_setAccount", ")
return substr($item, $substrStart, $endPos - $substrStart);

$startPos که رشته اول هست که false نبوده.

$start ورودی اول هست که از طریق scrapeBetween ارسال شده. اون رو توی تابع strlen قرار داده که این تابع طول رشته رو برمیگردونه

این دو تا رو جمع میکنه و در $substrStart میریزه

سپس در تابع substr میزاره:

substr ( string $string , int $start [, int $length ] ) : string

این تابع قسمتی از رشته را که از start شروع میشه و به طول length است رو برمیگردونه.

string: رشته ی ورودی که قرار است عملیات مورد نظر بر روی آن اجرا شود را مشخص می‌کند.

start: این تابع اندیس شروع برش و استخراج کاراکترهای رشته را مشخص می‌کند.

length: این تابع طول رشته/تعداد کاراکترهایی که باید استخراج شود را مشخص می‌کند.

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

حالا خروجی کد باید این باشه:

UA-284627-1

ولی خروجی یک صفحه سفید هست. چرا؟

سلام دوست عزیز وقت بخیر

کل کدهایی که نوشتید همین هست ؟

اگر بیشتر هست لطفاً فایل پروژه رو پیوست کنید تا بررسی کنیم به طور کامل توضیح بدیم موفق باشید


کیان سلگی ۱۲ اسفند ۱۴۰۰، ۱۶:۵۹

کل کد همینه. مثلا من میخوام لوگو سون لرن رو استخراج کنم. کافیه در scrapeBetween ابتدا سورس صفحه قرار بگیره. سپس یه تکه کد از ابتدای لوگو و سپس یه تکه کد از انتهای لوگو. میتونه لوگو رو برام استخراج کنه. توی پروژه هام ازش استفاده میکنم. ولی دوست دارم کامل درکش کنم که بدونم دقیقا چیکار میکنه

سیدرضا بازیار ۱۲ اسفند ۱۴۰۰، ۱۷:۰۳

سلام دوست عزیز

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

موفق باشید.

Amir_Programer_1380

کیان سلگی ۱۳ اسفند ۱۴۰۰، ۰۶:۲۸