Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > написание программы для поиска инфы


Автор: Berliner 17.11.2005, 10:09
Здраствуйте надо написать программу для поиска инфы в инете. Программа дролжна делать следующее
1. юзер ввдодит в окно программы текст например Audi100 программа должна найти в google инфу по Audi 100 после єтого вывести в текстовый файл такие поля.

Ссылку Заголовок Описание сайта
www.audi.de Audi WV Nur Wir........

Меня попросили сделать такую вещь. Сразу оговорюсь для меня это не коммерческое предложение. Мат выгоды с этого не имею

Подскажите с чего начать и какие классы использовать. Java только начал учить. Думаю сделать это апплетом.

Автор: KostenkoSergey 17.11.2005, 11:19
я диплом такой писал smile))) тока у меня не в гугле искал, а веб в базу индексировал smile))
ну а твоя задача на самом деле сводится к следующему :
1. формируешь запрос - шлёшь на гугл используя, что то типа :
Код

      String data = "";
      data += "param="           + URLEncoder.encode("AUDI"   , "UTF-8");
      URL url = new URL("http://google.com");
      HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
      urlConnect.setDoOutput(true);
      urlConnect.setDoInput(true);
      OutputStreamWriter wr = new OutputStreamWriter(urlConnect.getOutputStream());
      wr.write(data);
      wr.flush();

тока посмотришь какие там параметры надо передать в поисковик.
А потом получаешь ответ
Код

      // --- get the response
      BufferedReader is = new BufferedReader(new InputStreamReader(urlConnect.getInputStream()));
      String line;
      StringBuffer sb = new StringBuffer();
      while((line = is.readLine()) !=null){
          System.out.println(line);
          sb.append(line);
        }

я для простоты примера всё в строку записал, а ты разпарсишь
его (ответ) как тебе удобно ....
а ваще я встречал
подобные апплетики ....

Автор: Berliner 17.11.2005, 13:04
Спасибо! буду пытаться.

Автор: Stampede 17.11.2005, 15:51
Цитата(Berliner @ 17.11.2005, 10:09)
программа должна найти в google инфу по Audi 100 после єтого вывести в текстовый файл такие поля


Для этого идеально подойдет http://www.google.com/apis/. Это фактически веб-сервисный клиент к их машине поиска. По описанию выглядит очень просто. Единственно, по условию лицензии там есть ограничение: максимум 1000 запросов в сутки. Если тебя это устроит - то полный вперед smile

Автор: Berliner 17.11.2005, 16:42
А как в первом варианте писалось не пойдет?

Автор: Stampede 17.11.2005, 18:53
Цитата(Berliner @ 17.11.2005, 16:42)
А как в первом варианте писалось не пойдет?


Да оно, может, и пойдет, но как ты собираешься парсить HTML? Вот смотри, как выглядит отдельная позиция в выдаче гугля:

Код

<p class=g><!--m--><a href="http://www.amazon.com/gp/browse.html?node=3435361&">Amazon.com Help</a>
<br><font size=-1>Amazon Mechanical Turk does this, providing a <b>web</b> services <b>API</b> for computers to
<br>integrate Artificial Artificial Intelligence directly into their processing. <b>...</b>
<br><font color=#008000><span dir=ltr>www.amazon.com/gp/browse.html?node=3435361&amp;</span> - 32k - </font>
<nobr>  <a class=fl href="http://64.233.167.104/search?q=cache:6WPQsJfIGoIJ:www.amazon.com/gp/browse.html%3Fnode%3D3435361%26+web+api&hl=en&client=firefox-a">Cached</a> - 
<a class=fl href="/search?hl=en&hs=Tv5&lr=&client=firefox-a&rls=org.mozilla:en-US:official&q=related:www.amazon.com/gp/browse.html%3Fnode%3D3435361%26">Similar&nbsp;pages</a></nobr></font><!--n--> 


Ты, конечно, можешь типа искать элемент <p> с классом "g", выдирать оттуда линк, потом в качестве описания брать все от конца линка до "<br><font color=#008000>", ну и так далее.

Но я бы после такого навсегда потерял сон, потому что измени гугловцы формат выдачи - и фсе, программа просто перестанет работать.

Так штаааа...

Автор: Berliner 18.11.2005, 14:08
Ошибку выдает я думаю что неправильно исключения обработал. Код ошибки сейчас не могу дать комп в другой комнате, а там интернета нет. Подскажите пожалуста что не правильно?
Код

package u;

/**
 *
 * @author Administrator
 */
import java.lang.*;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
       
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     try{
    URL address = new URL("http://java.sun.com/index.html");
     }
     catch (MalformedURLException e1){
         System.out.println("Не могу подключится !");
     }
        // TODO code application logic here
        
    }
    
}


