Как я могу Программно выполнить поиск, не используя API?

Не очень имеет значение. Независимо от того, что делает, Вы счастливый будете работать. Нет большого количества глупых правил, потому что проекты Python могут быть простыми.

  • /scripts или /bin для такого материала интерфейса командной строки
  • /tests для Ваших тестов
  • /lib для Ваших библиотек языка C
  • /doc для большей части документации
  • /apidoc для Epydoc-сгенерированных документов API.

И каталог верхнего уровня может содержать README's, Конфигурацию и этажерка.

трудный выбор состоит в том, использовать ли /src дерево. Python не имеет различия между /src, /lib, и /bin как Java, или C имеет.

, Так как высокоуровневый /src каталог рассматривается некоторыми как бессмысленный, Ваш каталог верхнего уровня может быть архитектурой верхнего уровня Вашего приложения.

  • /foo
  • /bar
  • /baz

я рекомендую подвергнуть все это "name-of-my-product" каталогу. Так, если Вы пишете приложение, названное quux, каталог, который содержит весь этот материал, называют /quux.

Другой проект PYTHONPATH, тогда, может включать /path/to/quux/foo для многократного использования QUUX.foo модуль.

В моем случае, так как я использую Редактирование Комодо, мой IDE cuft является единственным.KPF файлом. Я на самом деле поместил это в высокоуровневый /quux каталог и опускаю добавлять его к SVN.

7
задан Helen 29 August 2009 в 10:26
поделиться

5 ответов

Теория

Я бы создал небольшая программа, которая может автоматически отправлять любые данные формы в любое место и возвращать результаты. Это легко сделать на Java с помощью HTTPUnit . Задача выглядит следующим образом:

  • Подключиться к веб-серверу.
  • Разобрать страницу.
  • Получить первую форму на странице.
  • Заполнить данные формы.
  • Отправить форму.
  • Прочтите (и проанализируйте) результаты.

Решение, которое вы выберете, будет зависеть от множества факторов, включая:

  • Нужно ли вам эмулировать JavaScript
  • Что вам нужно делать с данными после этого
  • ] На каких языках вы владеете
  • Скорость приложения (это для одного запроса или 100 000?)
  • Как скоро приложение должно работать
  • Это разовое, или его нужно будет поддерживать?

Например, вы можете попробовать следующие приложения для отправки данных за вас:

Затем grep (awk или sed) результирующие веб-страницы.

Еще одна уловка при парсинге экрана - загрузить образец HTML-файла и проанализировать его вручную в vi (или VIM). Сохраните нажатия клавиш в файл, а затем всякий раз, когда вы запускаете запрос, применяйте эти нажатия клавиш к полученным веб-страницам, чтобы извлечь данные. Это решение не обслуживается и не надежно на 100% (но очистка экрана с веб-сайта случается редко). Это работает и быстро.

Пример

Ниже приведен полуобыкновенный Java-класс для отправки форм веб-сайта (в частности, для входа на веб-сайт) в надежде, что он может быть полезен. Не используйте его во зло.

import java.io.FileInputStream;

import java.util.Enumeration;
import java.util.Hashtable;  
import java.util.Properties; 

import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.SubmitButton;       
import com.meterware.httpunit.WebClient;          
import com.meterware.httpunit.WebConversation;    
import com.meterware.httpunit.WebForm;            
import com.meterware.httpunit.WebLink;            
import com.meterware.httpunit.WebRequest;         
import com.meterware.httpunit.WebResponse;        

public class FormElements extends Properties
{                                           
  private static final String FORM_URL = "form.url";
  private static final String FORM_ACTION = "form.action";

  /** These are properly provided property parameters. */
  private static final String FORM_PARAM = "form.param.";

  /** These are property parameters that are required; must have values. */
  private static final String FORM_REQUIRED = "form.required.";            

  private Hashtable fields = new Hashtable( 10 );

  private WebConversation webConversation;

  public FormElements()
  {                    
  }                    

