PDA

View Full Version : سوال: چرا curl سورس بعضی از سایتها رو درهم ریخته نمایش می ده ؟ (حل شد)



idocsidocs
سه شنبه 23 مهر 1392, 01:37 صبح
من از کد زیر برای گرفتن سورس یه صفحه استفاده می کنم. مشکل اینجاست که این کد روی بعضی از سایتها به خوبی اجرا می شه ولی سورس بعضی از سایتها رو بصورت درهم و نامشخص به خروجی می ده.

اگر سرور سایت خارج از ایران باشه، تاثیری روی کار کردن curl داره؟

خروجی نامرتب:

hœZ0A&”À:Ñ¡¶œÚžŒvHënf@¢I—$Œ¯œ]Lü_ÿXh§»^’ŸnUÆ€%\X/ìto¡W }·*RÅ׿ŸB^Vó¹‚9˜l›TͶ"¹ù®’èÍž##£èÍ.fôÒÆ/¹eK9†âEÙs;™€öÀÑU êNFŠâÎ׿?úŒ‘ûÉکدی که استفاده می کنم:


$ch = curl_init();

$header=array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 115',
'Connection: keep-alive'
);

$opts[CURLOPT_RETURNTRANSFER]=1;
$opts[CURLOPT_HTTPHEADER]=$header;
$opts[CURLOPT_SSL_VERIFYPEER]=FALSE;
$opts[CURLOPT_URL]=$url;
$opts[CURLOPT_TIMEOUT]=$timeout;

curl_setopt_array($ch, $opts);

echo curl_exec($ch);

tmwebseo
سه شنبه 23 مهر 1392, 10:12 صبح
دوست گرامی شما وقتی که با curl خروجی یک سایت را استخراج میکنید آدرس css ها و jsها برای بعضی از سایت ها که آدرس مجازی داده اند درست استخراج نمیشود و دلیل به هم ریختگی صفحه تان همین است.

MMSHFE
سه شنبه 23 مهر 1392, 10:23 صبح
مورد دیگه اینکه User Agent مربوط به cURL توسط برخی سایتها بسته میشه. User Agent رو با توجه به این لیست (http://www.useragentstring.com/pages/All/) به یه چیز دیگه مثل GoogleBot و امثال اون که سایتها دوستشون دارن، تغییر بدین ببینید درست میشه یا نه. البته یه راهی هم توی شرکتمون برای اینکه اصلاً نشه با cURL محتوا رو خوند، ابداع کردیم و شاید بعضی سایتهای دیگه هم از چنین روشهایی استفاده میکنن و وقتی با cURL میخواین بخونید، متنهای قشنگ تحویلتون میدن.

idocsidocs
سه شنبه 23 مهر 1392, 10:43 صبح
مورد دیگه اینکه User Agent مربوط به cURL توسط برخی سایتها بسته میشه. User Agent رو با توجه به این لیست (http://www.useragentstring.com/pages/All/) به یه چیز دیگه مثل GoogleBot و امثال اون که سایتها دوستشون دارن، تغییر بدین ببینید درست میشه یا نه. البته یه راهی هم توی شرکتمون برای اینکه اصلاً نشه با cURL محتوا رو خوند، ابداع کردیم و شاید بعضی سایتهای دیگه هم از چنین روشهایی استفاده میکنن و وقتی با cURL میخواین بخونید، متنهای قشنگ تحویلتون میدن. از لیستی که دادید چندتا رو امتحان کردم ولی بازم به همین صورت درهم ریخته خروجی می داد.

قسمت مربوط به هدرها رو حذف کردم و سورس صفحات بدون مشکل نمایش داده شد اما آیا ارسال نشدن این هدرها می تونه باعث ایجاد مشکل بشه؟


$opts[CURLOPT_HTTPHEADER]=$header;
هدرها رو از خروجی فایرباگ گرفتم، این هدرها فرمت درستی دارن؟

$header=array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 115',
'Connection: keep-alive'
);

وقتی curl رفتار یه مرورگر رو تقلید می کنه چطور می شه تشخیص داد که درخواست دهنده curl هست؟

بجای curl چه راهی وجود داره که رفتار یه مرورگر رو شبیه سازی کنیم و بدون مشکل سورس صفحات رو دریافت کنیم؟

MMSHFE
سه شنبه 23 مهر 1392, 12:22 عصر
بهترین راه همون cURL هست. توی هدرها اگه دقت کنید، gzip و deflate اومده (gzip توسط مرورگرها شناخته شده است و بطور خودکار متن فشرده شده، باز میشه ولی cURL اینطور نیست). همچنین کدگذازی Latin انتخاب شده. فکر میکنم مشکل از این دو مورد باشه. ضمناً cURL اگه Agent رو تغییر ندین، Agent خودش رو میفرسته که توی لینکی که گذاشتم، نوشته شده.

idocsidocs
سه شنبه 23 مهر 1392, 14:06 عصر
اگر بغیر از User-Agent بقیه هدرها رو اصلا ارسال نکنیم چه مکشلی پیش می یاد؟

MMSHFE
سه شنبه 23 مهر 1392, 15:02 عصر
نه همیشه ولی برای بعضی سایتها شاید لازم باشه هدرها به درستی تنظیم بشن تا متوجه نشه که از cURL استفاده میکنید و بلاک نکنه.

MostafaEs3
سه شنبه 23 مهر 1392, 15:10 عصر
//////////

idocsidocs
سه شنبه 23 مهر 1392, 17:15 عصر
curl_setopt ($ch, CURLOPT_ENCODING, "");
این کد چیکار می کنه؟ محتوای فشرده رو از حالت فشرده خارج می کنه یا اینکه به سرور می گه محتوا رو بدون فشرده سازی ارسال کن؟

توی این آرایه باید مقدار Accept-Encoding رو برای '' قرار بدم؟

$header=array( 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-us,en;q=0.5', 'Accept-Encoding: gzip,deflate', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Keep-Alive: 115', 'Connection: keep-alive' );

MostafaEs3
سه شنبه 23 مهر 1392, 18:55 عصر
//////////

idocsidocs
چهارشنبه 24 مهر 1392, 00:23 صبح
Accept-Encoding رو به همین حالت نگه دارید و یا میتونید اصلا ارسال نکنید (درصورت عدم ارسال احتمالا محتوا بصورت غیرفشرده بازگشت داده میشود)!
من یه کلاس نوشتم که اول با CURL محتوا رو بخونم و بعد با DOM تصاویر و لینکها رو چک کنم. این کار باید بصورت دوره ای انجام بشه و سایتهای زیادی بررسی می شن.

با توجه به محدودیت 30 ثانیه ای اجرای اسکریپتها، بنظرتون خوندن سورس هر صفحه با CURL و بررسی کردن محتوا با DOM چقدر زمان می بره؟

MostafaEs3
چهارشنبه 24 مهر 1392, 00:39 صبح
//////////