Solker
23.01.2010, 02:56
Понадобилась база английских имен и фамилий. Поискал в интернете, не нашел. Набрел на сайт с более-менее приличной базой, http://www.familytree.ru/.
Заодно решил освоить curl, т.к. руки раньше не доходили.
Написал простенький парсер вменяемых (без всяких там апострофов и прочей ерести) английских имен и фамилий с сайта http://www.familytree.ru/.
<?php
set_time_limit(0);
parse('dbfamily.php','family.txt');
parse('dbname.php','name.txt');
function parse($file_parse,$file_save)
{
$start = 1;
$reg = '#<a href='.str_replace('.','\.',$file_parse).'\?pos=[0-9]+>([A-z]+)</a>#';
while(true)
{
$url = 'http://www.familytree.ru/ru/dbf/'.$file_parse;
$post = 'kpgdn=+%3E+&ipos='.$start;
$start += 201;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($cookie) curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all($reg,$res_curl,$matches);
if(empty($matches[0])) break;
else
{
foreach($matches[1] as $val) $final[] = $val;
}
if(preg_match('/^Set-Cookie: (.*)/m', $res_curl, $source_cookie))
$cookie = trim($source_cookie[1]);
}
$final_write = implode(chr(10),$final);
file_put_contents($file_save,$final_write);
}
?>
На выходе имеем примерно 7к имен и 30к фамилий.
Забрать то, что имеем, можно по ссылке:
http://solker.spb.ru/family.zip
Для русских имен и фамилий я парсил сайт http://www.vse-familii.com/ и http://www.vse-imena.com/ соответственно.
<?php
set_time_limit(0);
// Name
$url = 'http://www.vse-imena.com/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#imena-g[0-9]+\.html#',$res_curl,$female_pages);
preg_match_all('#imena-m[0-9]+\.html#',$res_curl,$male_pages);
$pre_all_pages = array_merge($female_pages[0],$male_pages[0]);
$all_pages = $pre_all_pages;
foreach($pre_all_pages as $page)
{
$url = 'http://www.vse-imena.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
$page = str_replace('.html','',$page);
preg_match_all('#'.$page.'-[0-9]+\.html#i',$res_curl,$temp_pages);
foreach($temp_pages[0] as $tmp)
if($tmp) $all_pages[] = $tmp;
}
foreach($all_pages as $page)
{
$url = 'http://www.vse-imena.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#(<TD width=30% valign=top>|<br>)(.+?)(<br>|<\/td>)#i',$res_curl,$matches);
foreach($matches[0] as $source_name)
{
$name = strip_tags($source_name);
if(!$name or $name == 'Заказать вытяжка кухня') continue;
if(strpos($name,' '))
{
$temp = explode(' ',$name);
$name = $temp[0];
}
if(strpos($name,'.')) continue;
if(strlen($name) < 3) continue;
if(ord(substr($name,0,1)) < 192 or ord(substr($name,0,1)) > 223) continue;
$names[] = $name;
}
}
sort($names);
$final_write = implode(chr(10),$names);
file_put_contents('name_rus.txt',$final_write);
// Family
$url = 'http://www.vse-familii.com/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#familii-[0-9]+\.html#',$res_curl,$pre_all_pages);
$pre_all_pages = $pre_all_pages[0];
$all_pages = $pre_all_pages;
foreach($pre_all_pages as $page)
{
$url = 'http://www.vse-familii.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
$page = str_replace('.html','',$page);
preg_match_all('#'.$page.'-[0-9]+\.html#i',$res_curl,$temp_pages);
foreach($temp_pages[0] as $tmp)
if($tmp) $all_pages[] = $tmp;
}
foreach($all_pages as $page)
{
$url = 'http://www.vse-familii.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#(<TD width=30% valign=top>|<br>)(.+?)(<br>|<\/td>)#i',$res_curl,$matches);
foreach($matches[0] as $source_name)
{
$name = strip_tags($source_name);
if(!$name or $name == 'Заказать вытяжка кухня') continue;
if(strpos($name,' '))
{
$temp = explode(' ',$name);
$name = $temp[0];
}
if(strpos($name,'.')) continue;
if(strlen($name) < 3) continue;
if(ord(substr($name,0,1)) < 192 or ord(substr($name,0,1)) > 223) continue;
$family[] = $name;
}
}
sort($family);
$final_write = implode(chr(10),$family);
file_put_contents('family_rus.txt',$final_write);
?>
На выходе получил 17к фамилий и 14к имен.
Забрать можно по ссылке:
http://solker.spb.ru/family_rus.zip
Заодно решил освоить curl, т.к. руки раньше не доходили.
Написал простенький парсер вменяемых (без всяких там апострофов и прочей ерести) английских имен и фамилий с сайта http://www.familytree.ru/.
<?php
set_time_limit(0);
parse('dbfamily.php','family.txt');
parse('dbname.php','name.txt');
function parse($file_parse,$file_save)
{
$start = 1;
$reg = '#<a href='.str_replace('.','\.',$file_parse).'\?pos=[0-9]+>([A-z]+)</a>#';
while(true)
{
$url = 'http://www.familytree.ru/ru/dbf/'.$file_parse;
$post = 'kpgdn=+%3E+&ipos='.$start;
$start += 201;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($cookie) curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all($reg,$res_curl,$matches);
if(empty($matches[0])) break;
else
{
foreach($matches[1] as $val) $final[] = $val;
}
if(preg_match('/^Set-Cookie: (.*)/m', $res_curl, $source_cookie))
$cookie = trim($source_cookie[1]);
}
$final_write = implode(chr(10),$final);
file_put_contents($file_save,$final_write);
}
?>
На выходе имеем примерно 7к имен и 30к фамилий.
Забрать то, что имеем, можно по ссылке:
http://solker.spb.ru/family.zip
Для русских имен и фамилий я парсил сайт http://www.vse-familii.com/ и http://www.vse-imena.com/ соответственно.
<?php
set_time_limit(0);
// Name
$url = 'http://www.vse-imena.com/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#imena-g[0-9]+\.html#',$res_curl,$female_pages);
preg_match_all('#imena-m[0-9]+\.html#',$res_curl,$male_pages);
$pre_all_pages = array_merge($female_pages[0],$male_pages[0]);
$all_pages = $pre_all_pages;
foreach($pre_all_pages as $page)
{
$url = 'http://www.vse-imena.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
$page = str_replace('.html','',$page);
preg_match_all('#'.$page.'-[0-9]+\.html#i',$res_curl,$temp_pages);
foreach($temp_pages[0] as $tmp)
if($tmp) $all_pages[] = $tmp;
}
foreach($all_pages as $page)
{
$url = 'http://www.vse-imena.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#(<TD width=30% valign=top>|<br>)(.+?)(<br>|<\/td>)#i',$res_curl,$matches);
foreach($matches[0] as $source_name)
{
$name = strip_tags($source_name);
if(!$name or $name == 'Заказать вытяжка кухня') continue;
if(strpos($name,' '))
{
$temp = explode(' ',$name);
$name = $temp[0];
}
if(strpos($name,'.')) continue;
if(strlen($name) < 3) continue;
if(ord(substr($name,0,1)) < 192 or ord(substr($name,0,1)) > 223) continue;
$names[] = $name;
}
}
sort($names);
$final_write = implode(chr(10),$names);
file_put_contents('name_rus.txt',$final_write);
// Family
$url = 'http://www.vse-familii.com/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#familii-[0-9]+\.html#',$res_curl,$pre_all_pages);
$pre_all_pages = $pre_all_pages[0];
$all_pages = $pre_all_pages;
foreach($pre_all_pages as $page)
{
$url = 'http://www.vse-familii.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
$page = str_replace('.html','',$page);
preg_match_all('#'.$page.'-[0-9]+\.html#i',$res_curl,$temp_pages);
foreach($temp_pages[0] as $tmp)
if($tmp) $all_pages[] = $tmp;
}
foreach($all_pages as $page)
{
$url = 'http://www.vse-familii.com/'.$page;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);
preg_match_all('#(<TD width=30% valign=top>|<br>)(.+?)(<br>|<\/td>)#i',$res_curl,$matches);
foreach($matches[0] as $source_name)
{
$name = strip_tags($source_name);
if(!$name or $name == 'Заказать вытяжка кухня') continue;
if(strpos($name,' '))
{
$temp = explode(' ',$name);
$name = $temp[0];
}
if(strpos($name,'.')) continue;
if(strlen($name) < 3) continue;
if(ord(substr($name,0,1)) < 192 or ord(substr($name,0,1)) > 223) continue;
$family[] = $name;
}
}
sort($family);
$final_write = implode(chr(10),$family);
file_put_contents('family_rus.txt',$final_write);
?>
На выходе получил 17к фамилий и 14к имен.
Забрать можно по ссылке:
http://solker.spb.ru/family_rus.zip