這幾天我有一個很有趣的需求。有人使用 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中文網其他相關文章!