NexxDigital - კომპიუტერები და ოპერაციული სისტემები

თქვენ შეისწავლით თუ როგორ უნდა მიიღოთ საიტზე გამოქვეყნებული ყველა სტატიის სია.

ნაბიჯი 1. მომზადება

პირველ რიგში, თქვენ უნდა დააკოპიროთ ბიბლიოთეკა მარტივი HTMLdom, რომელიც ხელმისაწვდომია ვებგვერდზე

ჩამოტვირთვის არქივი შეიცავს რამდენიმე ფაილს, მაგრამ თქვენ მხოლოდ ერთი გჭირდებათ simple_html_dom.php. ყველა სხვა ფაილი არის მაგალითები და დოკუმენტაცია.

ნაბიჯი 2: საფუძვლების ანალიზი

ამ ბიბლიოთეკის გამოყენება ძალიან მარტივია, მაგრამ არსებობს რამდენიმე ძირითადი რამ, რაც უნდა ისწავლოთ, სანამ მას ამუშავებთ.

$html = new simple_html_dom();
// ჩატვირთვა სტრიქონიდან
$html->ჩატვირთვა("

გამარჯობა მსოფლიო!

");
// Ატვირთე ფაილი
$html->load_file("http://net.tutsplus.com/");

თქვენ შეგიძლიათ შექმნათ საწყისი ობიექტი ჩატვირთვის გზით HTMLან სტრიქონიდან ან ფაილიდან. ფაილიდან ჩატვირთვა შეიძლება განხორციელდეს ან მითითებით URL, ან თქვენი ადგილობრივი ფაილური სისტემიდან.

შენიშვნები: მეთოდი load_file ()დელეგატები მუშაობენ PHP ფუნქციები file_get_contents. თუ allow_url_fopenარ არის დაყენებული მნიშვნელობაზე მართალიათქვენს ფაილში php.ini, მაშინ შეიძლება ვერ გახსნათ წაშლილი ფაილებიამგვარად. ამ შემთხვევაში, შეგიძლიათ დაუბრუნდეთ CURL ბიბლიოთეკის გამოყენებას ჩატვირთვისთვის წაშლილი გვერდებიდა შემდეგ წაიკითხეთ მეთოდის გამოყენებით დატვირთვა ().

ინფორმაციაზე წვდომა

მას შემდეგ რაც გექნებათ DOM ობიექტი, შეგიძლიათ დაიწყოთ მასთან მუშაობა ამ მეთოდის გამოყენებით პოვნა ()და კოლექციების შექმნა. კოლექცია არის სელექტორის მიერ ნაპოვნი ობიექტების ჯგუფი. სინტაქსი ძალიან ჰგავს jQuery-ს.



გამარჯობა მსოფლიო!


ჩვენ აქ ვართ.




Ამაში HTML მაგალითიჩვენ ვაპირებთ გაერკვნენ, თუ როგორ მივიღოთ ინფორმაცია მეორე აბზაცში, შევცვალოთ იგი და შემდეგ დავბეჭდოთ მოქმედებების შედეგი.

1. # შექმნა და ჩატვირთე HTML
2. include("simple_html_dom.php");
3. $html = new simple_html_dom();
4. $html->load(“

გამარჯობა მსოფლიო!

“);
5. # მიიღეთ ელემენტი, რომელიც წარმოადგენს მეორე აბზაცს
6. $element = $html->find(“p“);
7. # შეცვალეთ იგი
8. $element->innertext .= “ და ჩვენ აქ ვართ, რომ დავრჩეთ.“;
9. # გამომავალი!
10. echo $html->save();

სტრიქონები 2-4: ჩატვირთეთ HTML სტრიქონიდან, როგორც ზემოთ იყო ახსნილი.

ხაზი 6: იპოვეთ ყველა ტეგი

HTML-ში და დააბრუნეთ ისინი მასივში. პირველ აბზაცს ექნება ინდექსი 0, ხოლო მომდევნო აბზაცები შესაბამისად ინდექსირებული იქნება.

ხაზი 8: წვდომა ჩვენს აბზაცების კრებულში მეორე ელემენტზე (ინდექსი 1), დაამატეთ ტექსტი მის შიდატექსტის ატრიბუტს. შიდატექსტის ატრიბუტი წარმოადგენს ტეგებს შორის არსებულ შინაარსს, ხოლო გარე ტექსტის ატრიბუტი წარმოადგენს შინაარსს ტეგების ჩათვლით. ჩვენ შეგვიძლია შევცვალოთ ტეგი მთლიანად გარე ტექსტის ატრიბუტის გამოყენებით.

ახლა დავამატოთ ერთი ხაზი და შევცვალოთ ჩვენი მეორე აბზაცის ტეგის კლასი.

$element->class = "კლასის_სახელი";
echo $html->save();

საბოლოო HTML შენახვის ბრძანების შემდეგ ასე გამოიყურება:



გამარჯობა მსოფლიო!


ჩვენ აქ ვართ და აქ ვართ, რომ დავრჩეთ.



სხვა სელექტორები

სელექტორების რამდენიმე სხვა მაგალითი. თუ თქვენ იყენებდით jQuery, ყველაფერი ნაცნობი მოგეჩვენებათ.

# მიიღეთ ნაპოვნი პირველი ელემენტი id=“foo“-ით
$single = $html->find("#foo", 0);
# მიიღეთ ყველა ელემენტი კლასით "foo"
$collection = $html->find(".foo");
# მიიღეთ ყველა ბმული ტეგი გვერდზე
$collection = $html->find("a");
# მიიღეთ ყველა ბმული ტეგი, რომელიც მდებარეობს H1 ტეგის შიგნით
$collection = $html->find("h1 a");
# მიიღეთ ყველა img ტეგი title="himom"!}
$collection = $html->find("img");

პირველი მაგალითი მოითხოვს გარკვეულ განმარტებას. ყველა მოთხოვნა ნაგულისხმევად აბრუნებს კოლექციებს, ID-ის მოთხოვნასაც კი, რომელიც უნდა დააბრუნოს მხოლოდ ერთი ელემენტი. თუმცა, მეორე პარამეტრის მითითებით, ჩვენ ვამბობთ "დააბრუნეთ მხოლოდ პირველი ელემენტი კოლექციიდან".

Ეს ნიშნავს, რომ $ მარტოხელა- ერთი ელემენტი და არა ელემენტების მასივი ერთი წევრით.

დანარჩენი მაგალითები საკმაოდ აშკარაა.

დოკუმენტაცია

ბიბლიოთეკის სრული დოკუმენტაცია ხელმისაწვდომია მისამართზე.

ნაბიჯი 3: რეალური სამყაროს მაგალითი

ბიბლიოთეკის მოქმედებაში დემონსტრირებისთვის, ჩვენ დავწერთ სკრიპტს საიტის net.tutsplus.com შიგთავსის ამოსაჭრელად და საიტზე წარმოდგენილი სტატიების სათაურებისა და აღწერილობების ჩამონათვალს... მხოლოდ მაგალითის სახით. Scraping არის ვებ ხრიკი და არ უნდა იქნას გამოყენებული რესურსის მფლობელის ნებართვის გარეშე.

Include("simple_html_dom.php");
$სტატიები = მასივი();
getArticles ("http://net.tutsplus.com/page/76/");

დავიწყოთ ბიბლიოთეკის შეერთებით და ფუნქციის გამოძახებით getArticlesგვერდის მითითებით, საიდანაც გვინდა დავიწყოთ ანალიზი.

ჩვენ ასევე გამოვაცხადებთ გლობალურ მასივს, რათა გაადვილდეს სტატიების შესახებ ყველა ინფორმაციის ერთ ადგილას შეგროვება. სანამ ანალიზს დავიწყებთ, მოდით შევხედოთ როგორ არის აღწერილი სტატია Nettuts+ ვებსაიტზე.



...

სათაური

...

აღწერა



ეს არის საიტის პოსტის ძირითადი ფორმატი, მათ შორის კომენტარების წყარო კოდზე. რატომ არის კომენტარები მნიშვნელოვანი? ისინი ითვლის პარსერს, როგორც კვანძებს.

ნაბიჯი 4. დაიწყეთ პარსირების ფუნქცია getArticles($page) (
გლობალური $სტატიები;
$html = new simple_html_dom();
$html->load_file($page);
// ... Უფრო...
}

ჩვენ ვიწყებთ გლობალური მასივის გამოცხადებით, შექმნით ახალი ობიექტი simple_html_dom, და შემდეგ ჩატვირთეთ გვერდი ანალიზისთვის. ამ ფუნქციას გამოიძახებენ რეკურსიულად, ამიტომ მის პარამეტრად ვაყენებთ გვერდის URL-ს.

ნაბიჯი 5. იპოვნეთ საჭირო ინფორმაცია

1. $items = $html->find("div");
2. foreach ($items როგორც $post) (
3. # დაიმახსოვრე კომენტარების დათვლა კვანძებად
4. $articles = მასივი($post->children(3)->გარე ტექსტი,
5. $post->children(6)->first_child()->გარე ტექსტი);
6. }

ეს არის ფუნქციის არსი getArticles. უფრო დეტალურად უნდა შევისწავლოთ, რომ გავიგოთ რა ხდება.

ხაზი 1: შექმენით ელემენტების მასივი - ტეგი დივგადახედვის კლასთან ერთად. ჩვენ ახლა გვაქვს შენახული სტატიების კოლექცია $ ელემენტი.

ხაზი 4: $პოსტიახლა ეხება წინასწარი გადახედვის კლასის ერთ ნაწილს. თუ გადავხედავთ ორიგინალურ HTML-ს, დავინახავთ, რომ მესამე შთამომავალი ელემენტი არის ტეგი H1, რომელიც შეიცავს სტატიის სათაურს. ვიღებთ და ვითვისებთ $ სტატიები.

გახსოვდეთ, რომ დაიწყეთ 0-დან და გაითვალისწინეთ კოდის კომენტარები სწორი კვანძის ინდექსის განსაზღვრისას.

ხაზი 5: მეექვსე შვილი $პოსტი- ეს . ჩვენ გვჭირდება მისგან აღწერილობის ტექსტი, ამიტომ ვიყენებთ გარე ტექსტი- აბზაცის ტეგი ჩართული იქნება აღწერილობაში. სტატიების მასივში ერთი ჩანაწერი ასე გამოიყურება:

$articles = „სტატიის სათაური“;
$articles = "ეს არის ჩემი სტატიის აღწერა"

ნაბიჯი 6, გვერდებთან მუშაობა

პირველი ნაბიჯი არის იმის განსაზღვრა, თუ როგორ უნდა იპოვოთ შემდეგი გვერდი. Nettuts+-ის საიტზე ძალიან ადვილია გვერდის ნომრის გამოცნობა URL-დან, მაგრამ ჩვენ უნდა მივიღოთ ბმული ანალიზის დროს.

თუ დააკვირდებით HTML-ს, ნახავთ შემდეგს:

»

ეს არის ბმული შემდეგი გვერდისკენ და ჩვენ ადვილად ვიპოვით მას კლასების მიხედვით. nextpostslink’. ახლა ამ ინფორმაციის გამოყენება შესაძლებელია.

If($next = $html->find("a", 0)) (
$URL = $next->href;
$html->clear();
unset($html);
getArticles ($URL);
}

პირველ სტრიქონში ვამოწმებთ, არის თუ არა კლასის მითითების პოვნა nextpostslink. გაითვალისწინეთ ფუნქციაში მეორე პარამეტრის გამოყენება პოვნა (). ამ გზით ჩვენ მივუთითებთ, რომ გვინდა მივიღოთ პირველი ელემენტი (ინდექსი 0) დაბრუნებულ კოლექციაში. $ შემდეგიშეიცავს ერთ ელემენტს და არა კოლექციას.

შემდეგ ჩვენ ვანიჭებთ HREF ბმულს $URL ცვლადს. ეს მნიშვნელოვანია, რადგან შემდეგ ჩვენ ვშლით HTML ობიექტს. მეხსიერების გაჟონვის თავიდან ასაცილებლად php5, მიმდინარე ობიექტი simple_html_domუნდა გაიწმინდოს და გაუქმდეს სხვა ობიექტის შექმნამდე. თუ ეს არ გაკეთებულა, მაშინ ყველა ხელმისაწვდომი მეხსიერება შეიძლება მოხმარდეს.

საბოლოოდ, ჩვენ ვუწოდებთ getArticles ფუნქციას URL-ით შემდეგი გვერდი. რეკურსია იშლება, როცა გასარჩევი გვერდები აღარ რჩება.

ნაბიჯი 7. გამოიტანეთ შედეგები

პირველი, ჩვენ ვაპირებთ რამდენიმე ძირითადი სტილის დაყენებას. ყველაფერი სრულიად თვითნებურია - შეგიძლიათ დააინსტალიროთ ის, რაც მოგწონთ.

#მთავარი (
ზღვარი: 80 პიქსელი ავტო;
სიგანე: 500px;
}
h1 (
შრიფტი: თამამი 40px/38px helvetica, verdana, sans-serif;
ზღვარი: 0;
}
სთ 1 ა (
ფერი:#600;
ტექსტი-დეკორაცია:არცერთი;
}
p(
ფონი: #ECECEC;
შრიფტი:10px/14px verdana, sans-serif;
ზღვარი:8px 0 15px;
საზღვარი: 1px #CCC მყარი;
padding: 15px;
}
.პუნქტი(
padding: 10px;
}

