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!
Top comments (0)