Lädt...


🔧 Webscraping com Python: usando CSV como base de dados


Nachrichtenbereich: 🔧 Programmierung
🔗 Quelle: dev.to

Tive uma demanda bem interessante esses dias. Uma pessoa estava migrando dados de um lugar para o outro, usando CSV. Os dados são cadastros de livros para um projeto de leitura. Certo momento, ela me disse: “bom, agora o resto do trabalho é de robô. Vou ter que pegar o ISBN de cada título.” Como ela mesmo disse, um trabalho de robô, então por que não deixar um robô fazer?

Sigla para International Standard Book Number. 

Uma obra pode ter vários ISBNs, isso acontece porque as edições têm um ISBN próprio. Para esse caso, qualquer ISBN serviria, se for compatível a mídia. No CSV foram cadastrados:
-> ebook
-> fisical
-> audio

Vamos à lógica:
-> Carregar e abrir o arquivo CSV.
-> Extrair a coluna com os títulos.
-> Extrair a coluna das mídias.
-> Para cada títulos, pesquisar no Google pelo ISBN.
-> Extrair da página o título.
-> Extrair uma lista de ISBNs.
-> Extrair uma lista de mídias.
-> Verificar a mídia de cadastro e procurar o ISBN mais próximo, caso nosso critério não seja encontrado, retornar o primeiro item da lista.
-> Informar de qual mídia retiramos o ISBN para conferência posterior.

Vamos as libs necessárias:

import requests # para fazer as requisições
from bs4 import BeautifulSoup # para manipular o html recebido
import pandas as pd # para manipular os arquivos CSV
import time
import random # as duas são para gerarmos intervalos aleatórios de acesso

Essa lista de livros tem mais de 600 itens, e como não quero ser bloqueado pelo Google, vamos fazer acessos aleatórios e com espaço mais humano. Também vamos usar um header para informar que queremos a versão de navegador a página. Para isso, vá em “rede” no seu navegador e procure por "User-Agent".

Para fazer buscas no Google, usamos o seguinte padrão de URL:

url_base = "https://www.google.com/search?q=isbn" # o que vem depois '=' é a pesquisa

Lembrando que URLs não tem espaço, por isso vamos substituir os espaços nos títulos por “+”. No pandas, as “planilhas” são chamadas de DataFrame e é bem comum que se use df como abreviação. Por último, talvez você esteja no Windows como eu, neste caso, as barras de endereço de sistema são investidas com relação ao Unix. Vamos escrever uma função que pega a URL que colarmos e inverta para o outro formato.

path = r"C:\caminho\livros.csv"

def invert_url_pattern(url):
    return url.replace("\\","/")

path = invert_url_pattern(path)

def search_book(path):
    url_base = "https://www.google.com/search?q=isbn"
    headers = {
    "User-Agent":"seu pc"
    }
    
    df = pd.read_csv(path, encoding='utf-8')
    books = df["Name"].tolist()
    media = df["media"].tolist()
    # vamos colocar as pesquisas aqui e depois inserir todas no DataFrame
    title_books = []
    isbn_books = []
    media_books = []  

    for index, book in enumerate(books):
        time.sleep(random.uniform(60, 90))
        
        url = url_base + "+" + book.replace(" ", "+")
        req = requests.get(url, headers=headers)

        site = BeautifulSoup(req.text, "html.parser")
        #usamos as class para buscar o conteúdo
        title = site.find("span", class_="Wkr6U")
        isbns = site.find_all("div", class_="bVj5Zb")
        medias = site.find_all("div", class_="TCYkdd")
        #se algo falhar, retornamos uma string vazia
        if(title.text == None):
            title_books.append("")
            isbn_books.append("")
            media_books.append("")
            continue

        # No loop, o último item acessado será o mais recente, 
        # pois percorremos a lista de cima para baixo. 
        # Por isso, invertendo a lista de ISBNs, garantimos que 
        # o mais novo de cada categoria seja processado por último.

        isbns = isbns[::-1]
        unified_data = {}

        for i in range(len(medias)):
            unified_data[medias[i].text] = isbns[i].text

        match media[index]:
            case "ebook":
                isbn_books.append(unified_data["Livro digital"])
                media_books.append("Livro digital")
            case "fisical":
                isbn_books.append(unified_data["Livro capa dura"])
                media_books.append("Livro capa dura")
            case "audio":
                isbn_books.append(unified_data["Audiolivro"])
                media_books.append("Audiolivro")
            case _:
                isbn_books.append(unified_data[0])
                media_books.append("")

        title_books.append(title.text)

    df["Titulo do Livro"] = title_books
    df["ISBN"] = isbn_books
    df["Tipo de Livro"] = media_books

    return df