  /**
   * Retrieves the HTML page, populates the form data, then sends the
   * information to the server.                                      
   */                                                                
  public void run()                                                  
    throws Exception                                                 
  {                                                                  
    WebResponse response = receive();                                
    WebForm form = getWebForm( response );                           

    populate( form );

    form.submit();
  }               

  protected WebResponse receive()
    throws Exception             
  {                              
    WebConversation webConversation = getWebConversation();
    GetMethodWebRequest request = getGetMethodWebRequest();

    // Fake the User-Agent so the site thinks that encryption is supported.
    //                                                                     
    request.setHeaderField( "User-Agent",                                  
      "Mozilla/5.0 (X11; U; Linux i686; en-US; rv\\:1.7.3) Gecko/20040913" );

    return webConversation.getResponse( request );
  }                                               

  protected void populate( WebForm form )
    throws Exception                     
  {                                      
    // First set all the .param variables.
    //                                    
    setParamVariables( form );            

    // Next, set the required variables.
    //                                  
    setRequiredVariables( form );       
  }                                     

  protected void setParamVariables( WebForm form )
    throws Exception                              
  {                                               
    for( Enumeration e = propertyNames(); e.hasMoreElements(); )
    {                                                           
      String property = (String)(e.nextElement());              

      if( property.startsWith( FORM_PARAM ) )
      {                                      
        String fieldName = getProperty( property );
        String propertyName = property.substring( FORM_PARAM.length() );
        String fieldValue = getField( propertyName );                   

        // Skip blank fields (most likely, this is a blank last name, which
        // means the form wants a full name).                              
        //                                                                 
        if( "".equals( fieldName ) )                                       
          continue;                                                        

        // If this is the first name, and the last name parameter is blank,
        // then append the last name field to the first name field.        
        //                                                                 
        if( "first_name".equals( propertyName ) &&                         
            "".equals( getProperty( FORM_PARAM + "last_name" ) ) )         
          fieldValue += " " + getField( "last_name" );                     

        showSet( fieldName, fieldValue );
        form.setParameter( fieldName, fieldValue );
      }                                            
    }                                              
  }                                                

  protected void setRequiredVariables( WebForm form )
    throws Exception                                 
  {                                                  
    for( Enumeration e = propertyNames(); e.hasMoreElements(); )
    {                                                           
      String property = (String)(e.nextElement());              

      if( property.startsWith( FORM_REQUIRED ) )
      {                                         
        String fieldValue = getProperty( property );
        String fieldName = property.substring( FORM_REQUIRED.length() );

        // If the field starts with a ~, then copy the field.
        //                                                   
        if( fieldValue.startsWith( "~" ) )                   
        {                                                    
          String copyProp = fieldValue.substring( 1, fieldValue.length() );
          copyProp = getProperty( copyProp );                              

          // Since the parameters have been copied into the form, we can   
          // eke out the duplicate values.                                 
          //                                                               
          fieldValue = form.getParameterValue( copyProp );                 
        }                                                                  

        showSet( fieldName, fieldValue );
        form.setParameter( fieldName, fieldValue );
      }                                            
    }                                              
  }                                                

  private void showSet( String fieldName, String fieldValue )
  {                                                          
    System.out.print( "<p class='setting'>" );               
    System.out.print( fieldName );                           
    System.out.print( " = " );                               
    System.out.print( fieldValue );                          
    System.out.println( "</p>" );                            
  }                                                          

  private WebForm getWebForm( WebResponse response )
    throws Exception                                
  {                                                 
    WebForm[] forms = response.getForms();          
    String action = getProperty( FORM_ACTION );     

    // Not supposed to break out of a for-loop, but it makes the code easy ...
    //                                                                        
    for( int i = forms.length - 1; i >= 0; i-- )                              
      if( forms[ i ].getAction().equalsIgnoreCase( action ) )                 
        return forms[ i ];                                                    

    // Sadly, no form was found.
    //                          
    throw new Exception();      
  }                             

  private GetMethodWebRequest getGetMethodWebRequest()
  {
    return new GetMethodWebRequest( getProperty( FORM_URL ) );
  }

  private WebConversation getWebConversation()
  {
    if( this.webConversation == null )
      this.webConversation = new WebConversation();

    return this.webConversation;
  }