შემდეგ ჩვენ ვწერთ პატარა PHP ფუნქციას გვერდზე ადრე შენახული ინფორმაციის საჩვენებლად.


საბოლოო შედეგი ერთია HTML გვერდიყველა სტატიის სიით Nettuts+ გვერდებიდან, დაწყებული პირველ ზარში მითითებული სტატიით getArticles ().

ნაბიჯი 8. დასკვნა

თუ დაიწყებთ გვერდების დიდი რაოდენობის (ვთქვათ, მთელი საიტის) სკრაპს, მაშინ ამას შეიძლება დიდი დრო დასჭირდეს. ისეთ საიტზე, როგორიცაა Nettuts+, რომელსაც აქვს 86-ზე მეტი გვერდი, ანალიზის პროცესს შეიძლება წუთზე მეტი დასჭირდეს.

ეს გაკვეთილი გაგაცნობთ HTML პარსინგის თემას. არსებობს სხვა DOM მანიპულირების ტექნიკა, რომელიც საშუალებას გაძლევთ იმუშაოთ xpath სელექტორთან ელემენტების მოსაძებნად. ამ სახელმძღვანელოში აღწერილი ბიბლიოთეკა მარტივი გამოსაყენებელია და შესანიშნავია სწრაფი დაწყება. დაიმახსოვრეთ, რომ მოითხოვეთ ნებართვა საიტის გახეხვამდე.

