J'ai eu une demande très intéressante ces jours-ci. Une personne migreait des données d'un endroit à un autre à l'aide de CSV. Les données sont des inscriptions de livres pour un projet de lecture. À un moment donné, elle m’a dit : « bon, maintenant le reste du travail, c’est pour le robot. Je devrai obtenir l’ISBN de chaque titre. Comme elle l'a dit, c'est le travail d'un robot, alors pourquoi ne pas laisser un robot le faire ?
Sigla para International Standard Book Number.Copier après la connexion
Une œuvre peut avoir plusieurs ISBN, cela arrive car les éditions ont leur propre ISBN. Dans ce cas, n’importe quel ISBN fonctionnerait, si le support est compatible. Les éléments suivants ont été enregistrés dans le CSV :
-> ebook
-> physique
-> audio
Passons à la logique :
-> Téléchargez et ouvrez le fichier CSV.
-> Extrayez la colonne avec les titres.
-> Extrayez la colonne média.
-> Pour chaque titre, recherchez sur Google par ISBN.
-> Extrayez le titre de la page.
-> Extrayez une liste d'ISBN.
-> Extrayez une liste de médias.
-> Vérifiez les supports d'inscription et recherchez l'ISBN le plus proche. Si nos critères ne sont pas trouvés, renvoyez le premier élément de la liste.
-> Indiquez de quel média nous avons extrait l'ISBN pour une vérification ultérieure.
Regardons les bibliothèques nécessaires :
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
Cette liste de livres compte plus de 600 éléments, et comme je ne veux pas être bloqué par Google, nous allons faire des accès aléatoires et avec un espace plus humain. Nous utiliserons également un en-tête pour indiquer que nous voulons la version navigateur de la page. Pour cela, allez dans « réseau » dans votre navigateur et recherchez « User-Agent ».
Pour effectuer une recherche sur Google, nous utilisons le modèle d'URL suivant :
url_base = "https://www.google.com/search?q=isbn" # o que vem depois '=' é a pesquisa
N'oubliez pas que les URL n'ont pas d'espaces, nous remplacerons donc les espaces dans les titres par « ». Chez les pandas, les « feuilles de calcul » s'appellent DataFrame et il est très courant d'utiliser df comme abréviation. Enfin, peut-être que vous êtes sous Windows comme moi, auquel cas les barres d'adresse système sont investies par rapport à Unix. Écrivons une fonction qui prend l'URL que nous collons et l'inverse dans l'autre format.
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
D'accord, tout est prêt pour que nous puissions tester ! Je vous laisse un exemple de ligne de ce que j'ai reçu pour que vous puissiez le tester.
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)
J'espère que cela vous a été utile et que vous pourrez automatiser quelque chose dans votre vie de tous les jours !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!