Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   База имен и фамилий (https://forum.antichat.xyz/showthread.php?t=172887)

Solker 23.01.2010 02:56

База имен и фамилий
 
Понадобилась база английских имен и фамилий. Поискал в интернете, не нашел. Набрел на сайт с более-менее приличной базой, http://www.familytree.ru/.
Заодно решил освоить curl, т.к. руки раньше не доходили.

Написал простенький парсер вменяемых (без всяких там апострофов и прочей ерести) английских имен и фамилий с сайта http://www.familytree.ru/.

PHP код:

<?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($chCURLOPT_URL$url); 
            
curl_setopt($chCURLOPT_HEADER1);
            
curl_setopt($chCURLOPT_RETURNTRANSFER1);
            if(
$cookiecurl_setopt($chCURLOPT_COOKIE$cookie);
            
curl_setopt($chCURLOPT_POST1);
            
curl_setopt($chCURLOPT_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 код:

<?php

set_time_limit
(0);

// Name

$url 'http://www.vse-imena.com/';
$ch curl_init();  
    
curl_setopt($chCURLOPT_URL$url); 
    
curl_setopt($chCURLOPT_HEADER0);
    
curl_setopt($chCURLOPT_RETURNTRANSFER1);
    
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
    
curl_setopt($chCURLOPT_HEADER0);
    
curl_setopt($chCURLOPT_RETURNTRANSFER1);
    
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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

Цитата:

Сообщение от GlooK
Думаю посту место в 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 код:

<?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($chCURLOPT_URL$url); 
            
curl_setopt($chCURLOPT_HEADER1);
            
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
            
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
            
curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
$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($chCURLOPT_URL$url); 
                
curl_setopt($chCURLOPT_HEADER1);
                
curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
                
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
                
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
                
curl_setopt($chCURLOPT_COOKIE$cookie);
                
curl_setopt($chCURLOPT_POST1);
                
curl_setopt($chCURLOPT_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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER1);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER1);
        
curl_setopt($chCURLOPT_COOKIE$cookie);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER1);
        
curl_setopt($chCURLOPT_COOKIE$cookie);
        
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER1);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
        
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
        
curl_setopt($chCURLOPT_COOKIESESSION1);
        
curl_setopt($chCURLOPT_FOLLOWLOCATION0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER1);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
        
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
        
curl_setopt($chCURLOPT_COOKIE$cookie);
        
curl_setopt($chCURLOPT_FOLLOWLOCATION0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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($chCURLOPT_URL$url); 
        
curl_setopt($chCURLOPT_HEADER0);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
        
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
        
curl_setopt($chCURLOPT_COOKIE$cookie);
        
curl_setopt($chCURLOPT_FOLLOWLOCATION0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$res_curl curl_exec($ch);
        
curl_close($ch);
        
    return 
$res_curl;
}
?>

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

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


Время: 12:56