สอบถามวิธีการดึงข้อมูลเฉพาะส่วนจาก Website แบบตั้งเวลาดึง
ใช้ Query 2 Loop น่ะครับ Loop แรกเป็นหมวดหมู่ และแต่ล่ะหมวดหมู่ก็ Loop ข่าวออกมาแต่ล่ะรายการครับ
Date :
2013-03-28 06:21:10
By :
mr.win
Code (PHP)
?php
include('C:\AppServ\www\simple_html_dom.php');
$html = file_get_html('http://www.su.ac.th/html_news/all_news.asp'); //ดึงมาทุกหมวด
foreach($html->find('td[class=ms11search]') as $e) //ช่วงนี้ใช้ค้นหาหมวดหมู่ในCode
echo $e->innertext.'<br>';
$html = file_get_html('http://su.ac.th/html_news/news_01.asp'); //ต้องการให้ดึงหัวข้อมาแต่โค้ดยังไม่แสดงการดึงหัวข้อข่าว
echo $html;
foreach($html -> find('td class=ms09search') as $s) //ช่วงในการค้นหาหัวข้อข่าว
echo $s ->innertext.'<br>';
$urlWithoutProtocol = "http://su.ac.th/html_news/news_template.asp?id=5775"; //linkของข่าวที่ต้องการนำมาสกัด
$request = "";
$isRequestHeader = false;
$exHeaderInfoArr = array();
$exHeaderInfoArr[] = "Content-type: text/xml";
$exHeaderInfoArr[] = "Authorization: "."Basic ".base64_encode("authen_user:authen_pwd");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, (($isRequestHeader) ? 1 : 0));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if( is_array($exHeaderInfo) && !empty($exHeaderInfo) )
{
curl_setopt($ch, CURLOPT_HTTPHEADER, $exHeaderInfo);
}
$response = curl_exec($ch);
curl_close($ch);
$html = str_get_html($response);
$elem = $html->find('table td.ms09', 0)->plaintext;
echo $elem;
//echo $response;
?>
เขียนออกมาประมาณนี้จะ Loop ยังไงได้บ้างค่ะ
ขอบคุณมากค่ะ
Date :
2013-03-31 22:01:15
By :
Monkey_CONAN
สอบถามหน่อยนะค่ะ
จากโค้ดด้านบน จะดึงข้อมูลเป็น 2 loop ยังไงค่ะ
โค้ดด้านบนเป็นการดึงหมวดหมู่มาทั้งหมด
แล้ว loop ที่ใช้สำหรับการเจาะเข้าไปในการดึงข้อมูลด้านในของแต่หละหมวด
ต้องเขียนยังไงอะค่ะ
รบกวนแนะนำด้วยค่ะ
ขอบคุณค่ะ
Date :
2013-05-18 19:46:53
By :
Monkey_CONAN
Code (PHP)
<ul>
<?php
include('simple_html_dom.php');
$html = file_get_html('http://www.su.ac.th/html_news/all_news.asp');
foreach($html->find('td[class=ms11search] > a') as $a) {
$text = strip_tags($a->innertext);
echo "<li>$text ($a->href)<ul>";
if (($page = @file_get_html("http://www.su.ac.th/html_news/$a->href"))) {
foreach($page->find('td[class=ms09] > a') as $a) {
$text = strip_tags(iconv('TIS-620', 'UTF-8', $a->innertext));
echo "<li>$text ($a->href)</li>";
}
}
echo '</ul>';
}
?>
</ul>
Date :
2013-05-18 22:14:53
By :
cookiephp
ขอบคุณมากค่ะ
สอบถามเพิ่มเติม ถ้าเราไม่ Hard code ว่าลิงค์ก่อนหน้าคืออะไร
เราจะรู้ได้ยังไงอะคะว่าก่อนหน้า ของ news_01.asp คือ su.ac.th/html_news. และ
ก่อนหน้าลิงค์ ../html_news/news_template.asp?id=6422 > '..' นั่นคือ su.ac.th
Date :
2013-05-18 22:30:23
By :
Monkey_CONAN
หลักการคือหา base url ของหน้าที่โหลดมา โดยหา tag <base> ก่อน
ถ้าไม่มี tag <base> ก็ต้องตัด uri สุดท้ายออกเช่น
http://www.su.ac.th/html_news/all_news.asp
ก็ตัด all_news.asp ออกให้เหลือ http://www.su.ac.th/html_news/ ก็จะได้ base url
และเราจะต้องตรวจสอบให้ได้ว่าลิงก์ใดใดก็ตามที่อยู่ในหน้านั้นๆ เป็นมันเป็น relative url หรือ absolute url
หากเป็น relative url เราก็เอา href มาเชื่อมกับ base url ของหน้าปัจจุบันครับ
เช่น
href="new_01.asp" นี่คือ relative url
href="../html_news/news_template.asp?id=6422" นี่ก็คือ relative url
ถ้าถามว่าใช้อะไรในการตรวจสอบที่กล่าวมา ก็คงต้องเป็น regular expression ครับ
และถ้าขอตัวอย่างต่ออีก คงบอกว่า รอก่อนครับ
เอาไว้มีเวลาจะเขียนให้ดูครับ เพราะมันค่อนข้างซับซ้อนและใช้เวลาครับ
Date :
2013-05-18 23:12:47
By :
cookiephp
แต่ว่ากันตามจริง มันไม่มีทางที่จะทำอะไรอัตโนมัติได้ขนาดนั้นหรอกครับ
ขนาดการหาลิงก์ เรายังต้องอ้างอิงคลาสของ <td> เลย
ถ้าสักวันนึง หน้านั้นเปลี่ยนการแสดงผล ไม่ใช้ <td class="ms11search">
โค้ดข้างบนก็ใช้ไม่ได้แล้วครับ
Date :
2013-05-18 23:14:28
By :
cookiephp
ขอบคุณสำหรับคำแนะนำนะค่ะ
รบกวนถ้าว่าง ขอตัวอย่างด้วยค่ะ
ระหว่างนี้จะลองศึกษาเพิ่มเติม
ขอบคุณค่ะ
Date :
2013-05-18 23:51:49
By :
Monkey_CONAN
รบกวนนิดนึงคะตอนนี้เกิดปัญหา error
Warning: file_get_contents(http://[email protected] ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
จาก code
Code (PHP)
<ul>
<?php
include('simple_html_dom.php');
$html = file_get_html('http://www.su.ac.th/html_news/all_news.asp');
foreach($html->find('td[class=ms11search] > a') as $a) {
$text = strip_tags(iconv('TIS-620', 'UTF-8', $a->innertext));
echo "$text $a->href <br>";
if (($page = @file_get_html("http://www.su.ac.th/html_news/$a->href"))) {
foreach($page->find('td[class=ms09] > a') as $a) {
$text = (iconv('TIS-620', 'UTF-8', $a->innertext));
echo "<li>$text ($a->href)</li>";
$link = $a->href;
// preg_match_all
// ( '/\<a href\="(\.\.\/html_news\/news_template\.asp\?id\=\d+)"\>([^\<]+)\</', $link, $link_2, PREG_SET_ORDER ) ;
$result = str_replace(".." ,"", $link);
$link_2 = "http://www.su.ac.th/$result";
echo $link_2;
$link_3 = str_get_html($link_2);
$request = "";
$isRequestHeader = false;
$exHeaderInfoArr = array();
$exHeaderInfoArr[] = "Content-type: text/xml";
$exHeaderInfoArr[] = "Authorization: "."Basic ".base64_encode("authen_user:authen_pwd");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, (($isRequestHeader) ? 1 : 0));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if( is_array($exHeaderInfo) && !empty($exHeaderInfo) )
{
curl_setopt($ch, CURLOPT_HTTPHEADER, $exHeaderInfo);
}
$response = curl_exec($ch);
curl_close($ch);
$link_3 = file_get_html($link_2);
$link_4 = strip_tags($link_3->find('table td.ma09linespace', 0)->innertext);
echo $link_4 .'<br>';
echo $response;
ini_set('memory_limit', '512M'); //ปรับขนาดที่ต้องการจนกว่ามันจะไม่ error
ini_set('max_execution_time', '60'); //อันนี้แถมเผื่อเวลาโปรเซสไม่พอ
}
}
echo '</ul>';
}
?>
</ul>
จะสามารถสร้างเงื่อนไขยังไงได้บ้างคะ ว่าถ้าเจอเหตุการณ์ Error ด้านบนให้ข้ามไปทำงานต่อไป
Date :
2013-05-19 12:40:11
By :
Monkey_CONAN
รบกวนช่วยดูโค้ดนี้ให้หน่อยค่ะ
Code (PHP)
<ul>
<?php
ini_set('memory_limit', '512M'); //ปรับขนาดที่ต้องการจนกว่ามันจะไม่ error
ini_set('max_execution_time', '400'); //อันนี้แถมเผื่อเวลาโปรเซสไม่พ
include('simple_html_dom.php');
include('connect-1.php');
include('connect.php');
$html = file_get_html(WEB_URL."/html_news/all_news.asp");
$type_id = 0;
foreach($html->find('td[class=ms11search] > a') as $a)
{
$type_id++;
$head = strip_tags($a->innertext);
echo "<li> $head($a->href)<ul>";
echo $type_id;
if (($page = @file_get_html(WEB_URL."/html_news/{$a->href}")))
{
foreach($page->find('td[class=ms09] > font > a') as $page_a)
{
$text_1 = strip_tags(iconv('TIS-620', 'UTF-8', $page_a->innertext));
echo "<li> $text_1 ($page_a->href)</li>";
$page_a->href = str_replace(".." ,"", $page_a->href);
//echo $page_a->href;
if(($news = @file_get_html(WEB_URL."/{$page_a->href}")))
{
$url = WEB_URL."/{$page_a->href}";
$u = parse_url($url);
parse_str($u['query'], $p);
$newsid = $p['id'];
echo $newsid;
foreach($news->find('td[class=ma09linespace] > font') as $news_a)
{
$news_name = strip_tags(iconv('TIS-620', 'UTF-8', $news_a->innertext));
echo $news_name ."<br>";
}
}
}
}
echo '</ul>';
}
// mysql_close();
?>
</ul>
คือ ตรงส่วน โค้ด
Code
foreach($news->find('td[class=ma09linespace] > font') as $news_a)
{
$news_name = strip_tags(iconv('TIS-620', 'UTF-8', $news_a->innertext));
echo $news_name ."<br>";
}
คือช่วงค้นหาข้อมูลข่าว แต่สิ่งที่คือ บางข่าวมีลักษณ์ class 'td[class=ma09linespace] > font' จริงแต่ถ้าไปเจอข่าวไหนที่มี Class รูปแบบนี้ 'td[class=ma09linespace] > font > p' ข้อมูลข่าวจะไม่ออกมาอะค่ะ
จะเขียนยังไงให้สามารถดึงได้ทั้ง 2 แบบ
Date :
2013-05-21 22:39:30
By :
Monkey_CONAN
Load balance : Server 04