Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Извличане на хиперлинкове от уеб страница чрез PHP
  1. Web scraping
  2. Завършеният код
     
Автор  plamenSm (08.03.2008 19:00)  съобщение до автора
Погледнат  3360 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (4)  абонирай се за PHP
    Страница 1 / 2

 



"Web scraping" (някъде се среща и термина "harvesting").
В този урок ще научите как да направите PHP скрипт, който извлича линккове от уеб страница.

Какво ще научите:

1. Как да използвате cURL за да извлечете съдържанитето на уеб страница (URL).
2. Използване на PHP DOM (Document-Object-Model) функциите за разбор на HTML документа и изличане на хиперлинковете.
3. Използването на XPath за извличане на линкове от определени места в страниците.
4. Записване на събраната информация в MySQL база данни.
5. Обобщаване на събраната информация.
6. За какво и как да използвате тази информация.
7. Законно ли е използването на тази технология.

Какво е небодимо преди да започнем

  • Основни познания за PHP и MySQL
  • Web-сървър, поддържащ PHP 5.0
  • Инсталирани cURL разширения на сървъра.
  • MySQL, ако желаете съхраняване на събраните данни


Извличане съдържанието на страница

cURL е един от най-добрите начини да направим заявка към HTTP стъвър. Този механизъм имитира заявка от браузър по различни начини. Ето и примерен код:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$html = curl_exec($ch);
if (!$html) {
   
echo "<br />cURL error number:" . curl_errno($ch);
   
echo "<br />cURL error:" . curl_error($ch);
   
exit;
}
?>


Ако заявката се обработи коректно, в променливата $html ще имаме съдържанието на страницата ($target_url). Ако не, ще получим съобщение за грешка.

CODE
1
2
3
<?php
curl_setopt($ch, CURLOPT_URL,$target_url);
?>

Тази линия определя адреса, към коойто ще бъде отправяна заявката. Например, ако желаете да извлечете съдържанието на страница, променливата $target_url би трябвало да има стойност във вида: $target_url = „http://www.merchantos.com/makebeta/”.

За сега ще оставим другите опции, Но особено внимание изсисква параметърът „CURLOPT_USERAGENT” – вижте по-долу.

Забележка: Задайте user agent. Това е важно!

Много уеб страници не биха ви върнали коректен резултат, ако не сте подали user agent.

Какво е "user agent" – Просто казано, браузъра, който ползвате. Това е стринг, записан във всяка една заявка към WEB –сървърите. Но освен посещения от браузъри, страниците се посещават и от автоматизирани програми – spiders. Сървърите реагират различно на различните клиенти. Някои сървъри връщатат различен резултат в зависимост от клиента. Може да експериментирате. Следващия пример имитира посещение от Google:

CODE
1
2
3
4
<?php
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
?>

Може да намерите списък на user agents на http://www.user-agents.org/index.shtml

Общо взето има два вида user agents. Автоматичните търсачки и реалните посещения с браузър.Ето примери на двата вида user agents:


Автоматични:


Потребителски – браузър:

  • Firefox (WindowsXP) - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
  • IE 7 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
  • IE 6 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
  • Safari - Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Safari/3.0.2
  • Opera - Opera/9.00 (Windows NT 5.1; U; en)

Как да използваме нататък функциите на PHP за работа с получения документ