Автор: batigoal 18.11.2005, 14:23
У меня прошло без ошибок.

Автор: Berliner 18.11.2005, 16:22
упс ....сейчас код ошибки кину(все на дискетке принесу ошибку)

Автор: Berliner 18.11.2005, 16:36
сразу вместе код и ошибка! почему NEtBeans ругается?

Код

init:
deps-jar:
Compiling 1 source file to C:\Documents and Settings\Administrator\? Ў®зЁ© бв®«\ji\build\classes
C:\Documents and Settings\Administrator\? Ў®зЁ© бв®«\ji\src\ji\Main.java:23: cannot find symbol
symbol  : class URL
location: class ji.Main
    URL address = new URL("http://java.sun.com/index.html");
C:\Documents and Settings\Administrator\? Ў®зЁ© бв®«\ji\src\ji\Main.java:23: cannot find symbol
symbol  : class URL
location: class ji.Main
    URL address = new URL("http://java.sun.com/index.html");
C:\Documents and Settings\Administrator\? Ў®зЁ© бв®«\ji\src\ji\Main.java:25: cannot find symbol
symbol  : class MalformedURLException
location: class ji.Main
     catch (MalformedURLException e1){
3 errors
‘?Ћ?ЉЂ ‡Ђ‚…??…?Ђ ?…“„Ђ—?Ћ (®ЎйҐҐ ўаҐ¬п: 0 бҐЄг­¤)



package ji;

import java.lang.*;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
       
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     try{
    URL address = new URL("http://java.sun.com/index.html");
     }
     catch (MalformedURLException e1){
         System.out.println("Rabotaet!");
     }
         
        
    }
    
}





Автор: bars_uz 18.11.2005, 17:41
Bratan poprobue:

Код

package ji;

import java.net.URL;
import java.net.MalformedURLException;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
       
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     try{
    URL address = new URL("http://java.sun.com/index.html");
     }
     catch (MalformedURLException e1){
         System.out.println("Rabotaet!");
     }
         
        
    }
    
}

Автор: KostenkoSergey 18.11.2005, 18:37
наверное ты через проксю какую то ходишь... да ?

Добавлено @ 18:45
Цитата(Stampede @ 17.11.2005, 18:53)
Да оно, может, и пойдет, но как ты собираешься парсить HTML?


дык это разве проблема ?
Код

package kostenko.diplom.spider;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;
/**
 * HTML parsing proceeds by calling a callback for
 * each and every piece of the HTML document.  This
 * simple callback class simply prints an indented
 * structural listing of the HTML data.
 */
class HTMLParseLister extends HTMLEditorKit.ParserCallback {
....

а ваще ж и любым саксом можно ?
тем паче универсальность ему никчему - ответ всегда в одинаковом виде будет....


Автор: Guest 21.11.2005, 13:49
вот что уже написал, вроде компилиться без ошибок. написал : вводим адрес гугла , и подключаемся А дальше? натолкните на мысль какие классы использовать и логику подскажите плиз. Сори я только учусь

Код

package ji;

import java.net.*;
import java.lang.*;
import java.io.*;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
       
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     try{
    URL address = new URL("http://google.com");
    try{
    address.openConnection();
    }
    catch (IOException e2){ 
    System.out.println("You don't have connection");
    }
       }
    
     catch (MalformedURLException e1){
         System.out.println("Have a look at address ");
     }
      
     
     } 
      
    
    }
    



Автор: KostenkoSergey 22.11.2005, 09:57
Цитата(Guest @ 21.11.2005, 13:49)
какие классы использовать и логику подскажите плиз

уже ж тебе ответили и примеры дали, или я вопрос не вразумел?
smile

Автор: Berliner 22.11.2005, 10:33
ок вроде подконектился к гугглу а как запрос сформировать и отослать?

Код

String data = "";   //а что тут?
      data += "param="           + URLEncoder.encode("AUDI"   , "UTF-8");//Вот тут запрос формируется?
      URL url = new URL("http://google.com");
      HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();//установливаем коннект?
      urlConnect.setDoOutput(true);//а что тут делаем?
      urlConnect.setDoInput(true);//и тут?
      OutputStreamWriter wr = new OutputStreamWriter(urlConnect.getOutputStream());
      wr.write(data);
      wr.flush();




я в твоем примере не все понял. просто знаний не хватает. в коментах я написал где не понял ,не мог бы ты мне пояснить подробнее,пожалуста?(там где я написал в коментариях). ну очень хочется научится java . Я и сам пытаюсь.

Автор: KostenkoSergey 22.11.2005, 11:48
smile
Для поиска Тебе надо обратиться по такому урлу :
http://www.google.com.ua/search?q=audi
Для этого :
Код

