<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог Ромки &#187; парсер</title>
	<atom:link href="http://romka.name/tags/parser/feed" rel="self" type="application/rss+xml" />
	<link>http://romka.name</link>
	<description></description>
	<lastBuildDate>Sat, 20 Nov 2010 15:47:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Парсер своими руками. Теория</title>
		<link>http://romka.name/2009/12/parser-svoimi-rukami-teoriya.html</link>
		<comments>http://romka.name/2009/12/parser-svoimi-rukami-teoriya.html#comments</comments>
		<pubDate>Fri, 25 Dec 2009 12:18:08 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Программируем]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[парсер]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://romka.name/?p=54</guid>
		<description><![CDATA[
			
				
			
		
      Собственно, что такое парсер? Это скрипт/программа/куча текста, которая запрашивает страницу на другом сайте и берёт с него то, что нужно вебмастеру.
      Я ничего не читал по написанию парсеров и грабберов, додумался до этого способа сам, так что не критикуйте, если есть более лёгкий способ.
      Принцип моего способа довольно прост.
      Сначала получаем контент с нужного [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fparser-svoimi-rukami-teoriya.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fparser-svoimi-rukami-teoriya.html&amp;source=romkaby&amp;style=normal&amp;service=is.gd&amp;hashtags=php,%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80,%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" height="61" width="50" /><br />
			</a>
		</div>
<p style="text-align: justify;"><img class="alignleft size-full wp-image-58" title="Парсер своими руками. Теория" src="http://romka.name/wp-content/uploads/2009/12/2_Парсер-своими-руками.-Теория.jpg" alt="" width="280" height="150" />      Собственно, что такое парсер? Это скрипт/программа/куча текста, которая запрашивает страницу на другом сайте и берёт с него то, что нужно вебмастеру.</p>
<p style="text-align: justify;">      Я ничего не читал по написанию парсеров и грабберов, додумался до этого способа сам, так что не критикуйте, если есть более лёгкий способ.<span id="more-54"></span><br />
      Принцип моего способа довольно прост.</p>
<p style="text-align: justify;">      Сначала получаем контент с нужного урл. Для этого я использую функцию:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'урл'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Результат её выполнения - полный код необходимой страницы. Дальше - собственно и идёт мой принцип, а заключается он в том, что весь текст данной страницы помещается в php код и сразу коментируется. Поэтому, проанализировав выдачу кода, берём комбинации самого первого и самого последнего символов/тэгов (чаще всего это тэги html) и заменяем их на "начало php кода и начало коментрования" в начале и на "конец коментирования и конец php кода" в конце. Заменяется всё через такую функцию:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Что заменить'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'На что заменить'</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Пример кода для парсера:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;html&gt;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'php '</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/*'</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;/html&gt;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' */ ?'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&gt;;'</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      $выход - выходящий код, первый параметр - что заменять, второй - на что заменять, третий ($вход) - входящий код<br />
      Обязательно надо разбить строку "<?php" и "?>" на несколько частей, так как интерпретатор может подумать, что это тэги, а не строки.<br />
      Так как в качестве коментирования мы использую "/* */", то сначала уберём все знаки "*". Для этого используем код:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'любой_символ'</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Итак, сейчас у нас есть полный код страницы, представленный как один большой комментарий в php коде. Дальше, если нам надо выделить какие-то строки разного строения, например все параметры товара в интернет-магазине, то анализируем код и пытаемся найти что-то, что их отличает друг от друга, причём отличия должны быть найдены как в начале каждого параметра товара, так и в конце. И при помощи замены необходимые части, которые нам нужны для вывода, должны быть присвоены каким-либо переменным. Например, если код будет таким:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;p&gt;&lt;b&gt;Название:&lt;/b&gt; Название_товара&lt;br /&gt;
&lt;b&gt;Размер:&lt;/b&gt; Размер_товара&lt;br /&gt;
&lt;b&gt;Вес:&lt;/b&gt; Вес_товара&lt;/p&gt;</pre></td></tr></table></div>

<p>      После всех замен должно получиться что-то подобное на такое:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>p<span style="color: #339933;">&gt;</span> <span style="color: #339933;">*/</span> <span style="color: #000088;">$name</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'Название_товара'</span><span style="color: #339933;">;</span> <span style="color: #000088;">$razmer</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'Размер_товара'</span><span style="color: #339933;">;</span> <span style="color: #000088;">$ves</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'Вес_товара'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/*</span></pre></td></tr></table></div>

<p>      Тут их отличает текст, который стоит до необходимого нам текста. Убираем переносы строк при помощи:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span>$вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>       Получим:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;p&gt;&lt;b&gt;Название:&lt;/b&gt; Название_товара&lt;br /&gt;&lt;b&gt;Размер:&lt;/b&gt; Размер_товара&lt;br /&gt;&lt;b&gt; Вес:&lt;/b&gt;Вес_товара&lt;/p&gt;</pre></td></tr></table></div>

<p>      Можно ещё пробелы убрать:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Ну и остаётся заменить "&lt;b&gt;Название:&lt;/b&gt;" на "*/ $name='", "&lt;br /&gt;&lt;b&gt;Размер:&lt;/b&gt;" на "'; $razmer='" и т.д. Делается это кодом:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">$выход <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;b&gt;Название:&lt;/b&gt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;*/ $&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;name='&quot;</span><span style="color: #339933;">,</span> $вход<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      И так далее, замечу, что надо разделять на части переменные, которые должны получиться в коде.<br />
Дальше мы записываем изменённый код страницы в файл с расширение .php и просто подгружаем его в скрипт. В результате по переменным, которым мы присвоили наши характеристики ($name, $razmer и $ves) будет доступно их значения.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$f</span><span style="color: #339933;">=</span><span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;file.php&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #339933;">,</span>$переменная_с_кодом<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Первая строчка открывает файл для записи. Вторая - записывает в файл наш изменённый код страницы. Третья - закрывает файл. И, наконец, четвёртая подгружает данный файл уже как php файл в наш скрипт. Дальше уже делаем с ними что угодно, например, выведем их на экран:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$name</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; - &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$razmer</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; - &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$ves</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      На экране будет</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">Название_товара - Размер_товара - Вес_товара</pre></td></tr></table></div>

<p>     Кто не совсем понял, что произошло, ещё раз чисто текстом. Сначала получаем код необходимой страницы, далее представляем его как php код, коментируем все строки. Потом по частям находим нужные нам куски кода и раскоментируем одновременно присваивая к каким-либо переменным, записываем наш php код в файл и сразу загружаем в скрипт в результате чего все переменные, которым мы присваивали нужные куски кода страницы, доступны из скрипта.<br />
      Вот и всё, с теорией покончено, а попрактикуемся в следующей статье. Будем писать реальный парсер (:</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fparser-svoimi-rukami-teoriya.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fparser-svoimi-rukami-teoriya.html&amp;source=romkaby&amp;style=normal&amp;service=is.gd&amp;hashtags=php,%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80,%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://romka.name/2009/12/parser-svoimi-rukami-teoriya.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

