Executando verificação de segurança...
9

Script para Realizar Pesquisas Simultâneas

Sobre

Trabalho como projetista eletrônico, e uma das minhas funções é fazer a cotação de componentes eletrônicos. Frequentemente, preciso entrar em vários sites para verificar qual oferece o melhor preço, o que torna essa tarefa chata e repetitiva.

Para resolver esse problema, criei um script em Python com Selenium que realiza a pesquisa de um termo em múltiplos sites. Resumidamente o código substitui a url de pesquisa do site para o termo desejado. Fiquei impressionado em como um simples script conseguiu acelerar tanto o meu trabalho.

O link do repositório é: https://github.com/Rodrix-go/PesquisaAutomatica

Vídeo de Exemplo

Watch the video

Carregando publicação patrocinada...
5

Boa, é boa a sensação de resolver nossos problemas e o dos outros com código não é ?
Mas aqui vai uma dica, não use selenium para isso a menos que seja realmente necessário, tente usar a combinação de libs como:
(requests + Bs4) ou (httpx + Bs4) até (aiohttp + Bs4) pode ser muito útil nesse trabalho.
Selenium é mais para testes automatizados onde existe a necessidade de se ter algo visual no browser, nesses caso de extração de dados webscraping, o mais recomendado é não ter selenium como dependência.
No mais parabéns pelo seu trabalho e que continue evoluindo.

2

A sensação é realmente incrível, ainda mais quando consegue afetar outras pessoas...

Que dica valioza, havia utilizado o Selenium por parecer ser mais popular, mas com certeza irei dar uma analisada nessas outras libs

obrigado pelo comentário!!!

1
1

Na verdade o ideal é sempre ir de libs que não utilizem driver de browser, se houver algum código que seja gerado por javascript, uma página com conteúdo dinâmico, aí entra a experiência do dev em analisar as requisições ver se não existe uma api que entrega esses dados que torna o trabalho ainda mais produtivo, caso dê pra replicar a lógica em python isso deve ser feito e em útimo caso, somente em último caso apelar para selenium ou playwright.

2

Só um pequeno detalhe - porque eu sou chato e pedante :-)

Na lista de sites vc fez assim:

site_dict = {
    0: {
        "nome": "Eletrogate",
        "url": "https://www.eletrogate.com/",
        "pesquisar": True,
        "url_pesquisa": "https://www.eletrogate.com/buscar?q=#",
    },
    1: {
        "nome": "Robocore",
        "url": "https://www.robocore.net/",
        "pesquisar": True,
        "url_pesquisa": "https://www.robocore.net/busca/#",
    },
    ...

Ou seja, as chaves do dicionário são números sequenciais começando do zero.

E ao percorrê-los, vc faz:

for id, site_info in site_dict.items():
    ...

Mas dentro do for, o id não é usado para nada.


Isso são fortes indícios de que talvez seja melhor usar uma lista em vez de um dicionário. Ou seja, poderia ser assim:

# Em vez de dicionário, use uma lista de sites
sites = [
    {
        "nome": "Eletrogate",
        "url": "https://www.eletrogate.com/",
        "pesquisar": True,
        "url_pesquisa": "https://www.eletrogate.com/buscar?q=#",
    },
    {
        "nome": "Robocore",
        "url": "https://www.robocore.net/",
        "pesquisar": True,
        "url_pesquisa": "https://www.robocore.net/busca/#",
    },
    # etc...
]

E para percorrê-los:

for site_info in sites:
    if site_info["pesquisar"]:
        # etc...

No caso, também daria para filtrar a lista usando filter, e aí não precisaria do if:

for site_info in filter(lambda s: s['pesquisar'], sites):
    # não precisa mais do if site_info["pesquisar"]
    print("Abrindo site:", site_info["nome"])
    # etc...

Enfim, usando uma lista em vez de um dicionário, vc não precisa se preocupar com a numeração (que nem é usada para nada mesmo).

Mas caso precise do id, dá para obtê-lo com enumerate:

for site_id, site_info in enumerate(filter(lambda s: s['pesquisar'], sites)):
    print(f'id: {site_id} - Abrindo site: {site_info["nome"]}')
    # etc...

Mas se quiser continuar usando o dicionário, dá para fazer o loop apenas pelos valores (já que o id não está sendo usado para nada):

for site_info in site_dict.values():
    # etc...

Mas pelas características do código (índices numéricos sequenciais começando do zero, e que não são usados no loop), eu ainda acho melhor usar uma lista.

Isso facilita até para fazer a manutenção dos sites: sempre que um novo precisar ser adicionado, ou algum do meio for removido, etc, mudar a lista é bem mais simples, pois vc não precisa se preocupar com a numeração. Enfim, neste código específico, não vejo a necessidade de se usar um dicionário.


Por fim, outra dica de lib para webscraping é o Scrapy. E caso a página tenha JavaScript dinâmico, dá para usar juntamente com o Scrapy-Splash.

1

Boa, eu só trocaria o uso direto da chave por um s.get('pesquisar') ,que evita a quebra do código caso não exista a chave, por padrão o valor de retorno é None se não existir.
O mesmo para as chaves dentro do loop:

for site_id, site_info in enumerate(filter(lambda s: s.get('pesquisar'), sites)):
    print(f"id: {site_id} - Abrindo site: {site_info.get('nome']}")
    # etc...