Анализ конкурентности. Нужны советы.

Тема в разделе "Как сделать...", создана пользователем Юрец, 29 июн 2009.

Статус темы:
Закрыта.
  1. Юрец

    Юрец

    Регистр.:
    20 авг 2006
    Сообщения:
    152
    Симпатии:
    21
    Ниже код скрипта.

    что делает:
    -Считывает построчно(предварительно залитый) файл keys.txt (список кивордов)

    -из каждой строки формирует запрос:
    google.com/search?q=KEYWORD&gl=us&hl=en

    -затем, из строки "Results 1 - 100 of about 16,000" парсит цифру 16,000
    и так, для каждого киворда.

    -сохраняет ризалт в файл keys-r.html
    template.html используется при этом как шаблон для вывода ризалтов парсинга.

    Таймаут прописывается руками внутри скрипта.
    Скрипт написан для использования на сервере с пхп4.
    За скрипт отдал 10 баксов.


    PHP:
    <?php
    define
    ("KEY_LIST_FILE""keys.txt");
    define("RESULT_FILE"substr(KEY_LIST_FILE,0,-4) . "-r.html");
    $data file_get_contents(KEY_LIST_FILE);
    $result = array();
    foreach (
    explode("\n"$data) as $KEY) {
        
    $KEY trim($KEY);
        
    $q "http://google.com/search?q=" urlencode($KEY) . "&gl=us&hl=en";
        
    $googleData file_get_contents($q);
        
    $regexp '#<p>&nbsp;Results <b>\d+</b> - <b>\d+</b> of about <b>(.+)</b>#Uis';
        
    $value = array();
        
    preg_match_all($regexp$googleData$value);
        if (!empty(
    $value[1][0]))
            
    $result[] = array($KEY$value[1][0]);
        
    sleep(5);
    }
    if (!
    function_exists('file_put_contents')) {
        
    define('FILE_APPEND'0);
        function 
    file_put_contents($n$d$flag false) {
            
    $mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' 'w';
            
    $f = @fopen($n$mode);
            if (
    $f === false) {
                return 
    0;
            } else {
                if (
    is_array($d)) $d implode($d);
                
    $bytes_written fwrite($f$d);
                
    fclose($f);
                return 
    $bytes_written;
            }
        }
    }
    function 
    generateHTMLFile($data = array()) {
        if (empty(
    $data) or !is_array($data))
            return 
    false;
        
    $htmlString '';
        foreach (
    $data as $val) {
            
    $htmlString .= "<tr id=\"result\"><td>{$val[0]}</td><td>{$val[1]}</td></tr>\n";
        }
        
    $result preg_replace('#<tr id="result"><td>.+</td><td>.+</td></tr>#Uis'$htmlStringfile_get_contents("template.htm"));
        
    file_put_contents(RESULT_FILE$result);
    }

    generateHTMLFile($result);
    ?>
    Вопросы кодерам:
    Вы считаете этот код грамотным?

    Нужно ли для такой задачи использовать прокси или хватит таймаута в 3-10 сек?

    Возможно ли сделать его быстрым?
    Просто иногда пачка кивордов по 2000 строк бывает...

    Может кто поможет довести до ума?
    Ну и выложим тут в паблик :az:

    Юзабилити, согласен = 0, но это мелочь, можно быстро поправить
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    не сказал бы, что код хреновый, но лично яб, некоторые моменты сделал по другому:

    PHP:
    $data file_get_contents(KEY_LIST_FILE); 
    foreach (
    explode("\n"$data) as $KEY) {
    я бы заменил на

    PHP:
    $data file(KEY_LIST_FILE);

    PHP:
    $googleData file_get_contents($q);
    заменил бы на сокеты(скорее всего на курл, мне он нравится больше, да и при личном тестинге он работал побыстрее чем sockopen)

    PHP:
     $regexp '#<p>&nbsp;Results <b>\d+</b> - <b>\d+</b> of about <b>(.+)</b>#Uis';
    preg_match_all($regexp$googleData$value);
    тяжелая многострочная регулярка..**х? да и зачем выдирать все совпадения? непонятно, я бы переделал эту часть кода

    хотя бы до такого(если что, можно подточить)

    PHP:
    preg_match('%</b> of about <b>(.*?)</b>%i'$googleData$value);

    ну вывод полностью какой-то тупой, какие-то прег-реплейсы, выдергивание, вызов функции file_put_contents(открытие файла, проверка, запись, закрытие) НА КАЖДОЙ ИТЕРАЦИИ!!!

    вот это реально нагружает,

    вначале скрипта делает fopen с проверкой

    а в цикле уже юзаем fwrite
     
  3. Юрец

    Юрец

    Регистр.:
    20 авг 2006
    Сообщения:
    152
    Симпатии:
    21
    Ловите.
    Посмотреть вложение bidcheck.zip
    Обратился к SolutionFix. За небольшую доплату человек дописал свою софтину bidcheck под мои нужды:

    PHP:
    -из каждой строки формирует запрос:
    google.com/search?q=KEYWORD&gl=us&hl=en

    -затемиз строки "Results 1 - 100 of about 16,000" парсит цифру 16,000
    и так
    для каждого киворда.
    Вобщем заходите в settings прописываете доп. параметры в УРЛ к гуглу и наслаждаетесь.
    Если нужно поменять параметры (hl ; gl ; etc.) то закрываете прогу, изменяете параметры и снова запускаете.

    *тему можно закрыть, в принципе
     
Статус темы:
Закрыта.