首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板