რექტორთან ახლოს 2013 წლის 20 ოქტომბერი 17:33 PHP პარსერი მარტივია
  • PHP
  • პროგრამირება

ვებმასტერები ხშირად აწყდებიან ამ პრობლემას, როდესაც მათ სჭირდებათ გარკვეული ინფორმაციის ამოღება საიტიდან და სხვაზე გადატანა. შეგიძლიათ ჯერ შეინახოთ ინფორმაცია შუალედურ მედიაში და შემდეგ ჩატვირთოთ სხვაგან, მაგრამ ეს მიდგომა ყოველთვის არ არის მოსახერხებელი. ზოგიერთ შემთხვევაში, ბევრად უფრო სწრაფია PHP-ის მხარდაჭერილი პარსერის ატვირთვა და მისი დისტანციურად გაშვება, რათა ის ავტომატურად აანალიზებს ინფორმაციას და იტვირთება რესურსების მონაცემთა ბაზაში.
მათ შორის უკვე მზა გადაწყვეტილებებიარის ისეთი პოპულარული, როგორიცაა Content Downloader და ZennoPoster, ისინი, რა თქმა უნდა, ძალიან მოსახერხებელი და გასაგებია ყველასთვის, თუნდაც მათთვის, ვინც არ იცნობს პროგრამირებას, მაგრამ მათ აქვთ გარკვეული უარყოფითი მხარეები. მაგალითად, ისინი გადახდილია და არ აქვთ საკმარისი მოქნილობა, რომელიც შეიძლება იყოს ინექცია ჩვეულებრივ PHP სკრიპტში. უფრო მეტიც, მათი გამოყენებით რთული პარსერის შემუშავება არანაირად არ ჩამოუვარდება PHP-ში ანალოგის დაწერას.
ასევე არსებობს ისეთი უფასო რამ, როგორიცაა iMacros - სკრიპტირების ენა, რომელსაც შეუძლია მომხმარებლის ქმედებების ემულაცია ბრაუზერში, მაგრამ ეს მიდგომა ასევე ყველგან არ მუშაობს საუკეთესოდ.

