10/10/2018, 09:49

PHP - Lấy thông tin từ web khác

Quyết có 1 phương pháp dễ dàng để đọc dữ liệu và bóc tách text html từ trang web khác với link đưa về là 1 chuỗi ID.

Ví dụ ta có link của trang web có định dạng như sau:
http://www.tenmien.com/media/player/...bed.php?vkey=1

Chú ý: Các bạn có thể dùng thử với trang này:
http://www.youhot.com/media/player/c...bed.php?vkey=1
- Nội dung của nó không được hay lắm nhưng đó là 1 ví dụ thực tế để kiểm tra kết quả.

- Trong file tôi đưa lên là đã hoàn thành và bạn có thể test thử, hiện giờ tôi không thể upload được file .rar lên đây, không biết tại sao.

1. Tôi tạo 2 thư mục images và file.
2. Tôi tạo database để lưu trữ dữ liệu là link phim và ảnh để dùng sau này: tenmien_db
Code:
SET FOREIGN_KEY_CHECKS=0;

DROP DATABASE IF EXISTS `tenmien_db`;

CREATE DATABASE `tenmien_db`
    CHARACTER SET 'latin1'
    COLLATE 'latin1_swedish_ci';

USE `tenmien_db`;

CREATE TABLE `tbllink` (
  `IDLink` int(255) NOT NULL AUTO_INCREMENT,
  `txtLinkImages` text,
  `txtLinkFile` text,
  PRIMARY KEY (`IDLink`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. Xem nội dung html trang web trả về, link tôi dùng ở đây trả về nội dung của 1 file xml.
Code:
<xml>
  <logo>
    <image>http://www.tenmien.com/media/player/logo/logo.png</image>
    <position>TR</position>
    <link>www.tenmien.com</link>
    <alpha>70</alpha>
  </logo>
  <video>
    <autorun>false</autorun>
    <image>http://www.tenmien.com/media/videos/tmb/1/default.jpg</image>
    <bufferTime>3</bufferTime>
     
    <server>lighttpd</server> 
     
	<src>http://www.tenmien.com:81/flv/f761abc54ddf5b92835e4c45a9779f70/4ac1b7f8/1.flv</src>
    <related>http://www.tenmien.com/media/player/related.php?mode=related&amp;video_id=1</related>
  </video>
  <mediaAdv>
    <src></src>
    <mode>none</mode>
    <duration></duration>
    <link></link>
  </mediaAdv>
  <textAdv enable="true">
    <src>http://www.tenmien.com/media/player/ads.php</src>
    <delay>5</delay>
  </textAdv>
  <share>http://www.tenmien.com/video/1/kenzi-marie-sucking-and-fucking</share>
  <embed><![CDATA[<embed width="452" height="361" quality="high" wmode="transparent" name="main" id="main" allowfullscreen="true" allowscriptaccess="always" src="http://www.tenmien.com/media/player/player.swf?f=http://www.tenmien.com/player/config.php?vkey=1" type="application/x-shockwave-flash" />]]></embed>
  <skin>http://www.tenmien.com/media/player/skin.php?t=default&amp;b=1&amp;r=1&amp;e=1&amp;s=1&amp;m=1&amp;p=1&amp;mc=0x999999&amp;rc=0x999999&amp;ec=0x999999&amp;rec=0x999999&amp;cc=0xf1f1f1&amp;tc=0x999999&amp;sc=0x999999&amp;anc=0x999999&amp;atc=0xffa200&amp;abc=0xf1f1f1&amp;alc=0x999999&amp;video=1</skin>
</xml>
- Ta cần lấy http://www.tenmien.com/media/videos/tmb/1/default.jpg là link của ảnh số 1
- Link của video số 1: http://www.tenmien.com:81/flv/f761ab...4ac1b7f8/1.flv

4. Bắt đầu code trang lấy dữ liệu:

PHP Code:
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
<title> :::: </title>
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<table border="0" cellpadding="5" cellspacing="0" align="center">
<?php
$txtHost 
""// Ten host
$txtDbName ""// Ten database
$txtUserName ""// Ten dang nhap db
$txtPassword ""// Mat khau dang nhap db

if (mysql_pconnect($txtHost,$txtUserName$txtPassword))
{
    
// Ket noi database
    
if (!mysql_select_db($txtDbName))
        exit(
"Ko kết nối được<br>");
}
else
    exit(
"Ko kết nối được<br>");

function 
insertLinkImagesFile($txtLinkImages,$txtLinkFile)
{
    
// Insert vào bảng tbllink với link ảnh và link video
    
$sql "INSERT INTO tbllink(txtLinkImages,txtLinkFile) VALUES('".$txtLinkImages."', '".$txtLinkFile."')";

    
// Thực thi câu lệnh sql
    
$query mysql_query($sql);
    if(
$query)
    {
        
// Nếu query thực thi câu sql chưa được giải phóng từ bộ nhớ của server thì giải phóng.
        
if(is_resource($query))
            
mysql_free_result($query);
        return 
1;
    }
}

// Đường dẫn đến file text lưu trữ link
$txtLinkFile "file/link.txt";

// Đường dẫn đến link trang web cần lấy dữ liệu với parametter để trống, giá trị sau cái parametter vkey sẽ được gán vào trong từng vòng lặp for
$txtLinkWeb "http://www.tenmien.com/media/player/config_embed.php?vkey=";

// Số là ID bắt đầu lấy
$intSoLinkForStart 1;

// ID kết thúc cũng là số lần for
$intSoLinkForEnd 400;

for(
$iiLink $intSoLinkForStart$iiLink <= $intSoLinkForEnd$iiLink++)
{
    
$txtNewContent null;
    
$txtNewImages null;
    
$txtLinkShow null;

    
// Nếu là lần chạy đầu tiên thì ghi đè dữ liệu là null lên file $txtLinkFile
    
if($iiLink == 1)
    {
        
$handle fopen($txtLinkFile"w");
        
fwrite($handlenull);
        
fclose($handle);
    }
    
// Gán parametter
    
$url $txtLinkWeb.$iiLink;

    
// Đọc toàn bộ nội dung html trang web trả về gán vào 1 biến
    
$txtContent file_get_contents($url);

    
// Độ dài của nội dung được đọc về
    
$intLengContent strlen($txtContent);

    
// Nếu như độ dài của nội dung trả về lớn hơn 30 thì mới tiếp tục xử lý, vì nếu nhỏ hơn 30 web đó trả về giá trị Invalid video key! ít hơn 30 ký tự.
    
if($intLengContent 30)
    {
        
// Đằng trước của link http://www.tenmien.com/media/videos/tmb/1/default.jpg có 1 thẻ <image> nên ta sẽ dựa vào thẻ này để tìm vị trí chuỗi ta cần lấy nhưng bên trên nó lại có 1 thẻ <image> khác nên ta xác định vị trí của thẻ </autorun> chỉ xuất hiện có 1 lần nên việc tìm kiếm chắc chắn sẽ chính xác
        
$intVtriAutoRunDong strpos($txtContent,"</autorun>");

        
// Ta lấy vị trí của thẻ <image> bắt đầu từ vị trí của thẻ </autorun>, ta + thêm 7 ký tự vì độ dài của thẻ <image> là 7
        
$intVtriMoImage strpos($txtContent,"<image>",$intVtriAutoRunDong) + 7;

        
// Ta tiếp tục lấy được nội dung link ảnh từ vị trí của thẻ <image> trở về sau
        
$txtContentImages substr($txtContent,$intVtriMoImage);

        
// Ta tìm vị trí </image> trong chuỗi vừa lấy được lúc này không còn thẻ <image> nữa
        
$intVtriImagesDong strpos($txtContentImages,"</image>");

        
// Như vậy ta lấy được chuỗi bắt đầu từ hết thẻ <image> lúc này là vị trí 0 đến vị trí của thẻ </image>
        
$txtNewImages substr($txtContentImages,0,$intVtriImagesDong);

        
// Tìm vị trí bắt đầu link ta cần với giá trị + 5 là + thêm độ dài của chuỗi <src>
        
$intVtriSrcMo strpos($txtContent,"<src>") + 5;

        
// Lấy dữ liệu bắt đầu từ vị trí <src> đến hết
        
$txtContent2 substr($txtContent,$intVtriSrcMo);
        
// Lấy vị trí thẻ </src>
        
$intVtriSrcDong strpos($txtContent2,"</src>");

        
// Như vậy ta lấy được chuỗi bắt đầu từ hết thẻ <src> lúc này là vị trí 0 đến vị trí của thẻ </src>
        
$txtNewContent substr($txtContent2,0,$intVtriSrcDong);
        
        
// Gọi function add link ảnh và link phim lên database
        
insertLinkImagesFile($txtNewImages,$txtNewContent);

        
// Gán giá trị của thư mục chứa bức ảnh trong thư mục images ta tạo lúc trước là ID hiện tại đang thực thi
        
$linkTest "images/".$iiLink;

        
// Đưa ra đường dẫn của bức ảnh sau khi lấy dữ liệu về hiển thị lên trang
        
$txtLinkShow $linkTest."/default.jpg";

        
// Nếu cái link ví dụ images/1 không tồn tại thì xử lý tiếp bên trong
        
if(is_dir($linkTest) != 1)
        {
            
// Tạo thư mục images/1
            
mkdir($linkTest);

            
// Dùng lệnh copy để copy ảnh từ link lấy được vào thư mục images/1 tất nhiên với tên default.jpg
            
copy($txtNewImages$txtLinkShow);
        }

        
// Đọc toàn bộ dữ liệu của file đã được gán lúc trước là file/link.txt
        
$txtNewHandle file_get_contents($txtLinkFile);

        
// Nếu không phải lần chạy đầu tiên thì dữ liệu sẽ tồn tại, tiếp tục vào trong
        
if($txtNewHandle != null)
            
// Nối chuỗi đoạn text của link mới vào đoạn text vừa đọc được trong file
            
$txtNewHandle .= "
"
.$txtNewContent;
        else
            
// Gán đoạn text của link mới đè lên dữ liệu null của file
            
$txtNewHandle $txtNewContent;

        
// Mở file và lưu dữ liệu vừa ghép được vào lại file cũ
        
$handle fopen($txtLinkFile"w");
        
fwrite($handle$txtNewHandle);
        
fclose($handle);
?>
    <tr>
        <td style="text-align: center;">
            <!-- Show bức ảnh với link ảnh lấy được trong lần lặp này ->
            <img src="<?php echo $txtLinkShow?>" alt="" />
        </td>
        <td style="text-align: left;">
            <!-- Show nội dung với link lấy được trong lần lặp này ->
            <?php echo $txtNewContent?>
        </td>
    </tr>
<?php
    
}
}
?>
</table>
</body>
</html>
phuongthom viết 11:51 ngày 10/10/2018
tuts này ko bao quát cho lắm :-?
QUYETC2 viết 11:51 ngày 10/10/2018
hi, mình viết ở đây không có tính chất bao quát, mình muốn nói trong toàn bộ bài viết này thực ra để ai đọc mà chưa biết có thể hiểu là có thể dùng 1 cách lấy thông tin từ web khác mà kết quả được trả về bởi dãy ID qua parametter giống nhau.
thuyduongcd viết 11:58 ngày 10/10/2018
Vấn đề chỉ là lấy nội dung trang web về, nghiên cứu cấu trúc của nó và dùng hàm xử lý chuỗi mà bóc tách ra những gì mình cần. Chấm hết
ads viết 11:53 ngày 10/10/2018
Được gửi bởi thuyduongcd
Vấn đề chỉ là lấy nội dung trang web về, nghiên cứu cấu trúc của nó và dùng hàm xử lý chuỗi mà bóc tách ra những gì mình cần. Chấm hết
Đúng như dzậy, cấu trúc HTML ouput mỗi site nó thiết kế khác nhau nên đối với mỗi site phải thay mấy cái tham số trong hàm xử lý khác nhau.
chieens viết 12:02 ngày 10/10/2018
Rất hay nhưng ứng dụng thế nào vậy bác
bka viết 12:04 ngày 10/10/2018
chẳng có cách nào là bao quát cho trường hợp get content.

với trên thì chẳng cần phức tạp vậy

chỉ cần

Code:
$html=file_get_contents('http://www.tenmien.com/media/player/config_embed.php?vkey=1');
preg_match_all('%<image>(.*?)</image>%si',$html, $img, PREG_PATTERN_ORDER);
print_r($img);
Shellingfox viết 11:59 ngày 10/10/2018
Mô phật. Cái này dữ liệu xml, php cũng có sẳn một bộ thư viện xml rồi mà sao lại cứ quy đổi xml sang thành dạng string rồi ngồi xử lý nhỉ?
bka viết 12:03 ngày 10/10/2018
Được gửi bởi Shellingfox
Mô phật. Cái này dữ liệu xml, php cũng có sẳn một bộ thư viện xml rồi mà sao lại cứ quy đổi xml sang thành dạng string rồi ngồi xử lý nhỉ?
ở trên đang nói về get content bạn àh. với lại tư duy như bạn không khác gì nhà bên cạnh cũng bán giấy mà bạn nhất quyết phải đến tận hiệu sách mới mua đc
rootkit viết 11:52 ngày 10/10/2018
sử dụng php DOM mà bóc tách ,cũ rồi
Bài liên quan
0