Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

16.03.2009, 12:56
|
|
Постоянный
Регистрация: 26.03.2008
Сообщений: 311
Провел на форуме: 3799424
Репутация:
479
|
|
[Q]Парсинг большой бд
Что имеем:
1) большую бд (порядка) 300 метров
2) 63к записей.
Значит в каждой записи имеется несколько ссылок
Текст текст текст текст текст
<a href="http://rapidshare.com/download.rar.html" target="_blank">Cкачать </a>
текст текст текст текст текст
<a href="http://rapidshare.com/download2.rar.html" target="_blank">Cкачать </a>
В целях сео оптимизации хотелось бы превратить кликабельные ссылки в простой текст
<a href="http://rapidshare.com/download.rar.html" target="_blank">Cкачать </a>
-->
http://rapidshare.com/download.rar.html
как бы с небольшими юд это будет достаточно просто сделать, но .... это не мой случай.
Хотел бы выслушать ваши предложения
|
|
|

16.03.2009, 13:16
|
|
Постоянный
Регистрация: 11.03.2008
Сообщений: 347
Провел на форуме: 2075230
Репутация:
462
|
|
можно и так:
Код:
#!usr/bin/perl
open(DB, "base.txt");
@db = <DB>;
close(DB);
open(PARSED, ">>parsed.txt");
foreach $db (@db)
{
($a, $url, $b) = split("\"",$db);
chomp($url);
print PARSED "$url\n";
tr/a-zA-Z//cd
}
close(PARSED);
и больше размеры парсил
Последний раз редактировалось ph1l1ster; 16.03.2009 в 13:30..
|
|
|

16.03.2009, 13:17
|
|
Постоянный
Регистрация: 07.03.2009
Сообщений: 357
Провел на форуме: 1284900
Репутация:
399
|
|
1) большую бд (порядка) 300 метров
2) 63к записей.
Парсили 2 милиона записей и всё в порядке
Способ 1:
Слить базу на локальный комп и там распарсить.
Способ 2:
Если локальный комп слабый, то слить базу и распарсить через C++.
Способ 3:
Распарсить удалённо используя C++.
|
|
|

16.03.2009, 13:48
|
|
Участник форума
Регистрация: 03.07.2008
Сообщений: 177
Провел на форуме: 644324
Репутация:
11
|
|
Вполне можно и на php с использованием sleep(1)
|
|
|

16.03.2009, 13:52
|
|
Участник форума
Регистрация: 12.11.2006
Сообщений: 213
Провел на форуме: 347573
Репутация:
185
|
|
set_time_limit(0)
SET TRANSATION
и поехал че хочешь с ней ковырять...заливай на удаленную машину, запускай и иди курить, придешь - соптимизируется... У нас на работе для 2-3кк записей на ночь оставляли
|
|
|

16.03.2009, 14:04
|
|
Постоянный
Регистрация: 26.03.2008
Сообщений: 311
Провел на форуме: 3799424
Репутация:
479
|
|
ах да..кто не понял база - мускул
UPD// набросать кто может на php?
Последний раз редактировалось #Wolf#; 16.03.2009 в 16:14..
|
|
|

17.03.2009, 07:28
|
|
Постоянный
Регистрация: 26.03.2008
Сообщений: 311
Провел на форуме: 3799424
Репутация:
479
|
|
PHP код:
$result = mysql_query("SELECT * FROM posts LIMIT 10")or die("бля: " . mysql_error());
while ($row=mysql_fetch_array($result))
{
echo "$row[full_news]";
}
preg_match_all('#href=(?:([\"\'])([^\"\'>]\S*?)\1[^>]*|([^>\"\']+))>(.*?)</a>#is ', $str, $matches);
foreach($matches[2] as $key)
{
echo $key; echo '<br>';
}
что то не получается связать это вместе..
|
|
|

17.03.2009, 09:22
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
#Wolf# По-хорошему, лучше сделать полный дамп базы и обработать, иначе будет слишком много запросов к БД.
PHP код:
<?
set_time_limit(0);
$begin=0; // С какой позиции начинать
$count=10; // Сколько строк БД обрабатывать за раз
for($i=$begin;;$i+=$count)
{
$result=mysql_query("SELECT * FROM posts LIMIT $i,$count");
if (!mysql_num_rows($result)) break;
while ($row=mysql_fetch_array($result))
{
$tmp=preg_replace('~<a.*href="([^"]+)".*>.*</a>~Usi','$1',$row['full_news']);
// В запросе на обновление не уверен насчет экранирования кавычек
if ($tmp!=$row['full_news']) $update=mysql_query("UPDATE posts SET full_news='$tmp' WHERE full_news='".$row[full_news]."'");
}
@file_put_contents('cur_pos.txt',$i); // Пишем в файл текущую позицию, на всякий случай
}
Но повторюсь - лучше обрабатывать построчно дамп. Так можно будет проконтролировать, что все обработано правильно и не угробить случайно БД
Последний раз редактировалось Gifts; 18.03.2009 в 00:25..
|
|
|

17.03.2009, 14:02
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
for($i=$begin;;$i+=$count) - ошибко, или я чтото не понимаю оО
|
|
|

17.03.2009, 14:09
|
|
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме: 385811
Репутация:
12
|
|
Gifts, можете пример привести, с дампом как в php?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|