Beleza, tudo pronto para testarmos! Vou deixar uma linha de exemplo do que recebi para você poder testar aí.

Name language media
this other eden 🇬🇧 english audio
df = search_book(path)

df.to_csv(invert_url_pattern("C:seu\caminho\para\salvar\nome_do_arquivo.csv"), encoding='utf-8', index=False)

Espero que tenha sido útil para você, e que possa automatizar algo do seu dia-a-dia!

...

🔧 Webscraping com Python: usando CSV como base de dados


📈 99.88 Punkte
🔧 Programmierung

🔧 Webscraping com Python: usando CSV como base de dados


📈 99.88 Punkte
🔧 Programmierung

🔧 Como exportar um CSV com dados dos meus posts no DEV.to usando sua API


📈 55.7 Punkte
🔧 Programmierung

🔧 Como criei um dashboard estratégico com Streamlit usando dados do Jira (sendo Product Owner)


📈 44.43 Punkte
🔧 Programmierung

🔧 🌟 Python na Ciência de Dados e Visão Computacional: Desvendando o Poder dos Dados 🌟


📈 38.6 Punkte
🔧 Programmierung

🔧 Como abstrair a conexão com base de dados em Golang?


📈 37.61 Punkte
🔧 Programmierung

🔧 Localización en ASP.NET Core: Cómo Implementar Traducciones Dinámicas Usando una Base de Datos


📈 37.47 Punkte
🔧 Programmierung

🔧 Webscraping Using Python


📈 34.37 Punkte
🔧 Programmierung

🔧 Python V.S. Javascript: Which is Better for Webscraping?


📈 34.37 Punkte
🔧 Programmierung

🕵️ Lenovo XClarity Administrator up to 2.4.x CSV CSV File CSV Injection privilege escalation


📈 33.81 Punkte
🕵️ Sicherheitslücken

🔧 Usando helm-secrets e Vals para anonimizar seus dados no deploy!


📈 33.38 Punkte
🔧 Programmierung

🔧 🐍Como Importar Dados do Excel para SQLite com Python em Poucas Linhas


📈 32.88 Punkte
🔧 Programmierung

🔧 Cómo crear un Wallpaper dinámico con la Hora y Fecha usando Python


📈 32.74 Punkte
🔧 Programmierung

🔧 Como enviar logs para o AWS CloudWatch usando Python


📈 32.74 Punkte
🔧 Programmierung

🎥 An ever-growing customer base (aka: fan base) base means your email template game needs to be strong


📈 29.41 Punkte
🎥 Video | Youtube

🕵️ (AVOID WEBSCRAPING) How to reverse firestore API used by a site?


📈 29.3 Punkte
🕵️ Reverse Engineering

📰 heise+ | Windows 10: Webscraping mit Power Automate Desktop automatisieren


📈 29.3 Punkte
📰 IT Nachrichten

🔧 Desvendando os Tipos de Dados SQL: Como Escolher o Melhor para Cada Situação


📈 27.81 Punkte
🔧 Programmierung

🔧 Consulta WHOIS: Como descobrir os dados do dono de um domínio


📈 27.81 Punkte
🔧 Programmierung

🔧 Como Conectar ao Azure Table Storage e Manipular Dados com PySpark


📈 27.81 Punkte
🔧 Programmierung

🔧 SQL Server + Docker Compose: como criar e popular bancos de dados ao inicializar os containers


📈 27.81 Punkte
🔧 Programmierung

🔧 Transformando a Maneira como Interagimos com Arquivos e Dados com ChatGPT


📈 27.81 Punkte
🔧 Programmierung

🔧 Como normalizar banco de dados?


📈 27.81 Punkte
🔧 Programmierung

🔧 A Ciência de Dados como é Hoje


📈 27.81 Punkte
🔧 Programmierung

🔧 Como adicionar banco de dados em uma aplicação .NET 7 [PT-BR]


📈 27.81 Punkte
🔧 Programmierung

🔧 Como mascarar dados sensíveis na pipeline utilizando Cypress


📈 27.81 Punkte
🔧 Programmierung

🔧 Por que e como rodar bancos de dados em diferentes nuvens?


📈 27.81 Punkte
🔧 Programmierung

🔧 Como criar um projeto iniciante em análise de dados


📈 27.81 Punkte
🔧 Programmierung

🔧 Entendendo props e useState no React: Como Passar e Gerenciar Dados Entre Componentes


📈 27.81 Punkte
🔧 Programmierung

matomo