Maison > développement back-end > Tutoriel Python > Webscraping avec Python : utiliser CSV comme base de données

Webscraping avec Python : utiliser CSV comme base de données

Mary-Kate Olsen
Libérer: 2024-12-30 09:09:09
original
563 Les gens l'ont consulté

Webscraping com Python: usando CSV como base de dados

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal