Neste artigo, David Bolton mostra como criar um Web simples robô que faz buscas múltiplas paralelas sobre um motor de pesquisa e visitas cada Web site nos resultados e ativos nessa página.
Neste artigo, David Bolton mostra como criar um Web simples robô que realiza múltiplas buscas paralelas sobre um mecanismo de busca, em seguida, visita cada Web site nos resultados e ativos nessa página. Ele usa o ActiveX Componentes fornecidas pelo Internet Explorer 4 ou 5.
Caveat-o código escrito originalmente como seria trabalhar com o Altavista, mas que mudou provavelmente uma dúzia de vezes tão provável como a sua obra como sua chance de bicyling up Mt Everest! Copérnico (www.copernic.com) é um fabuloso (e livre) motor de pesquisa e pesquisador que emitem, upgrades de motores específicos em uma base regular. Se você quiser escrever um, a jogar com Copérnico. Eu taxa que 11 dos 10. (Não tenho nenhuma ligação com outra ou finanicial-lhes que estou muito satisfeito apenas um grande cliente).
Apesar de sons exóticos, um bot (também conhecida como uma aranha, agentes inteligentes, Web robô, crawler, robô, e assim por diante) é simplesmente um programa que visita uma série de sites. Os mais conhecidos são bots, naturalmente, as aranhas utilizado por vários motores de busca para catalogar novos conteúdos. Dê uma olhada na internet e você encontrará muitas referências e informações. Há até um livro sobre o tema, publicado pela Microsoft Press: Programação Robôs, Aranhas e agentes inteligentes no Visual C + +, por David Pallmann (ISBN 0-7356-0565-3). Ela merece ficar se você estiver interessado em escrever bots e você não se importa Wading através de código C + +.Quando você cria um robô, você deve estar ciente de que o seu bot reúne material de sites que lhe visitas maio bem-estar protegido pelo que deve ter cuidado como você usá-lo. Outro aspecto a ter em mente é a seguinte: Se o seu bot visitas a um Web site repetidamente, que poderia perturbar os proprietários do Web site, particularmente se proceder a publicidade paga. Para uma reacção semelhante, basta referir que automaticamente Video Recorders saltar anúncios ou publicidade Tivo para as pessoas. Claro que, se o seu bot faz martelo um determinado site e fica notado, você pode achar que o seu endereço IP não é mais permitido o acesso a esse site (A temida 403!). Nesse caso, uma conta dialup onde o ISP dá-lhe um endereço IP dinâmico é provavelmente uma idéia muito melhor. Vou discutir a Norma de exclusão por robôs mais tarde em relação ao presente.
O grande problema com o seu próprio material bot não está a escrever o código, é quão rápido o seu link Internet é. Crawling de séria, precisa de uma ligação permanente, não dialup!
Navegando programáveis
A Microsoft tornou uma vida muito mais fácil para criadores bot (e criadores de vírus, trojan autores!) Pela sua habitual prática de incluir um casal de navegação objetos ActiveX no Internet Explorer (IE) desde a versão 4. Na verdade este reutilizáveis' motor 'abordagem é para ser admirado, se ela não foi usurpada só tanto! Se você usá-los, eles cuidam de 99 por cento das coisas difíceis como o acesso à Internet, firewall, e usando HTTP para baixar as páginas' HTML. IE tem um monte de funcionalidade incorporada no, e muito do que é acessível. IE 3 teve alguns objetos nele, mas não tenho certeza se estas são usadas da mesma forma.
Se você é um fervoroso IE hater, ter coração! Você não tem que trair seus princípios ou pular este artigo. Quando você usa o IE objetos, você nunca vê-IE é totalmente integrado no Windows.
WebBrowser é o nome do objeto ActiveX do IE. Com o Delphi 3, se tiver IE instalado no seu PC, você deve criar o tipo de unidade de ir à biblioteca Import controles ActiveX no Delphi, selecione Microsoft Internet Controls e clique em instalar. Agora você deve ver TWebBrowser_V1, TWebBrowser, e TShellFolderViewOC sobre o guia sobre a componente ActiveX paleta. Iremos estar usando TWebBrowser. Delphi 4 apresenta um problema devido a mudanças no manuseio ActiveX Delphi versões entre 3 e 4. Um programa que correu bem sob Delphi 3 gera uma EOLESysError em Delphi 4: "CoInitialize não Chamado". A biblioteca de tipos Pascal fonte para o controle agora é o dobro do tamanho em Delphi 5 do que era no Delphi 3. Se você tiver Delphi 4, sugiro que você quer atualizar para Delphi 5 ou encontrar alguém que tenha ele e ver se o Delphi 5 shdocvw.pas funciona para você. Todas as funcionalidades do IE objeto está contido no shdocvw.dll.Se você tem Delphi 5 ou 6, você não precisa fazer isso. TWebBrowser veio substituir a antiga THTML componente e é o último componente sobre Tab da Internet. Também recebe uma demonstração da utilização deste na pasta Demos / Coolstuff, o arquivo de Ajuda e tem algumas coisas sobre TWebBrowser, mas curiosamente, a Borland não tenha acrescentado TWebBrowser_V1 componente, mesmo que ele está no arquivo fonte. Se quiser saber mais sobre como usar TWebBrowser ou TWebBrowser_V1, vá para www.microsoft.com e faça uma busca, ou buscar Delphi 5 para o arquivo de Ajuda!
TWebBrowser é um componente muito fácil de trabalhar. Cerca de metade das propriedades podem ser ignoradas, pois são visíveis para o IE interface para controlar o olhar na tela do IE-como barras ou exibir em tela cheia. A propriedade Visible determina se podemos ver a janela do browser ou não. No final do pedido, o utilizador nunca irá vê-lo, mas ele pode ser útil para depuração.
A maneira mais simples de usar WebBrowser está chamando a Navegue pelo (URL) método, em seguida, a movimentação OnNavigateComplete2 evento e utilizando a propriedade para acessar o documento baixado página. Apesar de existirem dois outros eventos-OnDocumentComplete e-OnDownloadComplete que deverá ajudar a determinar se uma página da Web foi baixado com êxito, achei-a mais fácil de processar tudo, desde o OnNavigateComplete2. Isto só dispara quando o navegador foi movida com sucesso para o URL especificado, mas é confundido por vários quadros, de modo algum cuidado extra tem de ser tomada, como você verá.WebBrowser oferece-lhe várias propriedades que simplificar a tarefa de extrair os dados. Essas propriedades incluem links, âncoras, applets, formulários, frames, folhas de estilo, e mais alguns. O único problema, principalmente quando são utilizados frames, está classificando o debulho do trigo-que os links são válidos, e que poderá ser anúncios ou outros serviços? Nesse caso, a única forma de fazê-lo é fazer a varredura de HTML e extrair a informação relevante. À medida que cada página é baixado, ele pode ser acessado diretamente.
Molduras
Como você poderia saber, muitas SearchEngines não índice frames. Um documento HTML pode consistir em um ou mais quadros. Frame que detém as coisas que você quer? É, geralmente, o primeiro (e muitas vezes apenas) página. A única maneira confiável é a caminhada através de cada página à procura de texto e, em seguida, procurar os cordelinhos para que esta identifique resultados. Um problema muito maior é o desencadeamento de múltiplas as diversas DocumentComplete, DownloadComplete, NavigationComplete e eventos. Muita depuração, cursing, depilação e ocorreu antes de eu percebi o que estava acontecendo. Ignorar DownloadComplete. Em vez disso, use um DocumentComplete ou NavigationComplete. Eu fiz mais algumas experiências e que a melhor forma encontrada foi a de usar um e verifique se o documento foi preparado com VarIsEmpty (fwebbrowser.document). Então tira o frame do browser Documento: = fWebBrowser.Document, contar o número de quadros, índice e através deles. Frame 0 usa o script.top, enquanto outros utilizam os frames frames.Item (índice). Observe o tipo array indexing Basic. A partir da moldura, marque a document.body, e extrair o texto real a partir deste. Estar ciente de que o createTextRange irá causar uma exceção se não houver texto, como em um banner ao objeto, o que justifica o tenta-exceto para apanhá-lo. Neste ponto, temos o código HTML completo, e tudo o que fazemos agora é buscar os resultados e links de navegação a partir dele.
HTML varredura
Quando eu estava testando isso, eu usei a palavra Opções no AltaVista. A página que foi devolvido incluía 85 links de acordo com o WebBrowser links (document.links.Items (Index) propriedade é usada). Destes, apenas 10 são resultados e são um número de anúncios, banners, e coisas assim, assim como os links de navegação. O layout é diferente para cada motor de busca do resultado, HTML e uma análise tornaria objeto uma boa idéia para um futuro artigo. Estou preso com AltaVista, tal como outros mecanismos de busca estabelecer as coisas à sua maneira. Para manter o código curto, eu usei duas seqüências-texto "AltaVista encontrou" e "Páginas de resultados", para marcar o início e fim dos pula o resultado. Todos os URLs (procure por "href =") que ocorrem entre essas duas cordas e não contêm o texto definido em ignorar o texto (como "jump.altavista") são usados.
Programa estrutura
Tudo centers em três componentes: TSearchEngine, TFetchResult, e TResultHandler. Uma lista de TSearchEngines no arranque do programa é construído com cada objeto exploração detalhes necessários para a utilização desse motor e uma instância do objeto WebBrowser. A pesquisa corda é passada para esta lista, e cada componente, em seguida, inicia uma consulta com o seu próprio motor. Resultado links são devolvidos a uma lista central, sendo cuidadosos para serializar acesso a esta lista através de um simples guarda variável (fbusy) para impedir a ocorrência de dois aditamentos lista, ao mesmo tempo. Se houvesse apenas uma operação a ser feito, isso poderia ser evitado, mas eu tenho uma lista bem como pesquisa e isto leva tempo e, portanto, o guarda variável deve ser utilizada.
Para um típico motor de busca como o AltaVista, a consulta é processada por um script cgi-bin chamado query com diversos parâmetros acrescentado algo parecido com isto para a seqüência de pesquisa "pesquisa textos" (aspas incluídas): pg = q & kl = en & q =% 22search texto% 22 & stq = 20, que entendo como pg = q (é uma query), kl = en (idioma é o Inglês), e stq = 20 (resultados começam com o resultado 20a).
A turma tem TSearchEngine métodos PostQuestion, ExtractResultLinks, e NavigateNextResultPage e ajusta o WebBrowser evento manipuladores de agir em conformidade. A maior parte do tempo é gasto a aplicação está fazendo nada mais do que espera para o WebBrowser para acionar os eventos. Tenho estado incluído um mecanismo simples para que os utilizadores desta classe podem determinar o que está acontecendo, e ele é capaz de manter controle sobre o que é suposto estar a fazer.
Para cada ligação resultados encontrados, TFetchResult um componente é criado e adicionado a uma lista de buscas. Cada instância desta classe tem a sua própria componente WebBrowser e código identificador evento. Eu usei uma lista de simplificar monitorando todas as buscas. Eu uso um tempo limite (padrão 240 segundos), ea cada 30 segundos, a lista inteira de buscas é digitalizada e verificada a existência de timeouts. Um temporizador está globais Isqueiro em Windows recursos do que um temporizador para cada objeto. Como também é difícil determinar com exactidão quando uma página foi totalmente descarregado, este tempo limite tidier fornece uma maneira de fazê-lo.
Se buscará um bem-sucedido, o conteúdo do documento HTML são guardados fora resultados para uma pasta. Eu não incluíram os gráficos, a fim de manter o código mais curto. O ficheiro é proveniente do nome fotograma após a remoção inaceitável caracteres.
Paralelismo
Num certo sentido, esta é uma aplicação multithreaded com um grau de paralelismo, apesar de não existirem threads explicitamente utilizado. Cada um dos componentes WebBrowser é utilizada de modo independente, uma em cada TSearchEngine e um em cada TFetchResult. Parece não haver limite para o número de pesquisas paralelas, apesar de globalmente a velocidade é obviamente sujeita à sua largura de banda da ligação à Internet.
Se você estava escrevendo um produto varejo, você provavelmente criar um ficheiro config com alguma forma de definir o formato para cada motor de pesquisa que pode Manusear, bem como a extração dos links resultado. Cada motor de pesquisa produz resultados em diferentes formatos e pode muito bem mudar o formato quando eles gostam.
Também existe a alta probabilidade de que duas ou mais pesquisas vai render o mesmo URL. Já percebi que através de pesquisas em torno da actual lista de buscas. Sugiro uma outra lista, ser utilizadas, pois esta apenas detém actualmente buscas. Antes de tirar os resultados a partir de uma URL em particular, é feita uma busca rápida desta lista para se certificar de que o URL não tenha já sido buscados. Se não tiver, o endereço é adicionado à lista e ir buscar o produto.
Como de costume com os motores de busca, você precisa escolher o seu texto com cuidado para evitar a pesquisa multi-milhões de resultados. Um valor limite embutido em código está definido como 100 para cada TSearchEngine.
Um último ponto: Tenha cuidado com o uso de Application.ProcessMessages ao usar WebBrowser. Eu tenho evitado excepto nos casos em que ela buscas são adicionados, o que se aguarda a resultProcessor está ocupado. Não sei se é a maneira como os eventos são enviados, mas eu achei que o estabelecimento de um rótulo e chamando application.ProcessMessages poderia forçar o mesmo acontecimento se repita. Isso ocorreu mais no depurador, mas se você ficar estranho comportamento, comentário-los para fora.
Caveat
Acho que esse código é um pouco áspero e pronto, mas funciona muito bem. Possivelmente os métodos são menos satisfatórios detectar qual moldura tem texto. Eu achei difícil de trabalhar fora, que não seja através de exceção captura, por isso, se você executá-lo no depurador, esperar um pouco preso exceções. Também não é uma aplicação muito polido, poderia haver uma melhor interface de utilizador, por exemplo. Mas ela faz o que eu destina-se vários paralelos realiza pesquisas e ativos ao mesmo tempo.
Robôs não bem-vindos
A norma tem emergido chamou a Norma de exclusão por robôs, que deveriam usar sites da Web para especificar árvores que não devem ser indexados por aranhas, porque a páginas mudam com freqüência, ou que contenham arquivos executáveis ou não arquivos de texto.
Eu li que as últimas estimativas indicam que existem mais de 800 milhões de páginas Web existentes, e que a maioria dos motores de busca indexada têm menos de metade do total, entre eles. Os maiores motores de busca só têm índices de 150-200 milhões de páginas. Então, qualquer coisa que limita o "ruído" é bem-vinda, e uma maneira de fazer isso é através da presente norma. Basta colocar um arquivo robots.txt na raiz texto-por exemplo, www.altavista.com / robots.txt-como a seguinte:
User-agent: *
Disallow: / cgi-bin
Esta determina que todos os robôs da Web não deve olhar em / cgi-bin. Naturalmente, seus robôs não têm a observarem este entende-se principalmente para a Web aranhas, mas que é ruim maneiras para ignorá-las, e isso faz sentido ir junto com ele a não ser que você realmente precisa ver o que está ali.
Como, você poderia pensar, fazer Web site que os usuários saibam quando um robô tiver visitado eles? Muito simplesmente, ele é o nome do Usuário no cabeçalho passados para o servidor Web. Este é o tipo mais frequente Mozilla, mas talvez fosse Scooter (o AltaVista spider) ou outros. Mozilla (para "Mosaic Killer") era o nome para trabalhar Netscape, IE e também adoptou-a. Poderia ser possível alterar esta situação, no quinto parâmetro da TWebBrowser Navegue método, que detém de cabeçalhos adicionais. Ou você poderia escrever sua própria interface HTTP, em vez de usar o IE e, em seguida, especificar um nome. Tendo em conta que o que estamos fazendo pode não ser muito popular com os motores de busca, provavelmente é muito melhor de fazê-lo por detrás do anonimato de um browser Mozilla! Além disso, você pode querer adicionar um segundo atraso entre 10-jumping páginas. Dessa forma, ele irá, pelo menos, olha como se é um operador humano e não um programa.

Delicious
Digg
Google
Yahoo