Phần 2: Grab có phân trang
Phần 3: Tạo form nhập link để get
Phần 4: Get link bài viet trong chuyênmục
Phần 5: Kết hợp phần 3 và phần 4
Phần 6: Insert data
Phần 7: Code demo và lời kết
Các bạn theo dõi lại seri này ở đây nhé http://zinghay.mobi/forum/huong-dan-grab-va-viet-tool-leech-toan-tap/434.html
Nguồn: daivietpda
Để dễ hiêu ta sẽ làm với file_get_contents () trước nhé
cách dùng như sau
<?
echo file_get_contents ('https://daivietpda.vn');
?>
Copy code
các bạn thử lưu code trên vào file test.php r chạy thử coi nhé.
để lấy được các html thì mình sẽ lưu kết quả trả về của hàm vào 1 biến như sau
<?
$ketqua = file_get_contents ('https://daivietpda.vn');
echo $ketqua;
?>
Copy code
uhm bây giờ ta có được kết quả vậy r thì ta sẽ thực hiện các thao tác khác để lấy được cái mình muốn từ bộ html mình nhận được
bay giờ mình sẽ lấy trang doctruyen360.com để làm ví dụ nhé, cụ thể hơn là trang này
[URL='http://www.doctruyen360.com/danh-sach-truyen-ngan-hay-truyen-ngan-tinh-yeu/'http://www.doctruyen360.com/danh-sach-truyen-ngan-hay-truyen-ngan-tinh-yeu/[/URL
code như này
<?
$ketqua = file_get_contents ('http://www.doctruyen360.com/danh-sach-truyen-ngan-hay-truyen-ngan-tinh-yeu/');
echo $ketqua;
?>
Copy code
rồi mình sẽ lấy các link trên trang đó nhé, ở đây mình dùng lớp hàm preg_ mà cụ thể là preg_match_all()
Chú ý 1 chút mình thấy rằng các link nó đều có dạng
<a title="nội dung1" href="nội dung2">nội dung 3</a>
vậy là ta chỉ cần code như sau
preg_match_all ('#<a title="(.+?)" href="(.+?)">(.+?)</a>#',$ketqua,$danhsachlink);
Copy code
ok, chạy thử nào
<?
$ketqua = file_get_contents ('http://www.doctruyen360.com/danh-sach-truyen-ngan-hay-truyen-ngan-tinh-yeu/');
preg_match_all ('#<a title="(.+?)" href="(.+?)">(.+?)</a>#',$ketqua,$danhsachlink);
?>
<pre><?print_r ($danhsachlink);?></pre>
Copy code
nếu bạn chạy code trên nó sẽ ra 1 mớ loằng ngằng nhưng sẽ có dạng cố định như sau
array có key = 0 nó chứa các link dạng
<a title="nội dung1" href="nội dung2">nội dung 3</a>
array có key = 1 nó chứa các nội dung 1
array có key = 2 nó chứa các nội dung 2
array có key = 3 nó chứa các nội dung 3
nếu bạn muốn in cái nào ra chỉ cần sửa ở đây (giả sử mình muốn in ra nôi dung 2 là các link )
<?
$ketqua = file_get_contents ('http://www.doctruyen360.com/danh-sach-truyen-ngan-hay-truyen-ngan-tinh-yeu/');
preg_match_all ('#<a title="(.+?)" href="(.+?)">(.+?)</a>#',$ketqua,$danhsachlink);
?>
<pre><?print_r ($danhsachlink[2);?></pre>
Copy code
bạn hãy chú ý số 2 nhé, bạn thay số nào tùy thích.
Tiếp cho bài viết nè, như ở phần 1 ta biết được grab 1 trang là ntn r nhỉ, nói sơ thêm cho phần 1, nếu bạn muốn lấy nội dung bài viết chẳng hạn không phải link như ở kia thì ta cũng sẽ dùng preg_ để lấy nó ra thôi, mình cũng muốn các bạn chú ý và tìm hiểu về lớp hàm preg_ để sau này mình viết ra các bạn sẽ dễ hiểu hơn, tại sao mình muốn các bạn nên tìm hiểu preg_ vì nó khá dễ dùng và nhiều lựa chọn, bóc tách nội dung cũng tuyệt vời, kết quả trả vào mảng nên khá dễ dàng xử lí . đơn giản mình lấy link này làm ví dụ nè,
http://www.doctruyen360.com/do-khon-sao-de-toi-nho-cau-chuong-73/
nếu bạn không có pc mà muốn xem source cho nhanh bạn hãy làm như sau
<?
$ketqua = file_get_contents ('http://www.doctruyen360.com/do-khon-sao-de-toi-nho-cau-chuong-73/');
echo htmlentities($ketqua,ENT_QUOTES,'UTF-8');
?>
Copy code
lưu code trên vào file nào đó r chạy thì sẽ nhận được bộ mã html. ok có mã html r thì ta sẽ xem xét coi nội dung nó nằm từ chỗ nào đến chỗ nào, mình nhận thấy nội dung nó nằm từ thẻ<div class="dtct1072"> đến <div id="fcbk_share">
và các thẻ ấy đều chỉ có 1 thôi, 1 ở đây là trên bộ mã html mình chỉ thấy có duy nhất thẻ ấy, muốn biết có duy nhất hay không trên máy tính bạn bôi đen thẻ ấy r nhấn ctrl + c rồi nhấn ctrl + f rồi nhấn ctrl + v rồi enter sẽ thấy số kết quả ở góc trên bên phải
ok mình sẽ làm 1 biểu thức so mẫu để lấy nội dung ra bằng hàm preg_match
preg_match ('#<div class="dtct1072">(.+?)<div id="fcbk_share">#s',$ketqua,$noidung);
Copy code
rồi, code hoàn chỉnh sẽ là
<?
$ketqua = file_get_contents ('http://www.doctruyen360.com/do-khon-sao-de-toi-nho-cau-chuong-73/');
preg_match ('#<div class="dtct1072">(.+?)<div id="fcbk_share">#s',$ketqua,$noidung);
echo $noidung[1;
?>
Copy code
vậy là đã xong phần 1 tại đây nhé.
phần 2: grab có phân trang
mình lấy topkute.net để làm hướng dẫn nhé
link để ta cùng bàn tới sẽ là http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444.html
ok đi vào phần chính, trước hết ta sẽ có 2 việc đó là lấy nội dung trên trang và xác định tổng số trang.
để lấy nội dung như thường lệ ta sẽ view source lên và thật tình cờ và thật bất ngờ , nội dung nằm gọn trong <big> và </big>. thiết kế ngay function lấy nội dug như sau
function lay_noi_dung ($html)
{
preg_match ('#<big>(.+?)</big>#s',$html,$noidung);
return $noidung[1;
}
Copy code
để lấy tổng số trang ta để ý thấy link các trang khác có dạng <a class="pagenav" ...>số trang </a>, mình chỉ quan tâm cái số trang kia thôi như vậy ta sẽ lấy tất cả cái số trang kia và lấy giá trị lớn nhất làm tổng số trang
function lay_tong_so_trang($html)
{
preg_match_all('#<a class="pagenav"(.+?)>(.+?)</a>#',$html,$tongsotrang);
return max($tongsotrang[2);
}
Copy code
có thể một số bạn sẽ thắc mắc tại sao khi thì preg_match, khi thì preg_match_all
thì cái này cũng đơn giản, nếu biểu thức so mẫu chỉ có 1 ta sẽ dùng preg_match, nếu có nhiều hơn 1 ta sẽ dùng preg_match_all vậy có thể dùng preg_match_all khi chỉ lấy 1 kết quả k thì xin thưa là có, cho dễ hiểu preg_match_all nó sẽ lấy tất cả chuỗi phù hợp biểu thức so mẫu còn preg_match chỉ lấy 1 kết quả phù hợp đầu tiên nó tìm được.
Như vậy ta đã có trọn ven rồi nhỉ, giờ chỉ việc dùng vòng lặp từ trang 1 đến trang cuối để lấy nội dung thôi,
$url = '....';
$html = file_get_contents ($url);
$tongsotrang = lay_tong_so_trang ($html);
for ($i=1;$i<=$tongsotrang;$i++)
{
$link = '...trang-' . $i . '.html';
echo lay_noi_dung ($link);
}
Copy code
như vậy ta hoàn thiện code nhé
function lay_noi_dung ($html)
{
preg_match ('#<big>(.+?)</big>#s',$html,$noidung);
return $noidung[1;
}
function lay_tong_so_trang($html)
{
preg_match_all('#<a class="pagenav"(.+?)>(.+?)</a>#',$html,$tongsotrang);
return max($tongsotrang[2);
}
$url = 'http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444.html';
$html = file_get_contents ($url);
$tongsotrang = lay_tong_so_trang ($html);
for ($i=1;$i<=$tongsotrang;$i++)
{
$link = 'http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444_trang-' . $i . '.html';
$htm = file_get_contents ($link);
echo lay_noi_dung ($htm);
}
Phần 3: Tạo form nhập link để get
Phần này mình nghĩ là khá ngắn nên sẽ nói thêm vài cái khác nữa.
như các bạn đã biết hoặc một số chưa rõ thì html tương tác với php qua form, đây là kiến thức cơ bản khi làm việc với php và html. muốn gửi dữ liệu từ form vào cho php xử lí ta có 2 phương thức là post và get, nó như thế nào các bạn có thể google để tìm thêm thông tin, ở đây mình sẽ làm theo phương thức get, và cả sau này ta cũng sẽ sử dụng phương thức này.
rất đơn giản thôi ạ, bạn tao 1 form với 1 ô nhập link và nút submit, thuộc tính name của thẻ input nhập link mình đặt là link.
<form method="get">
Nhập link: <input name="link">
<input type="submit">
</form>
Copy code
trên đây là phần html, đến phần php ta sẽ dùng biến môi trường $_GET để lấy giá trị gửi lên từ form, lưu ý vì method trong form là get nên ta sẽ dùng $_GET. còn nếu method là post thì ta dùng $_POST.
Nhập link: <input name="link">
<input type="submit">
</form>
<?
if (isset ($_GET['link'))
{
$link = $_GET['link';
//code ở đây
}
Copy code
ở đây ta có sử dụng hàm isset() để kiểm tra xem $_GET['link' có giá trị hay chưa, nếu có r thì ta làm tiếp không thì không làm gì, còn làm gì tiếp thì ta sẽ quan tâm sau.
vậy để dễ hình dung bạn hãy lưu code sau thành 1 file .php và chạy thử coi như thế nào nhé.
Nhập link: <input name="link">
<input type="submit">
</form>
<?
if (isset ($_GET['link'))
{
$link = $_GET['link';
echo $link;
}
Copy code
ở phần 2 ta đã có được code lấy nội dung có phân trang, code nó như này
{
preg_match ('#<big>(.+?)</big>#s',$html,$noidung);
return $noidung[1;
}
function lay_tong_so_trang($html)
{
preg_match_all('#<a class="pagenav"(.+?)>(.+?)</a>#',$html,$tongsotrang);
return max($tongsotrang[2);
}
$url = 'http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444.html';
$html = file_get_contents ($url);
$tongsotrang = lay_tong_so_trang ($html);
for ($i=1;$i<=$tongsotrang;$i++)
{
$link = 'http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444_trang-' . $i . '.html';
$htm = file_get_contents ($link);
echo lay_noi_dung ($htm);
}
Copy code
để ứng dụng những cái nói nãy giờ ở trên và code kia ta sẽ chỉ quan tâm đến cái $url trong code trên thôi, thay vì ở phần 2 ta sẽ phải sửa $url mỗi khi muốn grab 1 trang khác thì bây giờ chỉ việc nhập link vào form nhấn nút thì ta sẽ cho $url = $_GET['link' là coi như giải quyết xong . còn cái nhỏ này nữa, chú ý dòng này $link = 'http://topkute.net/forum/truyen-teen-buoc-ve-phia-em-full_8444_trang-' . $i . '.html';
ta sẽ để ý các link đều kết thúc bằng .html và số page nó nằm sát .html ấy đồng thời có cấu trúc cố định là ......_id_trang-số trang.html, ta dùng preg_replace để xử lí cái đuôi cho nó chuẩn là dc thôi mà.
vậy code hoàn chỉnh như sau
Nhập link: <input name="link">
<input type="submit">
</form>
<?
if (isset ($_GET['link'))
{
$url = $_GET['link';
function lay_noi_dung ($html)
{
preg_match ('#<big>(.+?)</big>#s',$html,$noidung);
return $noidung[1;
}
function lay_tong_so_trang($html)
{
preg_match_all('#<a class="pagenav"(.+?)>(.+?)</a>#',$html,$tongsotrang);
return max($tongsotrang[2);
}
$html = file_get_contents ($url);
$tongsotrang = lay_tong_so_trang ($html);
for ($i=1;$i<=$tongsotrang;$i++)
{
$link = preg_replace('#.html$#','_trang-' . $i . '.html',$url);
$htm = file_get_contents ($link);
echo lay_noi_dung ($htm);
}
}
Copy code
Hi all member!, lâu lắm rồi mới rảnh được chút nên định sẽ hoàn thành nốt seri này cho các bạn.!
Bài này ta sẽ quan tâm đến vấn đền Get link bài viết trên chuyên mục có phân trang.
uhm ta lấy một ví dụ đơ giản như này http://topkute.net/forum/truyen-ngan_180.html
, ờ thì mình sẽ đi vào phân tích 1 chút nhé. khi nhấp vào 1 rang khác thì link nó có dạng như sau http://topkute.net/forum/index.php?id=180&page=3, ngon rầu, với loại này ta chỉ việc thay cái chỉ số sau $page=[chỉ số là ta sẽ có 1 trag khác, tuy nhiên vì nó dễ thế nên ta bỏ đó đã, trước tiên phải lấy được link trên trang đó.
viewsource lên coi thấy link nó nằm theo kiểu như này
<td><a href="http://topkute.net/forum/truyen-ngan-rang-khenh_8646.html" title="Truyện ngắn - Răng khểnh">Truyện ngắn - Răng khểnh</a><br> Lượt xem: 236</td>
vậy ta thiết kế function lấy link như sau
{
preg_match_all('#<td><a href="(.+?)"#',$html,$link);
return $link;
}
Copy code
quay lại với cái kia ngó qua thấy tổng số page nó là 94 vậy là xong, lặp và lặp nào
{
preg_match_all('#<td><a href="(.+?)"#',$html,$link);
return $link;
}
for($i=1;$i<95;$i++)
{
$catlink = 'http://topkute.net/forum/index.php?id=180&page=' . $i;
$htm = file_get_contents($catlink);
$list[ = get_link_category($htm);
}
print_r($list);
Copy code
xong rồi đó