String data = "q=" + URLEncoder.encode("AUDI" , "UTF-8");//Вот тут формируем параметр запроса
      URL url = new URL("http://google.com/search"); // url
    /**
     * Returns a <code>URLConnection</code> object that represents a
     * connection to the remote object referred to by the <code>URL</code>.
     *
     * <p>A new connection is opened every time by calling the
     * <code>openConnection</code> method of the protocol handler for
     * this URL.
     *
     * <p>If for the URL's protocol (such as HTTP or JAR), there
     * exists a public, specialized URLConnection subclass belonging
     * to one of the following packages or one of their subpackages:
     * java.lang, java.io, java.util, java.net, the connection
     * returned will be of that subclass. For example, for HTTP an
     * HttpURLConnection will be returned, and for JAR a
     * JarURLConnection will be returned.
     *
     * @return     a <code>URLConnection</code> to the URL.
     * @exception  IOException  if an I/O exception occurs.
     * @see        java.net.URL#URL(java.lang.String, java.lang.String,
     *             int, java.lang.String)
     * @see        java.net.URLConnection
     * @see java.net.URLStreamHandler#openConnection(java.net.URL)
     */
      HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();//установливаем коннект!
    /**
     * Sets the value of the <code>doOutput</code> field for this 
     * <code>URLConnection</code> to the specified value. 
     * <p>
     * A URL connection can be used for input and/or output.  Set the DoOutput
     * flag to true if you intend to use the URL connection for output,
     * false if not.  The default is false.
     *
     * @param   dooutput   the new value.
     * @throws IllegalStateException if already connected
     * @see #getDoOutput()
     */
      urlConnect.setDoOutput(true);//а что тут делаем?
    /**
     * Sets the value of the <code>doInput</code> field for this 
     * <code>URLConnection</code> to the specified value. 
     * <p>
     * A URL connection can be used for input and/or output.  Set the DoInput
     * flag to true if you intend to use the URL connection for input,
     * false if not.  The default is true.
     *
     * @param   doinput   the new value.
     * @throws IllegalStateException if already connected
     * @see     java.net.URLConnection#doInput
     * @see #getDoInput()
     */
      urlConnect.setDoInput(true);//и тут?
      OutputStreamWriter wr = new OutputStreamWriter(urlConnect.getOutputStream());
      wr.write(data);
      wr.flush();



Автор: Berliner 25.11.2005, 15:47
Спасиб-вроде разбираюсь. А можно плиз очень подробно пояснить две строки, а именно ,я например понял : 1- форма запрос а 2-устанавливаем коннект. но в 1 строке я вообще не понял зачем там data = "q=" smile
Код

String data = "q=" + URLEncoder.encode("AUDI" , "UTF-8");
HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection;


"разжуте" пожалуста.

Автор: chief39 29.11.2005, 10:58
Цитата(Berliner @ 25.11.2005, 15:47)
Спасиб-вроде разбираюсь. А можно плиз очень подробно пояснить две строки, а именно ,я например понял : 1- форма запрос а 2-устанавливаем коннект. но в 1 строке я вообще не понял зачем там data = "q="

Насколько я понял вышеприведеный код:
Мы создаём URL, который, к примеру указывает на какой-то ресурс(например сервлет, или что у них там, на гугле). Но сам по себе запрос ничерта не значит без параметров. Это как будто нажать кнопку submit при пустой форме(вернее при отсутствии полей на форме вообще).
А вот в DATA формируем строку запроса, которая в обычных http запросах идёт после "?". Т.е. передаём вроде как данные из формы(параметр=значение).
Поскольку искать твоя система будет не только ауди, то data будет содержать то что ты ищешь. Тысызыть, динамическая часть запроса.
Итого твой клиент будет посылать то же что послала бы форма с инпут-полем "q" в которое ты ввёл "audi". Ну а encode - специально написанная фишка для твоего случая, ибо самотужки перекодировать строку в гекса-представление замахаешься(ты ведь видел что если в поисковике вводишь русские символы - они отображаются как %45%4A%32 и т.д.)
Поэтому в своём клиенте, в поле на какой-нить формочке вводишь то, что ищешь, и запихиваешь в первый параметр "encode" (вместо "ауди").
И будет тебе счастье smile

Автор: gEndelf 29.11.2005, 11:21
А по поводу парсинга HTML - я где на просторах Internet встречал набор классов для парсинга и удобной обработки.
только адрес не припомню ...

Автор: Berliner 29.11.2005, 13:13
Спасибо большое за пояснения- буду разбираться

Автор: Berliner 2.12.2005, 14:43
Код

 HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();


подскажите а как еще можно прописать строку коннекта только так?
пітался сделать

HttpURLConnection urlConnect=new HttpURLConnection(єкземпляр класса Http адреса);

urlConnect.openConnection;

неработает как надо пояснитте пожалуста ,если можно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)