การใช้ CURL และ PHPSimpleHTMLDOMParser ทำให้ฉัน - 500 ข้อผิดพลาดเซิร์ฟเวอร์ภายใน

ฉันใช้ PHP Simple HTML DOM Parser คุณสามารถตรวจสอบเพิ่มเติมได้ที่นี่: http://simplehtmldom.sourceforge.net/

และฉันกำลังใช้ CURL เนื่องจากที่อยู่เว็บนี้ http://www.sportsdirect.com ไม่ได้โหลดบน ตัวอย่างปกติจาก SimpleHTMLDom

ดังนั้นนี่คือรหัสที่ฉันใช้:

<?php
include_once('../simple_html_dom.php');

$curl = curl_init(); 

 curl_setopt($curl, CURLOPT_URL, 'http://www.sportsdirect.com/'); 
 curl_setopt($curl, CURLOPT_HEADER, 0);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);  
 $str = curl_exec($curl);  
 curl_close($curl);  
  
 $html= str_get_html($str); 

echo $html->plaintext;
?>

เมื่อฉันพยายามโหลดสคริปต์ มันแจ้ง: 500 Internal Server Error

ข้อผิดพลาดเซิร์ฟเวอร์ภายใน

เซิร์ฟเวอร์พบข้อผิดพลาดภายในหรือการกำหนดค่าไม่ถูกต้อง และไม่สามารถดำเนินการตามคำขอของคุณได้

โปรดติดต่อผู้ดูแลเซิร์ฟเวอร์ [email protected] และแจ้งเวลาที่เกิดข้อผิดพลาด และสิ่งที่คุณอาจทำซึ่งอาจก่อให้เกิดข้อผิดพลาด

ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดนี้อาจมีอยู่ในบันทึกข้อผิดพลาดของเซิร์ฟเวอร์

นอกจากนี้ ยังพบข้อผิดพลาด 404 Not Found ขณะพยายามใช้ ErrorDocument เพื่อจัดการคำขอ

สคริปต์นี้ใช้ไม่ได้กับที่อยู่เว็บนี้ เพราะเมื่อฉันพยายามโหลดเว็บไซต์อื่น เช่น mandmdirectDOTcom สคริปต์ก็เริ่มทำงาน โอเค!

ข้อผิดพลาดของฉันอยู่ที่ไหนและฉันจะทำให้สิ่งนี้ทำงานได้อย่างไร


person user3788452    schedule 29.06.2014    source แหล่งที่มา
comment
ตรวจสอบบันทึกเซิร์ฟเวอร์ของคุณ แทนที่จะใช้คลาสนี้ คุณยังสามารถใช้โปรแกรมรวบรวมข้อมูล Symfony dom ซึ่งทำงานได้ดี   -  person Mateusz Nowak    schedule 30.06.2014


คำตอบ (2)


ลองใช้วิธีนี้เพื่อดึงข้อมูล curl มันใช้งานได้สำหรับฉันในกรณีนี้ นี่คือชุดมาตรฐานของตัวเลือกและการตั้งค่า curl ที่ฉันใช้ซึ่งทำงานได้ดี:

include_once('simple_html_dom.php');

$url = "http://www.sportsdirect.com";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSLVERSION, 3);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$str = curl_exec($curl);
curl_close($curl);

$html = str_get_html($str); 

echo $html->plaintext;

ฉันเชื่อว่าปัญหาเกี่ยวกับการตั้งค่า curl เดิมของคุณคือไม่มีตัวแทนผู้ใช้ ลองใช้สคริปต์เดียวกันกับบรรทัด CURLOPT_USERAGENT ที่ใส่ความคิดเห็นไว้เพื่อดูว่าฉันหมายถึงอะไร

เซิร์ฟเวอร์จำนวนมากมีการตั้งค่าไฟร์วอลล์ที่ไม่อนุญาตคำขอ curl จากผู้ใช้ที่ส่งคำขอโดยไม่มีการตั้งค่าตัวแทนผู้ใช้ที่เหมาะสม User Agent ที่ฉันตั้งค่าไว้ที่นี่เป็น User Agent ของ Firefox ที่ค่อนข้างทั่วไป ดังนั้นอย่าลังเลที่จะทดลองใช้สิ่งดังกล่าวเพื่อใช้อย่างอื่น

person Giacomo1968    schedule 29.06.2014
comment
ขอบคุณมากนะเพื่อน! โซลูชันของคุณทำงานได้อย่างสมบูรณ์แบบ! ขอพระเจ้าอวยพรคุณ คุณและครอบครัว!!! - person user3788452; 30.06.2014
comment
@ user3788452 FYI คุณไม่มีตัวเลือก CURLOPT_USERAGENT เท่านั้น - person Rahil Wazir; 30.06.2014

ลองตั้งค่าส่วนหัวโฮสต์ในคำขอ อาจเป็นไปได้ว่าโดเมนเป้าหมายอยู่บนเซิร์ฟเวอร์ที่ใช้ร่วมกัน หากไม่มีส่วนหัวของโฮสต์ เซิร์ฟเวอร์ก็จะไม่รู้ว่าต้องทำอย่างไร

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Host: www.sportsdirect.com'));
person shaunc    schedule 29.06.2014
comment
นี้! สมบูรณ์แบบ! ความโล่งใจหลังจากการดีบัก 6 ชั่วโมง! ยอดเยี่ยม! - person LowFieldTheory; 06.12.2015