ბევრი ფიქრობს, რომ პროგრამირება და მით უმეტეს პარსერების წერა ძალიან რთული ამოცანაა. სინამდვილეში, php არის ერთ-ერთი ყველაზე მარტივი ენები, რომლის საკმარის დონეზე შესწავლა შესაძლებელია რამდენიმე კვირაში ან თვეში.
პარსერებიც ადვილად იწერება, რის გამოც დამწყები პროგრამისტები წერენ მათ ენის დასაუფლებლად.
პირველი, რაც გონზე მოდის, ვინც გადაწყვეტს ასეთი სკრიპტის დაწერას, არის ის, რომ მას სჭირდება სტრიქონებთან მუშაობის ფუნქციები (strpos, substr და მსგავსი) ან რეგულარული გამონათქვამები. ეს აბსოლუტურად მართალია, მაგრამ არის ერთი გაფრთხილება. თუ დაგჭირდებათ ბევრი პარსერის დაწერა, მოგიწევთ საკუთარი ბიბლიოთეკის შექმნა ისე, რომ ერთი და იგივე კონსტრუქციები ასჯერ არ გადაწეროთ, მაგრამ ამას ტონა დრო დასჭირდება და იმის გათვალისწინებით, რომ მსგავსი ბიბლიოთეკები უკვე არსებობს, ასეთი სავარჯიშო სრულიად უაზრო აღმოჩნდება.
დამწყებთათვის იდეალური ვარიანტი იქნება PHP Simple HTML DOM Parser ბიბლიოთეკის შესწავლა. როგორც სახელიდან მიხვდებით, მისი სწავლა ძალიან მარტივია. მოდით შევხედოთ ძირითად კოდს:

$html = file_get_html ("http://www.yandex.ru");
$a_links = $html->find("a");

პირველი ხაზი ქმნის გვერდის ობიექტს, რომლის წყაროც არის ამ შემთხვევაშიარის Yandex და წერს $html ცვლადზე, რომელსაც აქვს რამდენიმე ფუნქცია, მაგალითად find. Find - ეძებს ელემენტს გარკვეული პარამეტრით, მაგალითად find ('a') - დააბრუნებს გვერდზე ყველა ბმულის მასივს. Find('#myid') - დააბრუნებს ელემენტების მასივს, რომლის id უდრის "myid".
პირველი ხელმისაწვდომი ბმულის href პარამეტრზე წვდომა ასეა:

ექო $a_links[ 0 ]->href;

დამატებითი დეტალები შეგიძლიათ იხილოთ საიტზე:
simplehtmldom.sourceforge.net

ბიბლიოთეკა, როგორც ზემოთ აღვნიშნეთ, ძალიან მარტივია და საუკეთესოდ შეეფერება ახალბედა პროგრამისტს, გარდა ამისა, ის მუშაობს საკმაოდ სწრაფად და არ არის ძალიან მოთხოვნადი სერვერის რესურსებზე.
ამ ბიბლიოთეკას აქვს ერთი ნაკლი - ყველა გვერდი არ არის მისთვის შესაფერისი. თუ ელემენტი არ არის ნაჩვენები, მაგრამ თქვენ ზუსტად იცით, რომ ის იქ არის, უმჯობესია გამოიყენოთ DOM (დოკუმენტის ობიექტის მოდელი) ბიბლიოთეკა. ყველაფერში კარგია, გარდა განვითარების სისწრაფისა და სიცხადისა.

$doc = new DOMDocument();
$doc->loadHTML($data);
$searchNodes = $doc->getElementsByTagName("a");
echo $searchNodes[ 0 ]->getAttribute("href");

