这几天我有一个很有趣的需求。有人使用 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中文网其他相关文章!