PHP предлага мощни средсва за работа с обектно-структурирани докоменти, като XML и HTML (http://bg.php.net/dom). За краткост по-надолу ще ги наричаме DOM (Document Object Model) функции.

И така, вече имаме HTML документ в променливата $html. Това обаче е стринг, който трябва да превърнем в обектна структура в паметта.
Лесно е:

CODE
1
2
3
4
<?php
$dom = new DOMDocument();
@
$dom->loadHTML($html);
?>

Сега вече имаме обектно структурирани данни. Обектът $dom от клас DOMDocument ни дава възможност за обектно ориентиран достъп до тези данни.

Забележка: Има много несдандратно кодирани сртаници. Понякога HTML парсера дава предупреждения или грешки. Поставянето на ‘@’ в началото на завката в loadHTML() в много случаи премахва проблема.

Използването на XPath е лесен начин за извличане на хиперлинковете от HTML документ

XPath ви дава възможност да извлечете възлите (или в случая – HTML тагове) от документа. Вижте как може да извлечете линковете в несортиран списък само с еднин от методите. Всичко, което трябва да направите е да напишете заявка от вида “/html/body//ul//li//a” и да я подадете на XPath->evaluate(). Тук няма да разглеждаме подробно всички начини на използване на класа XPath. Примери може да намерите на XPath Examples. Целта ни тук е да покажем начина на извличане на хиперлинкове от HTML документ. Ето фрагмент от код с който може да се извлекат линковете от страница:

CODE
1
2
3
4
<?php
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
?>

Сега да запишем резултата

Първо прябва да направим цикъл, в който да извлечем хиперлинковете от доккумента и да ги запишем в таблица от база данни. Да започнем с цикъла:

CODE
1
2
3
4
5
6
7
8
<?php
for ($i = 0; $i < $hrefs->length; $i++)
{
  
$href = $hrefs->item($i);
  
$url = $href->getAttribute('href');
  
storeLink($url,$target_url);
}
?>

$hrefs е обект от клас DOMNodeList, а item() е метод, който връща определен DOM възел според подадения индекс.Индекса може да бъде между нула и $hrefs->length.

Вече имаме цикъл, който извлича линковете във вид на DOM обект. Нас ни интересуват самите хиперлинкове.

CODE
1
2
3
<?php
$url = $href->getAttribute('href');
?>

DOMNodes наследява метода getAttribute() от класа DOMElement.

getAttribute() връща стойнотта на зададения атрибут. В нашия случай, това е „href” на елементите <а ...> в документа.

Вече сме готови да запишем резултата. Естествено ни е необходима таблица в базата данни:


CODE
1
2
3
4
5
CREATE TABLE `links` (
`url` TEXT NOT NULL ,
`gathered_from` TEXT NOT NULL ,
`time_stamp` TIMESTAMP NOT NULL
);


Сега да напишем и storeLink(), която ще записва в базата данни извлечените линкове (подразбира се, че сте на ясно със свързвавето с база данни чрез PHP):

CODE
1
2
3
4
5
6
7
<?php
function storeLink($url,$gathered_from)
{
 
$query = "INSERT INTO links (url, gathered_from) VALUES ('$url', '$gathered_from')";
 
mysql_query($query) or die('Error, insert query failed');
}
?>



  Следваща страница >> 


Ключови думи: PHP уеб страница cURL извличане на хиперлинкове


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

С правилният reg exp ;)
preg_match_al("/^[a-z0-9]...../" ....);
Има достатъчно примери из интернет и документацията на РНР.

  PureEvil на 21.03.2008 10:10

а как се извличат е меил адреси ?

  a1b2 на 19.03.2008 14:22

Да се представяш за бот, който не си би ти довело само главоболия. Повечето хора следят какво става със сайтовете им, а ти няма как да кажеш че си бота, защото нямаш IP-тата на Google ;).
Ползването на @ е тотално тотално непрепоръчително! Защо просто не ползваш error_reporting() ?!?
Може да си фен на DOM, но в случая един preg_match_all просто ще се справи по бързо с намирането на нужните резултати.

storeLink() също не е достатъчно оптимална. Примерно синтаксисът: INSERT INTO ... VALUES (1, 2), (2, 1), (3, 44) е по-удачен.

Ако не е нужно да се симулира потребител(било то някоя търсачка или потребител), file_get_contents() ще сработи по бързо от cURL метода.

@iwanov просто една маска и preg_match_all достъчно просто и бързо решение ;).

  PureEvil на 09.03.2008 16:21

Урока е супер. Искам само да попитам да речем че искам да извлека и да запиша линкове който завършват само на .gif примерно (демек линковете към снимки) ?

Поздрави

  iwanov на 08.03.2008 22:58

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008