PDA

Просмотр полной версии : База имен и фамилий


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

GlooK
23.01.2010, 03:04
Думаю посту место в http://forum.antichat.ru/thread65761.html

Solker
23.01.2010, 03:05
Совсем позабыл про нее.

mr.The
23.01.2010, 03:06
Ты бы лучше базой поделился.

Solker
23.01.2010, 03:28
mr.The
Добавил в первое сообщение.

Solker
23.01.2010, 04:23
Нашел интересную ссылку, жалко поздно.
По ссылке добрый человек выложил базу на 9 мб.

http://www.seocoder.org/2008/10/01/baza-angloyazychnyx-imen-i-familij/

Solker
23.01.2010, 07:13
Добавил парсер русских имен и фамилий для сайтов
http://www.vse-familii.com/ и http://www.vse-imena.com/

b3
23.01.2010, 11:43
Думаю посту место в http://forum.antichat.ru/thread65761.html
Это раздел программирования, вы извратили понятие само слова "Программист", что тут может быть полезного для нормального кодера? Банальный парсинг странички с регуляркой. Пусть так и остается в отдельной теме, возможно кто-то с гугла прийдет, а засорять топики связанные с программированием не стоит.

astrologer
23.01.2010, 12:06
Вообще-то, это намного полезнее 90% того, что выложено в "Полезных скриптах". Что касается англоязычных имен/фамилий - то данные переписи США доступны официально с указанием частоты употребления.

http://www.census.gov/genealogy/names/names_files.html

Solker
23.01.2010, 15:48
Изначально, срочно нужен был антивирус, залез на torrents.ru и качнул Avira. Позже в поисках кряка в той же теме, узнал, что Avira раздает триальные ключи по 3 месяца на каждое мыло. Оттуда же узнал о забавном сервисе, которые генерирует мыло на 10 минут.

Краткая инструкция для получения ключа выглядела так:
1. Заходим на http://10minutemail.com/10MinuteMail/index.html и получаем временный почтовик.
2. Заходим на https://license.avira.com/en/promotion-hylm9fbv7chaxs8zbl83 , заполняем форму и вставляем мыло, после жмем кнопочку и в течении 2-3 мин на почтовике смотрим письмо, в котором находим ссылку на получение ключа.
3. Получаем удовольствие.

Тут естественно в голове всплыло, что бы генерировать эти ключи каждые день автоматически. И по необходимости просто заходить на страницу и брать ключ с максимальным временем использования. Собственно нужна была база фамилий и имен, что бы это выглядело более менее правдоподобно, хотя потом оказалось, в те поля хоть мыло можно вписывать. Для этого и накатал скрипт представленный в первой темы.

А вот собственно код сервиса, который я и хотел реализовать.

<?php

set_time_limit(0);

$names = file('name.txt');
$name = $names[rand(0,count($names))];

$familys = file('family.txt');
$family = $familys[rand(0,count($familys))];

list($mail,$cookie) = reg_new_mail();

if(submit_form_avira($name,$family,$mail))
{
for($i=0;$i<20;$i++)
{
if(check_mail($cookie))
{
echo 'Latter!'.chr(10);
$link = read_letter($cookie);
list($location,$cookie) = avira_login($link);
$file = get_avira_key($location,$cookie);
$file_name = 'Hbedv(Avira_Premium_Security_Suite_Valid_Until_'. date('d-m-Y',time()+60*60*24*90).').key';
file_put_contents('keys/'.$file_name,$file);

echo $file_name.' created!';
break;
}
else
{
echo 'Wait...'.chr(10);
sleep(10);
}
}
}

function submit_form_avira($name,$family,$mail)
{
$url = 'https://license.avira.com/en/promotion-hylm9fbv7chaxs8zbl83';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

preg_match_all('#action="(.+?)"#',$res_curl,$matches);
$action = $matches[1][1];

preg_match('/^Set-Cookie: (.*)/m', $res_curl, $source_cookie);
$cookie = trim($source_cookie[1]);

$post = "customerSalutationId=MIS&customerFirstname=$name&customerLastname=$family&customerEmail=$mail&customerCountryId=BI&buttonActivate=Request license now";
$url = 'https://license.avira.com/'.$action;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
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);

return $res_curl;
}

function reg_new_mail()
{
$url = 'http://10minutemail.com/10MinuteMail/index.html';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

preg_match('/^Set-Cookie: (.*)/m', $res_curl, $source_cookie);
$cookie = trim($source_cookie[1]);

preg_match('#<br \/>(.+) is your temporary e-mail address#i',$res_curl,$source_mail);
$mail = $source_mail[1];

return $array = array($mail,$cookie);
}

function check_mail($cookie)
{
$url = 'http://10minutemail.com/10MinuteMail/index.html';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

if(preg_match('#avpe@avira.com#',$res_curl,$match) )
return $res_curl;
else return false;
}

function read_letter($cookie)
{
$url = 'http://10minutemail.com/10MinuteMail/index.html?dataModelSelection=message%3Aemails%5B0 %5D&actionMethod=index.xhtml%3AmailQueue.select';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

preg_match('#^https:\/\/license\.avira\.com\/en\/hs-(.+)\.#m',$res_curl,$matches);
$link = 'https://license.avira.com/en/hs-'.$matches[1];
return $link;
}

function avira_login($link)
{
$url = $link;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

preg_match('/^Set-Cookie: (.*)/m', $res_curl, $source_cookie);
$cookie = trim($source_cookie[1]);

preg_match('/^Location: (.*)/m', $res_curl, $source_location);
$location = trim($source_location[1]);

return $array = array($location,$cookie);
}

function get_avira_key($location,$cookie)
{
$url = 'https://license.avira.com/en/'.$location;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

preg_match('#href="\/customer\/(.+?)"#',$res_curl,$matches);

$key_link = 'https://license.avira.com/customer/'.$matches[1];
$url = $key_link;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res_curl = curl_exec($ch);
curl_close($ch);

return $res_curl;
}
?>

Это дело кидается в крон и выполняется каждые сутки для генерации нового ключа.

И собственно готовый результат.
http://solker.spb.ru/avira/

olegator
23.01.2010, 15:57
Классно...ключ на 3 месяца!))))

Solker
23.01.2010, 16:01
Я занимаюсь аутсорсингом фирм, пришел, влепил ключ на 3 месяца.
Через 3 месяца пришел, обновил, денег получил.

GlooK
23.01.2010, 16:13
Маладца, теперь скрипт "Полезный" ;)

m0Hze
23.01.2010, 16:50
Все полезно,кроме курла налепленого в каждой строчке.Можно и сократить.