ეს სკრიპტი ჯერ ქმნის DOM ტიპის ობიექტს და $data ცვლადი უნდა შეიცავდეს გვერდის კოდს. შემდეგ პოულობს ყველა ტეგს (ბმულს) $doc->getElementsByTagName ზარის გამოყენებით, შემდეგ წერს მათ $searchNodes მასივში. გვერდზე პირველი ბმულის href პარამეტრზე წვდომა შესაძლებელია $searchNodes[ 0 ]->getAttribute("href") გამოძახებით.
შედეგად, სკრიპტი უფრო რთული აღმოჩნდება და მისი დაწერა არც ისე მოსახერხებელია, მაგრამ ზოგჯერ ამ კონკრეტული ბიბლიოთეკის გამოყენება გიწევთ.

ტეგები: php, პარსერი, პროგრამირება

ნელ-ნელა ვსწავლობ PHP-ის შესაძლებლობებს პარსერების შესაქმნელად. მე უკვე დავწერე როგორ გავაანალიზო. ახლა მე გეტყვით html ანალიზების ერთ-ერთ მეთოდზე (სხვათა შორის, ის ასევე შესაფერისია xml-ისთვის). ვიმეორებ, რომ მე არ ვარ php გურუ, ამიტომ ძალიან მადლობელი ვიქნები, თუ დატოვებთ თქვენს კომენტარებს წამოჭრილ თემაზე.

ჩვენი და ინგლისურენოვანი ფორუმების ნახვის შემდეგ მივხვდი, რომ კამათი იმის შესახებ, ჯობია თუ არა html-ის გაანალიზება რეგულარული გამონათქვამებით თუ PHP DOM-ის შესაძლებლობების გამოყენება ამ მიზნებისთვის, არის ჰოლივარი. მე თვითონ მივედი დასკვნამდე, რომ ყველაფერი დამოკიდებულია მონაცემთა სტრუქტურის სირთულეზე. ყოველივე ამის შემდეგ, თუ სტრუქტურა საკმაოდ რთულია, მაშინ რეგულარული გამონათქვამების გამოყენებით თქვენ უნდა გააანალიზოთ რამდენიმე ეტაპად: ჯერ შეარჩიეთ დიდი ნაწილი, შემდეგ დაყავით ის უფრო პატარაებად და ა.შ. შედეგად, თუ მონაცემები რთულია (ან არსებობს ბევრია), მაშინ ანალიზის პროცესი შეიძლება მნიშვნელოვნად გაგრძელდეს. რესურსის ინტენსივობა ამ შემთხვევაში მაინც იქნება დამოკიდებული, რა თქმა უნდა რეგულარული გამონათქვამები. თუ ".*" ბევრია regexps-ში (ისინი ყველაზე რესურსზე ინტენსიურია, რადგან ისინი "ვარცხნიან" წყარომაქსიმალური სიხარბით), მაშინ შესამჩნევი იქნება შენელება.

და სწორედ ამ შემთხვევაში გამოდგება PHP DOM. ეს მოსახერხებელი ინსტრუმენტი XML-ის და HTML-ის გარჩევისთვის. ზოგიერთი ფიქრობს, რომ ზოგადად შეუძლებელია HTML-ის გაანალიზება regexps-ის გამოყენებით და ისინი სასტიკად იცავენ PHP DOM-ს.

თავის მხრივ, მე გავეცანი ამ გაფართოებას მარტივი სკრიპტის დაწერით. რასაც მე აქ წარმოგიდგენთ, რათა ნათლად ვაჩვენო, რამდენად მარტივი და მარტივია ეს ყველაფერი. მაგალითი აანალიზებს html-ს ამ ბლოგის საიტის რუქის ნაწილთან. იგი ენიჭება ცვლადს უშუალოდ კოდის შიგნით. „საბრძოლო“ პირობებში, საწყისი მონაცემები უნდა იქნას მიღებული, მაგალითად, file_get_contents().




თუ შეამჩნევთ შეცდომას, აირჩიეთ ტექსტის ნაწილი და დააჭირეთ Ctrl+Enter
გააზიარე:
NexxDigital - კომპიუტერები და ოპერაციული სისტემები