  public void setField( String field, String value )
  {
    Hashtable fields = getFields();
    fields.put( field, value );
  }

  private String getField( String field )
  {
    Hashtable<String, String> fields = getFields();
    String result = fields.get( field );

    return result == null ? "" : result;
  }

  private Hashtable getFields()
  {
    return this.fields;
  }

  public static void main( String args[] )
    throws Exception
  {
    FormElements formElements = new FormElements();

    formElements.setField( "first_name", args[1] );
    formElements.setField( "last_name", args[2] );
    formElements.setField( "email", args[3] );
    formElements.setField( "comments",  args[4] );

    FileInputStream fis = new FileInputStream( args[0] );
    formElements.load( fis );
    fis.close();

    formElements.run();
  }
}

Пример файлов свойств может выглядеть так:

$ cat com.mellon.properties

form.url=https://www.mellon.com/contact/index.cfm
form.action=index.cfm
form.param.first_name=name
form.param.last_name=
form.param.email=emailhome
form.param.comments=comments

# Submit Button
#form.submit=submit

# Required Fields
#
form.required.to=zzwebmaster
form.required.phone=555-555-1212
form.required.besttime=5 to 7pm

Запустите его аналогично следующему (замените путь к HTTPUnit и класс FormElements на $ CLASSPATH):

java -cp $CLASSPATH FormElements com.mellon.properties "John" "Doe" "John.Doe@gmail.com" "To whom it may concern  ..."

Законность

В другом ответе упоминалось, что это может нарушать условия использования. Сначала проверьте это, прежде чем тратить время на поиск технического решения. Чрезвычайно хороший совет.

4
ответ дан 7 December 2019 в 01:25
поделиться

Вот html со страницы Google:

<form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top>
<td width=25%>&nbsp;</td><td align=center nowrap>
<input name=hl type=hidden value=en>
<input type=hidden name=ie value="ISO-8859-1">
<input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value="">
<br>
<input name=btnG type=submit value="Google Search">
<input name=btnI type=submit value="I'm Feeling Lucky">
</td><td nowrap width=25% align=left>
<font size=-2>&nbsp;&nbsp;<a href=/advanced_search?hl=en>
Advanced Search</a><br>&nbsp;&nbsp;
<a href=/preferences?hl=en>Preferences</a><br>&nbsp;&nbsp;
<a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table>
</form>

Если вы знаете, как сделать HTTP-запрос с вашего любимого языка программирования, просто попробуйте и посмотрите, что вы получите в ответ. Попробуйте, например, следующее:

http://www.google.com/search?hl=en&q=Stack+Overflow
1
ответ дан 7 December 2019 в 01:25
поделиться

Если вы загрузите Cygwin и добавите Cygwin \ bin к своему пути, вы можете использовать curl для получения страницы и grep / sed / something для анализа результатов. Зачем заполнять форму, если в Google вы все равно можете использовать параметры строки запроса? С помощью curl вы также можете публиковать информацию, устанавливать информацию заголовка и т.д. Я использую его для вызова веб-служб из командной строки.

0
ответ дан 7 December 2019 в 01:25
поделиться

Most of the time, you can just send a simple HTTP POST request.

I'd suggest you try playing around with Fiddler to understand how the web works.

Nearly all the programming languages and frameworks out there have methods for sending raw requests.

And you can always program against the Internet Explorer ActiveX control. I believe it many programming languages supports it.

3
ответ дан 7 December 2019 в 01:25
поделиться

Я считаю, что это будет означать нарушение условий использования (проконсультируйтесь с юристом по этому поводу: программисты не умеют давать юридические консультации!), Но технически вы можете искать foobar, просто зайдя по URL http://www.google.com/search?q=foobar и, как вы говорите, соскабливая полученный HTML. Вероятно, вам также потребуется подделать HTTP-заголовок User-Agent и, возможно, некоторые другие.

Возможно, существуют поисковые системы, условия использования которых не запрещают этого; вам и вашему адвокату можно посоветовать осмотреться, чтобы убедиться, так ли это на самом деле.

2
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: