首頁 > 後端開發 > Python教學 > 使用 Python 進行網頁抓取:使用 CSV 作為資料庫

使用 Python 進行網頁抓取:使用 CSV 作為資料庫

Mary-Kate Olsen
發布: 2024-12-30 09:09:09
原創
563 人瀏覽過

Webscraping com Python: usando CSV como base de dados

這幾天我有一個很有趣的需求。有人使用 CSV 將資料從一個地方遷移到另一個地方。這些數據是閱讀計畫的圖書註冊。有一次,她對我說:「好吧,現在剩下的工作就是機器人了。我必須得到每本書的ISBN。」正如她所說,這是機器人的工作,那為什麼不讓機器人來做呢?

Sigla para International Standard Book Number. 
登入後複製

一部作品可以有多個 ISBN,發生這種情況是因為各個版本都有自己的 ISBN。在這種情況下,只要媒體相容,任何 ISBN 都可以使用。以下內容已在 CSV 中註冊:
->電子書
->物理
->音頻

讓我們來談談邏輯:
->上傳並開啟 CSV 檔案。
->提取帶有標題的列。
->提取媒體列。
->對於每個標題,請透過 ISBN 在 Google 上搜尋。
->從頁面中提取標題。
->提取 ISBN 清單。
->提取媒體清單。
->檢查註冊媒體並搜尋最近的 ISBN。如果未找到我們的條件,請傳回清單中的第一項。
->告知我們從哪個媒體獲取了 ISBN,以便稍後驗證。

讓我們來看看必要的函式庫:

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
登入後複製

這個書單有超過600個項目,由於我不想被Google屏蔽,所以我們將進行隨機訪問並提供更人性化的空間。我們還將使用標頭來表明我們需要該頁面的瀏覽器版本。為此,請在瀏覽器中前往“網絡”並蒐索“用戶代理”。

要在 Google 上搜索,我們使用以下 URL 模式:

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

請記住,URL 中沒有空格,因此我們將標題中的空格替換為「 」。在 pandas 中,「電子表格」被稱為 DataFrame,並且很常見使用 df 作為縮寫。最後,也許你和我一樣使用的是 Windows,在這種情況下,系統網址列是相對於 Unix 而言的。讓我們編寫一個函數,獲取我們貼上的 URL 並將其反轉為其他格式。

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
登入後複製

好的,一切準備就緒,就等我們測試了!我將留下我收到的範例行,以便您可以測試它。

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)
登入後複製

我希望它對您有用,並且您可以在日常生活中實現一些自動化!

以上是使用 Python 進行網頁抓取:使用 CSV 作為資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板